Grałem szybko i próbowałem stworzyć grę opartą na kafelkach z przewijanym widokiem, więc gracz jest w centrum. Mam menedżera, który ma go do roboty, ale wydaje mi się, że przerysowuję wszystkie węzły nad tym, co jest obecnie, więc po kilku ruchach mam ponad 1000 węzłów, a gra się zatrzymuje. Zgaduję, że muszę usunąć wszystkie stare węzły przed rysowaniem nowych? Spojrzałem na to, jak to zrobić, na przykład usuwając dzieci, ale w końcu nie mam nic po narysowaniu.Podstawowa gra szybka/spritekit - problemy z przerysowaniem
Dołączyłem części, które są połączone z rysunkiem ikonki poniżej.
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
}
}
to co używam do rysowania płytek wokół odtwarzacza, a następnie poniżej jeśli co używam, aby zmienić pozycję gracza, a następnie wywołać funkcję placeAllTiles2D() do przerysowywania na podstawie nowej pozycji .
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()
}
}
Każda pomoc będzie bardzo ceniona. Proszę, bądźcie łagodni, to moja pierwsza wizyta we wszystkim, co szybkie!
Jeśli będziesz tworzyć tylko nowe duszki, to tak, ostatecznie osiągniesz pułap wydajności. Usuń niepotrzebne sprite'y razem z tworzeniem nowych lub po prostu przesuń/dostosuj je zamiast tworzyć nowe. – courteouselk
@AntonBronnikov dziękuję za odpowiedź, wydaje się być na tyle fair, że muszę usunąć stare sprite'y, po prostu zastanawiam się, jak to zrobić, jeśli zrobię coś takiego jak self.removeAllChildren() – James
Przed umieszczeniem nowych duszków, a następnie po przeniesieniu niczego jest rysowany po uruchomieniu aplikacji – James