2016-06-21 6 views
0

「敵」をすべての境界から逸らすようにしようとしています。例えば、敵が画面の左、右、上、下に衝突すると、方向が変わるはずです。どのようにしてオブジェクトを素早くエッジから跳ね返させるのですか

これは私の現在のコードです:

import SpriteKit 
import GameplayKit 

struct Physics { 
    static let Enemy: UInt32 = 0x1 << 1 
    let BorderCategory : UInt32 = 0x1 << 2 
    let BottomCategory : UInt32 = 0x1 << 3 
    let BallCategory : UInt32 = 0x1 << 4 

} 

class GameScene: SKScene { 

    var Enemy = SKSpriteNode() 
    var gameStarted = Bool() 
    var gameState = "running" 
    var destX : CGFloat = 0.0 
    var destY : CGFloat = 0.0 
    var score = 0 

    override func didMove(to view: SKView) { 
     let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame) 
     borderBody.friction = 0 
     self.physicsBody = borderBody 
     let screenSize: CGRect = UIScreen.main().bounds  // get the screen size 
     let screenWidth = screenSize.width     //get the width 
     let screenHeight = screenSize.height    //get the height 


     Enemy = SKSpriteNode(imageNamed: "red2") 
     Enemy.size = CGSize(width: 60, height: 70) 
     Enemy.position = (CGPoint(x: self.frame.width/6 - Enemy.frame.width, y: self.frame.height/10)) 

     Enemy.physicsBody = SKPhysicsBody(circleOfRadius: Enemy.frame.height/2) 
     Enemy.physicsBody?.categoryBitMask = Physics.Enemy 
     //Enemy.physicsBody?.categoryBitMask = Physics.Ground | Physics.wall 
     //Enemy.physicsBody?.contactTestBitMask = Physics.Ground | Physics.wall 
     Enemy.physicsBody?.affectedByGravity = false 
     Enemy.physicsBody?.isDynamic = true 


     self.addChild(Enemy) 
     Enemy.physicsBody?.velocity = CGVector(dx: 50, dy: 50) 

     if (Enemy.position.x == screenWidth) { 
      Enemy.physicsBody?.velocity = CGVector(dx: -50, dy: 0)  // change direction at edge DOESN'T WORK 
     } 

     if(Enemy.position.y == screenHeight){ 
      Enemy.physicsBody?.velocity = CGVector(dx: 0, dy: -50)  //change direction at edge DOESN'T WORK 
     } 
    } 

答えて

0

それは(ほとんどの場合)しないので、あなたの条件のため - オペレータに等しいの代わりに、より低い/大きい使用。

import SpriteKit 

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 

     // Create enemy with physics body attached and add it to the scene 
     let enemy = SKSpriteNode(color: SKColor.greenColor(), size: CGSize(width: 20, height: 20)) 
     enemy.name = "enemy" 
     enemy.position = CGPoint(x: size.width/2, y: size.height/2) 
     enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size) 
     enemy.physicsBody!.affectedByGravity = false 
     enemy.physicsBody!.linearDamping = 0 
     enemy.physicsBody!.mass = 0.1 
     enemy.physicsBody!.velocity = CGVector(dx: 150, dy: 0) 
     addChild(enemy) 
    } 

    override func didSimulatePhysics() { 
     let enemy = childNodeWithName("enemy")! 

     if (enemy.position.x > size.width && enemy.physicsBody!.velocity.dx > 0) 
      || (enemy.position.x < 0 && enemy.physicsBody!.velocity.dx < 0) { 
      enemy.physicsBody!.velocity.dx *= -1 
     } 
    } 
} 
0

いいえ、コードに基づいて、動作中のバウンドスプライトを作成しました。手動で方向を変更するのではなく、これを実現するために物理エンジンを使用しています(これはどうやってこれを行うべきかと思います)。

override func didMove(to view: SKView) { 
    let borderBody = SKPhysicsBody(edgeLoopFrom: frame) 
    borderBody.friction = 0 
    borderBody.categoryBitMask = Physics.wall 
    physicsBody = borderBody 
    let enemy = enemySprite(size: CGSize(width: 60, height: 70), position: CGPoint(x: frame.size.width/2, y: frame.size.height/2)) 
    addChild(enemy) 
    let force = SKAction.applyForce(CGVector(dx: 300, dy: 300) , duration: 0.1) 
    enemy.run(force) 
} 

func enemySprite(size: CGSize, position: CGPoint) -> SKSpriteNode { 
    let enemy = SKSpriteNode(color: SKColor.red(), size: CGSize(width: 60, height: 80)) 
    enemy.position = CGPoint(x: frame.width/2, y: frame.height/2) 
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.frame.height/2) // A bit silly with circle, but you seem to have an image for this use 
    enemy.physicsBody?.categoryBitMask = Physics.enemy 
    enemy.physicsBody?.restitution = 1 
    enemy.physicsBody?.friction = 0 
    enemy.physicsBody?.collisionBitMask = Physics.wall 
    enemy.physicsBody?.affectedByGravity = false 
    enemy.physicsBody?.angularDamping = 0 
    enemy.physicsBody?.linearDamping = 0 
    return enemy 
} 

シーンを設定する方法も考慮してください。シーンサイズはビューサイズと同じですか?そうでなければシーンの物理学ボディはあなたがそれを期待するところでボールをバウンスさせません...

+0

私は非常にプログラマブルなので、どんなばかばかしい文についても私を許しています。これは敵が一度両脇から跳ね返るだけです。私は敵が画面の周りを跳ね続けることを望んでいた。これを行う方法はありますか?また、敵の位置をフレーム幅/ 2、フレームの高さ/ 2に設定しても、敵を画面の中央に配置することはありません。なぜこのようなことが起こったのか考えていますか? – Tom

+0

上記のいずれかを変更していない限り、このコードは敵を「時の終わり」までバウンスさせます。 (私はこれを自分で確認するために構築しました)。おそらく、私の返事の最後にある_my_質問への答えは、途中であなたを導く可能性があります。どのようにシーンを作成し、そのサイズは(画面に比べて)何ですか? –

関連する問題