HexThrees adalah game pertama saya yang selesai

Halo, Habr! Pada suatu waktu artikel "ini adalah permainan pertama saya" sangat populer di sini. Baru-baru ini, saya belum melihat mereka, jadi saya memutuskan untuk mengisi celah ini sendiri.





Sejarah penciptaan dan gameplay

Saya ingin membuat game yang dibuat secara mandiri dari awal hingga akhir untuk waktu yang lama - saya mulai kembali pada tahun 2012 dengan penembak top-down di java untuk android. Setelah segera menyadari bahwa tidak mungkin untuk melakukannya sendiri, setelah beberapa tahun saya beralih ke strategi miniatur di C ++. Setelah sekitar satu tahun, minat padanya juga menghilang, dan meskipun kadang-kadang saya kembali ke proyek ini, saya dengan serius menyadari bahwa saya tidak akan pernah menyelesaikannya. Dan kemudian saya membaca banyak artikel untuk pendatang baru di gamedev dan memutuskan untuk mengambil jalan yang paling tidak tahan: dengan cepat mengkloning sesuatu yang diketahui. Hanya jalan seperti itu yang pada akhirnya akan memungkinkan untuk membawa setidaknya sesuatu ke akhir yang logis.





Game Threes diambil sebagai dasar, atau lebih tepatnya, tiruannya 2048, di mana saya kemudian sangat terjebak. Sebagai fitur asli, diputuskan untuk membuat bidang tidak persegi, tetapi heksagonal. Dan juga dengan kemampuan untuk memilih ukurannya. Dan untuk membuatnya benar-benar tidak seperti Threes atau 2048, buat prinsip penggabungan sel menjadi dinamis - pengguna bebas memilih apakah dia suka mengemudi tiga kali lipat atau dua pangkat dua.





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





Dan hasil yang paling penting adalah sekarang saya akhirnya memiliki permainan yang secara pribadi saya tertarik naik kereta dalam perjalanan pulang kerja. Sangat disayangkan, saya telah bekerja dari rumah selama setahun sekarang.





Tautkan ke GitHub








All Articles