Ho giocato con swift e ho cercato di creare un gioco basato su tessere con una visualizzazione a scorrimento in modo che il giocatore sia centrale. Ho un manager per farlo funzionare, ma mi sembra di voler ridisegnare tutti i nodi in cima a ciò che è attualmente lì, quindi dopo alcune mosse ho 1000 nodi e il gioco si ferma. Immagino di dover rimuovere tutti i vecchi nodi prima di disegnarne di nuovi? Ho dato un'occhiata ai modi per farlo, come rimuovere i bambini, ma poi finisco con niente disegnato dopo lo spostamento.Gioco base swift/spritekit - problemi di ridisegno
Ho incluso le parti che sono collegate al disegno dello sprite qui sotto.
func placeTile2D(tile:Tile, direction:Direction, position:CGPoint) {
let tileSprite = SKSpriteNode(imageNamed: textureImage(tile, direction: direction, action: Action.Idle))
if (tile == hero.tile) {
hero.tileSprite2D = tileSprite
hero.tileSprite2D.zPosition = 1
}
tileSprite.position = position
tileSprite.anchorPoint = CGPoint(x:0,y:0)
view2D.addChild(tileSprite)
}
func placeAllTiles2D() {
let playerPosCur = playerPosition
let playerPCX: Int = (Int(playerPosCur.x))
let playerPCY: Int = (-Int(playerPosCur.y))
var w = 1
var h = 1
for i in (playerPCY - 4) ..< (playerPCY + 4){
let row = tiles[i];
w = 1
for j in playerPCX - 4 ..< playerPCX + 4 {
let tile = Tile(rawValue: row[j].0)!
let direction = Direction(rawValue: row[j].1)!
let point = CGPoint(x: (w*tileSize.width), y: -(h*tileSize.height))
if w == 5 {
if h == 5 {
self.placeTile2D(Tile.Player, direction: .n, position: point)
}
}
w = w + 1
placeTile2D(tile, direction : direction, position : point)
}
h = h + 1
}
}
è quello che sto usando per disegnare le piastrelle intorno al giocatore, e quindi al di sotto se quello che sto usando per cambiare la posizione del giocatore e quindi chiamare la funzione placeAllTiles2D() per ridisegnare in base alla nuova posizione .
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first {
let location = touch.locationInNode(view2D)
let touchPos2D = location
let moveXR = CGPoint(x:1,y:0)
let moveXL = CGPoint(x:-1,y:0)
let moveYU = CGPoint(x:0,y:1)
let moveYD = CGPoint(x:0,y:-1)
let beforeMove = playerPosition
var afterMove = CGPoint(x:0,y:0)
if touchPos2D.x > self.size.width*3/4 {
//Move player to right
afterMove = beforeMove + moveXR
}
if touchPos2D.x < self.size.width*1/4 {
//Move Player to left
afterMove = beforeMove + moveXL
}
if touchPos2D.y > -self.size.height/2 {
if touchPos2D.x < self.size.width*3/4 && touchPos2D.x > self.size.width*1/4 {
//Move PLayer Up
afterMove = beforeMove + moveYU
}
}
if touchPos2D.y < -self.size.height/2 {
if touchPos2D.x < self.size.width*3/4 && touchPos2D.x > self.size.width*1/4 {
//Move Player Down
afterMove = beforeMove + moveYD
}
}
playerPosition = afterMove
placeAllTiles2D()
}
}
Qualsiasi aiuto sarebbe davvero molto apprezzato. Si prega di essere gentile, è il mio primo tentativo di fare qualcosa di veloce!
Se continui a creare solo nuovi sprites allora sì alla fine otterrai il massimo delle prestazioni. Eliminare gli sprite non necessari e crearne di nuovi, o semplicemente spostarli/regolarli invece di crearne di nuovi. – courteouselk
@AntonBronnikov grazie per la risposta, sembra abbastanza giusto che ho bisogno di eliminare i vecchi sprite, mi sto solo chiedendo come fare questo, se faccio qualcosa come self.removeAllChildren() – James
Prima di posizionare i nuovi sprite, quindi dopo aver spostato nulla viene disegnato quando eseguo l'app – James