HexThrees é meu primeiro jogo terminado

Olá, Habr! Houve um tempo em que os artigos "aqui está meu primeiro jogo" eram muito populares aqui. Recentemente, não os vi, então decidi preencher essa lacuna sozinho.





História da criação e jogabilidade

Há muito tempo eu queria fazer um jogo criado de forma independente do início ao fim - comecei em 2012 com um jogo de tiro de cima para baixo em java para Android. Tendo percebido rapidamente que era impossível fazer isso sozinho, depois de alguns anos, mudei para uma estratégia em miniatura em C ++. Depois de mais ou menos um ano, o interesse por ela também desapareceu e, embora às vezes eu voltasse a esses projetos, percebi seriamente que nunca os terminaria. E então li muitos artigos para iniciantes no gamedev e decidi seguir o caminho de menor resistência: clonar rapidamente algo conhecido. Somente tal caminho permitiria finalmente trazer pelo menos algo para um fim lógico.





O jogo Threes foi tomado como base, ou melhor, seu clone 2048, no qual eu estava então muito preso. Como característica original, foi decidido fazer o campo não quadrado, mas hexagonal. E também com a possibilidade de escolher seu tamanho. E para torná-lo completamente diferente de Threes ou 2048, torne o princípio de combinação de células dinâmico - o usuário é livre para escolher se gosta de dirigir triplos ou potências de dois.





, , , . : 33, 77 (, , , , ). , scrum- . : 1, 2, 3, 5, 8 ( , ).





" !", , . : 1 "" 2, . 8 , .





, . ", ?" - . .





, ? , ! , ( ). , . : , , . , , . , , .





, . , Model - ViewController - Command, , - , . , . swift C# . , , , , , , . , Swift , , , .





, . , , motion blur, haptic feedback, , , , , ( ), app store , -, ffmpeg' , privacy policy, , - , -, , . , 238 . , , .





, ( , ). , . , .





- , .





, , .





, , qBasic. : , , - . , , . , . : XUp, XDown, YUp, YDown, Left and Right, , . :





class BaseCellsIterator {
    internal var line = LineCellsContainer() //  

    internal var x: Int = 0     
    internal var y: Int = 0

    internal var w: Int { self.gameModel.field.width } //  
    internal var h: Int { self.gameModel.field.height } //  
}

class MoveXDownIterator: BaseCellsIterator, CellsIterator {
    
  	func next() -> LineCellsContainer? {
        line.clear() //  

        if x >= w { //    ""  ,  
            x = 0
            y += 1
        }

        if y >= h { //   ""  ,  ,  
            return nil
        }

        //       for(; x <= w; x++)  ""  
        for _ in x ..< w {
            defer { x += 1 } 

            guard let cell = getCell(x, y), 
                !cell.isBlocked,
                !cell.isBlockedFromSwipe
            else { break } //   ,      

            line.add(cell)
        }

        return line
    }
}
      
      



"", . , .





. , - , . , , - ( , placeholder'). , , , . .





- , - . , SpriteKit , , , , . SKNode , ( - , - , ), :





    public func renderNode(node: SKNode, filename: String) throws {
        let destinationURL = URL(fileURLWithPath: filename, isDirectory: false) as CFURL

        guard let texture = view.texture(from: node) else { throw ImageGeneratorError.textureRenderFailed }

        let image = texture.cgImage()
//   "public.png"   Uniform Type Identifier, , ,     . 
        guard let destination = CGImageDestinationCreateWithURL(destinationURL, "public.png" as CFString, 1, nil) else { throw ImageGeneratorError.destinationCreationFailed }

        let imageProperties = [kCGImageDestinationLossyCompressionQuality as String: 0.8]

        CGImageDestinationAddImage(destination, image,imageProperties as CFDictionary)
        let result = CGImageDestinationFinalize(destination)

        let date = Date()
        let calendar = Calendar.current
        let hour = calendar.component(.hour, from: date)
        let minutes = calendar.component(.minute, from: date)
        let time = "\(hour):\(minutes)"

        print(result
            ? "\(filename) rendered successfully at \(time)"
            : "\(filename) render FAILED at \(time)")
    }

      
      



: , - , . , .





- - App Store, , . - 37 , 6 . . -, .





, , , - , , - - . , , . - , - . .





:





  • .





  • . , Swift #8/9.





  • . , , . (" ") .





  • , full-stack , ios-. , , , " .net, Swift" .





E o resultado mais importante é que agora finalmente tenho um jogo que, pessoalmente, estou interessado em pegar o trem no caminho do trabalho para casa. É uma pena, trabalho de casa há um ano.





Link para GitHub








All Articles