こんにちは、Habr!かつて、「これが私の最初のゲームです」という記事がここで非常に人気がありました。最近は見たことがないので、自分でこのギャップを埋めることにしました。
作成とゲームプレイの歴史
私は長い間、最初から最後まで独立して作成されたゲームを作りたかったのです。私は2012年に、Java forandroidのトップダウンシューティングゲームから始めました。それを単独で引き出すことは不可能であることにすぐに気づき、数年後、私はC ++のミニチュア戦略に切り替えました。一年ほど経つと、彼女への興味もなくなり、時々戻ってきたのですが、絶対に終わらないことに真剣に気づきました。そして、gamedevの初心者向けの記事をたくさん読んで、抵抗が最も少ない道を選ぶことにしました。既知のものをすばやく複製します。そのような道だけが、ついに少なくとも何かを論理的な終わりに導くことを可能にするでしょう。
ゲームThreesは、ベースとして、またはむしろそのクローン2048として採用され、その後、私は非常に立ち往生しました。本来の特徴として、フィールドを正方形ではなく六角形にすることにしました。また、そのサイズを選択する機能も備えています。そして、Threesや2048とは完全に異なるようにするには、セルを動的に組み合わせるという原則を作成します。ユーザーは、トリプルまたは2の累乗を駆動するのが好きかどうかを自由に選択できます。
, , , . : 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" .
そして、最も重要な結果は、仕事から帰る途中で電車に乗ることに個人的に興味を持っているゲームがついにできたことです。残念ですが、私は自宅で1年間働いています。