我希望限制我的角色(猫),只有当它在地面上时(虚拟SKNode)或在树上(treeP SKNode)时跳跃。
目前我对touchesBegan
没有任何限制,因此如果用户快速连续点击,猫就可以在空中飞行,而这在其他游戏中非常有用,这里不受欢迎
如果有人能帮助我,我会非常高兴。
我想做的但没有经验的是启用点击(跳转),如果猫与假人或树接触,并且如果不与虚拟或树接触则同样禁用点击。
以下是可能有用的所有内容......
class GameScene: SKScene, SKPhysicsContactDelegate {
let catCategory: UInt32 = 1 << 0
let treeCategory: UInt32 = 1 << 1
let worldCategory: UInt32 = 1 << 1
override func didMoveToView(view: SKView) {
// part of cat code
cat = SKSpriteNode(texture: catTexture1)
cat.position = CGPoint(x: self.frame.size.width / 2.2, y: self.frame.size.height / 7.0 )
cat.physicsBody?.categoryBitMask = catCategory
cat.physicsBody?.collisionBitMask = crowCategory | worldCategory
cat.physicsBody?.contactTestBitMask = crowCategory | contact2Category
// part of the ground code
var dummy = SKNode()
dummy.position = CGPointMake(0, groundTexture.size().height / 2)
dummy.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, groundTexture.size().height))
dummy.physicsBody!.dynamic = false
dummy.physicsBody?.categoryBitMask = worldCategory
dummy.physicsBody?.collisionBitMask = 0
dummy.physicsBody?.contactTestBitMask = 0
moving.addChild(dummy)
// part of the tree code
func spawnTrees() {
var treeP = SKNode()
treeP.position = CGPointMake( self.frame.size.width + treeTexture1.size().width * 2, 0 );
treeP.zPosition = -10;
var height = UInt32( self.frame.size.height / 4 )
var y = arc4random() % height;
var tree1 = SKSpriteNode(texture: treeTexture1)
tree1.position = CGPointMake(0.0, CGFloat(y))
tree1.physicsBody = SKPhysicsBody(rectangleOfSize: tree1.size)
tree1.physicsBody?.dynamic = false
tree1.physicsBody?.categoryBitMask = treeCategory;
tree1.physicsBody?.collisionBitMask = 0
tree1.physicsBody?.contactTestBitMask = 0
treeP.addChild(tree1)
treeP.runAction(moveAndRemoveTrees)
trees.addChild(treeP)
}
// all of touchesBegan
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
if (moving.speed > 0){
cat.physicsBody!.velocity = CGVectorMake(0, 0)
cat.physicsBody!.applyImpulse(CGVectorMake(0, 20))
} else if (canRestart) {
self.resetScene()
}
}
答案 0 :(得分:-1)
您可以使用一些名为isOnTheGround
的自定义布尔变量,以限制在空中跳跃。此变量需要由您更新。请注意,如果角色与“平台”接触,则角色不一定在地面上(例如,可能发生侧面接触)。因此,由您来定义“在地面上”的含义。当你定义它时,那很简单:
提示:您可以将角色的 y 位置与平台的 y 位置进行比较,看看角色是否真的在平台上。
假设角色和平台的锚点都没有改变(0.5,0.5),为了计算角色的腿y位置你可以做这样的事情(伪代码):
characterLegsY = characterYPos - characterHeight/2
要获得平台的支持:
platformSurfaceYPos = platformYPos + platformHeight/2
防止在空中跳跃
在touchesBegan:
isOnTheGround
- &gt;跳在didEndContact中:
isOnTheGround
设置为false(字符结束与地面/平台的联系)在didBeginContact中:
isOnTheGround
变量设为true Here你可以找到类似的例子......
答案 1 :(得分:-2)
我最近遇到了这个问题。这是我修复它的方式。在游戏场景中创建此变量:
var ableToJump = true
然后在更新方法中输入此代码:
if cat.physicsBody?.velocity.dy == 0 {
ableToJump = true
}
else {
ableToJump = false
}
以上代码将起作用,因为更新方法在游戏的每一帧都运行。如果您的猫在y轴上移动,它会检查每一帧。如果您没有更新方法,只需键入override func update,它就应该自动完成。
现在最后一步是将此代码放在touchesBegan中:
if ableToJump == true {
cat.physicsBody!.applyImpulse(CGVectorMake(0,40))
}
注意:您可能需要修改获得所需跳跃高度的冲动