HexThrees ist mein erstes Spiel beendet

Hallo Habr! Zu einer Zeit waren die Artikel "Hier ist mein erstes Spiel" hier sehr beliebt. Vor kurzem habe ich sie nicht gesehen, deshalb habe ich beschlossen, diese Lücke selbst zu füllen.





Schöpfungsgeschichte und Gameplay

Ich wollte ein Spiel machen, das lange Zeit unabhängig von Anfang bis Ende erstellt wurde - ich habe 2012 mit einem Top-Down-Shooter auf Java für Android angefangen. Nachdem ich schnell erkannt hatte, dass es unmöglich war, es alleine zu ziehen, wechselte ich nach ein paar Jahren zu einer Miniaturstrategie in C ++. Nach ungefähr einem Jahr verschwand auch das Interesse an ihr, und obwohl ich manchmal zu diesen Projekten zurückkehrte, wurde mir ernsthaft klar, dass ich sie niemals beenden würde. Und dann las ich viele Artikel für Neulinge in Gamedev und beschloss, den Weg des geringsten Widerstands zu beschreiten: schnell etwas Bekanntes zu klonen. Nur ein solcher Weg würde es endlich ermöglichen, zumindest etwas zu einem logischen Ende zu bringen.





Das Spiel Threes wurde als Grundlage genommen, oder besser gesagt, sein Klon 2048, in dem ich damals sehr feststeckte. Als ursprüngliches Merkmal wurde beschlossen, das Feld nicht quadratisch, sondern sechseckig zu machen. Und auch mit der Möglichkeit, seine Größe zu wählen. Und um es völlig anders zu machen als Threes oder 2048, machen Sie das Prinzip der Kombination von Zellen dynamisch - der Benutzer kann frei wählen, ob er Dreifach- oder Zweierpotenzen fahren möchte.





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





Und das wichtigste Ergebnis ist, dass ich jetzt endlich ein Spiel habe, das mich persönlich interessiert, auf dem Heimweg von der Arbeit in den Zug zu steigen. Schade, ich arbeite jetzt seit einem Jahr von zu Hause aus.





Link zu GitHub








All Articles