2016-07-04 9 views
0

2Dトップダウンゲームを構築しようとしています。私は彼が移動して回転できるプレイヤー(SKSpriteNode)を持っており、私は彼から2つの弾を撃ちたいと思います。私はこのthis ( - これは弾丸であるグリーンドット)のようなものを作ってみる ...私は正しく位置を設定する方法がわからない、SKSpriteNodeから弾丸を撃つ

func setBullet(player: Player, bullet: Int) 
{ 
    let weaponPosition = scene!.convertPoint(player.weapon.position, fromNode: player) 
    var xPos, yPos: CGFloat! 

    let sinus = sin(player.zRotation) 
    let cosinus = cos(player.zRotation) 

    if bullet == 1 
    { 
     xPos = converted.x - sinus * player.size.height/2 
     yPos = converted.y + cosinus * player.size.height/2 
    } 
    else if bullet == 2 
    { 
     xPos = weaponPosition.x - sinus * player.size.height/2 
     yPos = weaponPosition.y + cosinus * player.size.height/2 
    } 

    position = CGPoint(x: xPos, y: yPos) 
    physicsBody!.applyImpulse(CGVector(dx: -sinus * normalSpeed, dy: cosinus * normalSpeed)) 
} 

をしかし: は、私が撮影し、このコードを使用します。誰も私を助けることができます!

答えて

1

複数の弾丸を同じ方向に射撃するのはかなり簡単です。キーは、文字が回転されたときに弾丸の初期位置と方向ベクトルを決定することです。

あなたはnodeが文字である

let point = node.convertPoint(weapon.position, toNode: self) 

によってシーン内の弾丸の初期位置を計算することができ、weapon.positionは、銃の非回転位置であり、selfシーンです。

通常、文字が回転していない場合は、弾丸が右に移動します(CGVector(dx:1, dy:0)またはそれ以上、CGVector (dx:0, dy:1))。あなたは、文字のzRotation

func rotate(vector:CGVector, angle:CGFloat) -> CGVector { 
    let rotatedX = vector.dx * cos(angle) - vector.dy * sin(angle) 
    let rotatedY = vector.dx * sin(angle) + vector.dy * cos(angle) 
    return CGVector(dx: rotatedX, dy: rotatedY) 
} 

とのことで、ベクトルを回転させることにより、弾丸の物理ボディに適用するインパルスの方向を計算することができますここでは回転文字から2弾を撃つ方法の例です:

struct Weapon { 
    var position:CGPoint 
} 

class GameScene: SKScene { 
    let sprite = SKSpriteNode(imageNamed:"Spaceship") 
    let dualGuns = [Weapon(position: CGPoint(x: -15, y: 15)), Weapon(position: CGPoint(x: 15, y: 15))] 
    let singleGun = [Weapon(position: CGPoint(x: 0, y: 15))] 
    let numGuns = 1 
    // If your character faces up where zRotation == 0, offset by pi 
    let rotationOffset = CGFloat(M_PI_2) 
    override func didMoveToView(view: SKView) { 
     scaleMode = .ResizeFill 
     sprite.position = view.center 
     sprite.size = CGSizeMake(25, 25) 
     self.addChild(sprite) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let _ = touches.first { 
      let action = SKAction.rotateByAngle(CGFloat(M_PI_4/2), duration:1) 
      sprite.runAction(action) { 
       [weak self] in 
       if let scene = self { 
        switch (scene.numGuns) { 
        case 1: 
         for weapon in scene.singleGun { 
          scene.shoot(weapon: weapon, from: scene.sprite) 
         } 
        case 2: 
         for weapon in scene.dualGuns { 
          scene.shoot(weapon: weapon, from: scene.sprite) 
         } 
        default: 
         break 
        } 
       } 
      } 
     } 
    } 

    func shoot(weapon weapon:Weapon, from node:SKNode) { 
     // Convert the position from the character's coordinate system to scene coodinates 
     let converted = node.convertPoint(weapon.position, toNode: self) 

     // Determine the direction of the bullet based on the character's rotation 
     let vector = rotate(CGVector(dx: 0.25, dy: 0), angle:node.zRotation+rotationOffset) 

     // Create a bullet with a physics body 
     let bullet = SKSpriteNode(color: SKColor.blueColor(), size: CGSizeMake(4,4)) 
     bullet.physicsBody = SKPhysicsBody(circleOfRadius: 2) 
     bullet.physicsBody?.affectedByGravity = false 
     bullet.position = CGPointMake(converted.x, converted.y) 
     addChild(bullet) 
     bullet.physicsBody?.applyImpulse(vector) 
    } 

    // Rotates a point (or vector) about the z-axis 
    func rotate(vector:CGVector, angle:CGFloat) -> CGVector { 
     let rotatedX = vector.dx * cos(angle) - vector.dy * sin(angle) 
     let rotatedY = vector.dx * sin(angle) + vector.dy * cos(angle) 
     return CGVector(dx: rotatedX, dy: rotatedY) 
    } 
} 
+0

ありがとうございます。コードではなく正しい位置にコードを書くのですか? – DonMugad

+0

私のコードを更新します! – DonMugad

+0

私は今それをチェックします:) – DonMugad

1

あなたのプレイヤーがSKShapeNodeまたはSKSpriteNodeで作成されたサークルであるとします。

それらの両方は、フレームのプロパティがあります。だから、

let f = player.frame 

を、最初の箇条書きは、この位置にすることができます。

let firstBullet.position = CGPointMake(player.position.x-(f.width/2),player.position.y) 
let secondBullet.position = CGPointMake(player.position.x+(f.width/2),player.position.y) 

行う回転時にそれを知っている:

let firstBulletXPos = firstBullet.position.x - sinus * bullet.size.height/2 
let firstBulletYPos = firstBullet.position.y + cosinus * bullet.size.height/2 

let secondBulletXPos = secondBullet.position.x - sinus * bullet.size.height/2 
let secondBulletYPos = secondBullet.position.y + cosinus * bullet.size.height/2 
+0

ありがとうございますが、私のプレーヤーは回転でき、弾丸の位置は正しくありません! – DonMugad

+0

今はどうですか? –

+0

それは働いていない:( – DonMugad

関連する問題