2016-04-26 14 views
0

ほとんどのゲームのように、プレーヤーが一度だけジャンプする方法を知りたいです。私はこれを試みた:swift - Jump only when landedしかし、それは実際に私のために働いていなかった理由は、プレイヤーが画面をタップしてスパムし、彼は30回のクリックごとに跳んだときに跳んだだけだったからです。下だスウィフトで一度だけジャンプする方法は?

:ここではそれがどのように見えるかであるクラスGameScene:SkSceneで{

var ableToJump = true 
var Player = SKSpriteNode(imageNamed: "Spieler_rechts") 

:didMoveToView(ビュー:SKView)で

Player.position = CGPoint(x: self.frame.size.width*0.1, y: Ground.frame.size.height + Player.frame.size.height) 
Player.zPosition = 3 
Player.physicsBody = SKPhysicsBody(rectangleOfSize: Player.size) 
Player.physicsBody?.allowsRotation = false 
Player.physicsBody?.affectedByGravity = true 
Player.physicsBody?.restitution = 0 
self.addChild(Player) 

:オーバーライドFUNC更新( CURRENTTIME:NSTimeInterval)で

if Player.physicsBody?.velocity.dy == 0 { 
    ableToJump = true 
} 
else { 
    ableToJump = false 
} 

:セット、withEvent EV:touchesBegan(タッチFUNCオーバーライドENT:たUIEvent)

if ableToJump == true { 
    Player.physicsBody?.applyImpulse(CGVectorMake(0, 20)) 
} 
+0

は、それはあなたの問題を解決しましたか? – Coder1000

+0

また、チェックしてください:http://stackoverflow.com/questions/31903934/swift-jump-only-when-landed?lq=1 – Coder1000

+0

私は彼がブロックと衝突するたびにベースラインを変更する方法を見つけることができません:/ –

答えて

0

ここで私はそれをやった方法は次のとおりです。

EDIT:?

class MainScene: SKScene, SKPhysicsContactDelegate { 

     let colorChanger = ColorChanger() 
     let ground = SKSpriteNode(imageNamed: "Ground") 
     let player = SKSpriteNode(imageNamed: "Player") 
     let block1 = SKSpriteNode(imageNamed: "Block2") 
     let block2 = SKSpriteNode(imageNamed: "Block2") 
     let scoreLabel = SKLabelNode(fontNamed: "Chalkboard SE") 
     let highScoreLabel = SKLabelNode(fontNamed: "Chalkboard SE") 
     let life = SKSpriteNode(imageNamed: "Player") 
     let life2 = SKSpriteNode(imageNamed: "Player") 
     let life3 = SKSpriteNode(imageNamed: "Player") 
     var firstTime = Int() 

     var blockMaxX = CGFloat(0) 
     var origBlockPositionX = CGFloat(0) 
     var score = Int() 
     var highScore = Int() 
     var lives = Int() 

     var groundPositionX = CGFloat(0) 
     var maxBarX = CGFloat(0) 
     var groundSpeed = 5 
     var playerBaseLine = CGFloat(0) 
     var more = CGFloat(0) 

     var onGround = true 
     var velocityY = CGFloat(0) 
     let gravity = CGFloat(1.3) 

     enum Collision:UInt32{ 
      case Player = 1 
      case Block = 2 
     } 



override func didMoveToView(view: SKView) { 
self.physicsWorld.contactDelegate = self 
     let color1 = colorChanger.randomColor() 
     runAction(SKAction.colorizeWithColor(color1, colorBlendFactor: 1, duration: 0.2)) 
     self.ground.anchorPoint = CGPointMake(0, 1) 
     self.ground.position = CGPointMake(CGRectGetMinX(self.frame),CGRectGetMidY(self.frame)-23) 
     self.ground.size = CGSize(width: 1100, height: 4000) 

     self.groundPositionX = self.ground.position.x 
     self.maxBarX = self.ground.size.width - self.frame.size.width - 100 
     self.maxBarX *= -1 

     self.player.size = CGSize(width: 50, height: 50) 
     self.playerBaseLine = self.frame.height/2 
     self.player.position = CGPointMake(CGRectGetMinX(self.frame) + self.player.size.width/1.5 , self.playerBaseLine) 
     self.player.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(self.player.size.width/2)) 
     self.player.physicsBody!.affectedByGravity = false 
     self.player.physicsBody!.categoryBitMask = Collision.Player.rawValue 
     self.player.physicsBody!.contactTestBitMask = Collision.Block.rawValue 
     self.player.physicsBody!.collisionBitMask = Collision.Block.rawValue 

override func update(currentTime: NSTimeInterval) { 

      self.velocityY += self.gravity 
      self.player.position.y -= velocityY 

      if self.player.position.y < self.playerBaseLine { 
       self.player.position.y = self.playerBaseLine 
       velocityY = 0.0 
       onGround = true 
      } 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
      if self.onGround{ 
       self.velocityY = -18.0 
       self.onGround = false 
      } 
    } 

あなたが重力でプレーする必要があります。)

+0

私が "Player.Physicsbody!.affectedByGravity = false"を実行すると、それは動作しますが、プレイヤーは重力がないので、プレイヤーは高く飛びます。私はこれを修正して重力の影響を受けていますが、それでも動作するかどうか知っていますか? –

+0

@ LukasDomeisen私は自分の答えを編集しました。 – Coder1000

+0

問題は、私がPlayerBaselineを作ることができないということです。なぜなら私のゲームでブロックを使用するのは、プレーヤーが時々高くなり、時にはブロックからブロックにジャンプするときに低いことを意味するからです。そのための解決策はありますか? –

関連する問題