gpt4 book ai didi

swift - SpriteKit - 除了底部和顶部之外的所有侧面的边框

转载 作者:行者123 更新时间:2023-11-30 12:20:20 24 4
gpt4 key购买 nike

我有一个主要玩家节点和随机掉落的敌人,但其中一部分在框架之外,我想让它们(和玩家)无法离开框架、左右边界。我怎样才能实现这一目标?

感谢您的时间和精力:)

这是我的敌人线,不知道这有什么帮助,但就在这里,这样我就不会因为“太宽泛”而被举报

 func launchEnemy() {

let randomX = arc4random_uniform( UInt32(screenWidth))

EnemyMissile.position = CGPoint( x: CGFloat(randomX) - (screenWidth / 2), y: screenHeight + 50)


let action = SKAction.move(by: CGVector(dx: 0, dy: -400 + speedScore), duration: 5.0)


EnemyMissile.run(SKAction.repeatForever(action))

increaseSpeed()


self.run(action, withKey:"LaunchEnemyAction")
}

这是我的EnemyClass

     import Foundation
import SpriteKit

class EnemyClass: SKNode {

var EnemyNode:SKSpriteNode = SKSpriteNode()

var hitsToKill:Int = 2
var hitCount:Int = 0
var damagePoints: Int = 2

//var missileAnimation:SKAction?

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) had not been implemented")

}

override init () {

super.init()

}



func createEnemy ( _ theImage:String) {


EnemyNode = SKSpriteNode(imageNamed: theImage)
self.addChild(EnemyNode)

let body:SKPhysicsBody = SKPhysicsBody(circleOfRadius: EnemyNode.size.width / 2.25, center:CGPoint(x: 0,y: 0))
body.isDynamic = true
body.affectedByGravity = false
body.allowsRotation = false


body.categoryBitMask = BodyType.enemy.rawValue
body.contactTestBitMask = BodyType.bullet.rawValue | BodyType.player.rawValue


self.physicsBody = body

self.name = "EnemyClass"

}

func destroy() {
self.removeFromParent()
self.name = "removeNode"
}
func hit() -> Bool {

hitCount += 1

if ( hitCount == hitsToKill) {

destroy()
return true

} else {
damagePoints = 4

EnemyNode.removeAction(forKey: "animation")
return false
}

}

}

最佳答案

基本上你有两个问题:

  1. 你的生成点很困惑
  2. 你没有任何界限

您有几种设置边界的选项,一个是物理主体,另一个是keepInBounds()方法等。下面我应该一个简单的保持边界方法:

class GameScene: SKScene {

func spawnEnemy() {
let offset = CGFloat(5) // pixels, so enemy will have some spacing between borders.

let enemy = SKSpriteNode(color: .blue, size: CGSize(width: 50, height: 100))
enemy.name = "enemy"
addChild(enemy)

var randomX = CGFloat(arc4random_uniform(UInt32(self.size.width))) // This is not a perfect rando algo.

// Because our random x was from 0 through screenwidth, but .position works
// on -halfWidth through +halfWidth
randomX -= (self.frame.size.width / 2)

// Because spawning on the border will mean that the enemy is HALF out of view:
/*

right border: |
enemy @ frame.maxX: x
- offset: x|
- size.w/2 x |
*/
if randomX > self.frame.maxX - offset - (enemy.size.width / 2) {
randomX = self.frame.maxX - offset - (enemy.size.width / 2)
}
else if randomX < self.frame.minX + offset + (enemy.size.width / 2) {
randomX = self.frame.minX + offset + (enemy.size.width / 2)
}

enemy.position.x = randomX
}

func keepEnemyInBounds() {
// A better way to do this would be to have a dictionary of enemies:
for node in self.children {
guard node.name == "enemy" else { continue }
let enemy = node as! SKSpriteNode

if enemy.position.x > frame.maxX - (enemy.size.width / 2) {
enemy.position.x = frame.maxX - (enemy.size.width / 2)
}
else if enemy.position.x < frame.minX + (enemy.size.width / 2) {
enemy.position.x = frame.minX + (enemy.size.width / 2)
}
}
}


override func update(_ currentTime: TimeInterval) {
spawnEnemy()
}
override func didFinishUpdate() {
keepEnemyInBounds()
}
}

关于swift - SpriteKit - 除了底部和顶部之外的所有侧面的边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com