HexThrees es mi primer juego terminado

¡Hola, Habr! Hubo un tiempo en que los artículos "aquí está mi primer juego" fueron muy populares aquí. Recientemente, no los he visto, así que decidí llenar este vacío yo mismo.





Historia de creación y jugabilidad

Quería hacer un juego creado de forma independiente de principio a fin durante mucho tiempo; comencé en 2012 con un juego de disparos de arriba hacia abajo en Java para Android. Sin darme cuenta rápidamente de que es imposible hacerlo solo, después de un par de años cambié a una estrategia en miniatura en C ++. Después de aproximadamente un año, el interés por ella también desapareció, y aunque a veces volvía a estos proyectos, me di cuenta seriamente de que nunca los terminaría. Y luego leí muchos artículos para los recién llegados a gamedev y decidí tomar el camino de menor resistencia: clonar rápidamente algo conocido. Sólo un camino así permitiría por fin llevar al menos algo a su final lógico.





El juego Threes se tomó como base, o mejor dicho, su clon 2048, en el que luego me metí muy fuerte. Como característica original, se decidió hacer el campo no cuadrado, sino hexagonal. Y también con la posibilidad de elegir su tamaño. Y para que sea completamente diferente a Threes o 2048, haga que el principio de combinación de celdas sea dinámico: el usuario es libre de elegir si le gusta conducir triples o potencias de dos.





, , , . : 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" .





Y el resultado más importante es que ahora finalmente tengo un juego que personalmente me gustaría jugar en el tren de camino a casa desde el trabajo. Es una pena, ya llevo un año trabajando desde casa.





Enlace a GitHub








All Articles