Zacząłem robić mały projekt typu "szybka/spritekit", aby nauczyć się gry na urządzenia. Zaczyna się od mapy izometrycznej, którą udało mi się narysować. Mam problem z uzyskaniem precyzyjnego położenia dotykowego na różnych kafelkach mapy. Działa, ale jest nieco nie na miejscu i nie wydaje się być spójny.Lokalizacja dotykowa mapy izometrycznej Swift Spritekit
Oto moje funkcje:
class PlayScene: SKScene {
let map = SKNode()
override func didMoveToView(view: SKView) {
let origin = view.frame.origin
let mapOrigin = CGPointMake(origin.x + self.frame.width/4, origin.y - self.frame.height/4)
let mapConfig: Int[][] =
[[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[2, 2, 2, 2, 1, 2, 2, 2],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0]]
drawMap(mapConfig, mapOrigin: mapOrigin)
}
Z:
func drawMap(mapConfig:Int[][], mapOrigin:CGPoint)
{
let tileHeight:CGFloat = 25.5
let numColumns:Int = 8
let numRows:Int = 8
var position = mapOrigin
var column: Int = 0
var row: Int = 0
for column = 0; column < numColumns; column++
{
for row = 0; row < numRows; row++
{
position.x = mapOrigin.x + CGFloat(column) * tileHeight
position.y = mapOrigin.y + CGFloat(row) * tileHeight
let isoPosition = twoDToIso(position)
placeTile(isoPosition, mapConfig: mapConfig[row][column])
}
}
self.addChild(map)
}
func placeTile(position:CGPoint, mapConfig:Int)
{
switch mapConfig
{
case 0:
let sprite = SKSpriteNode(imageNamed:"grassTile")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
case 1:
let sprite = SKSpriteNode(imageNamed:"roadTile")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
default:
let sprite = SKSpriteNode(imageNamed:"roadTileLTR")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
}
}
a następnie chcę, aby ukryć płytki dotykam (do testowania):
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
for touch: AnyObject in touches
{
let locationNode = touch.locationInNode(self)
nodeAtPoint(locationNode).hidden = true
}
}
Ale to robi nie zawsze ukrywam właściwą płytkę. Jak mam sobie z tym poradzić? Czy mój kod jest całkowicie błędny (możliwy)? Czy muszę w jakiś sposób przekonwertować lokalizację na współrzędne iso? Lub zabawić się z maską bitmask?
Dzięki za pomoc w każdym przypadku!
Wielkiej, dzięki. Spróbuję tego wkrótce i jeśli uda mi się to wypracować, opublikuję odpowiednik Swift. –
Odkąd to opublikowałem, zacząłem uczyć się Swift. Uaktualniłem swoją odpowiedź;) Napisałem to z pamięci i nie mogę tego teraz przetestować, więc mogą wystąpić błędy – Heyfara