Hızla dolaşıyorum ve oyuncu merkezi olması için kaydırma görünümü ile karo tabanlı bir oyun yapmaya çalışıyorum. Çalışmak için yöneticim var, ama şu anda orada olan tüm düğümleri yeniden çiziyor gibi görünüyorum, bu yüzden birkaç hamle yaptıktan sonra 1000+ düğümüm var ve oyun durma noktasına geliyor. Sanırım yenilerini çizmeden önce tüm eski düğümleri kaldırmam gerekiyor mu? Bunu yapmanın bir yolunu gördüm, çocukları kaldırmak gibi, ama sonra hareket ettikten sonra çizilen hiçbir şeyle sonuçlanmam.Temel swift/spritekit oyunu - sorun giderme
Aşağıdaki hareketli çizimine bağlı parçaları dahil ettik.
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
}
}
Ben oynatıcının etrafında fayans çizmek kullanıyorum, sonra placeAllTiles2D() işlevini oyuncu konumunu değiştirmek ve sonra aramaya kullanıyorum ne olur altına yeni konumuna dayalı redraw'ı ne olduğunu .
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()
}
}
Herhangi bir yardım gerçekten çok takdir edilecektir. Lütfen nazik ol, hızlı bir şekilde ilk seferde!
Sadece yeni sprite oluşturmaya devam ederseniz, o zaman evet, performans tavanına vuracaksınız. Gereksiz sprite'ları yenilerini oluşturmakla birlikte silin ya da sadece yenilerini oluşturmak yerine hareket ettirin/ayarlayın. – courteouselk
@AntonBronnikov cevabınız için teşekkürler, eski sprite'ları silmem gerekecek kadar adil gözüküyor, sadece bunu nasıl yapacağımı merak ediyorum, eğer bir şey yaparsam, self.removeAllChildren() – James
Yeni spritelar yerleştirmeden önce Ben app – James