ahmed nader
ahmed nader

Reputation: 384

swift shooting objects from circle shape

I have a circle in the middle and I need to fire bullets in direction opposite to where I touch and come out from the player, I wrote the following code but nothing happen

private func fire(position: CGPoint) {
        let bullet = SKShapeNode(circleOfRadius: 2)
        bullet.strokeColor = SKColor.darkGray
        bullet.fillColor = SKColor.darkGray
        bullet.physicsBody = SKPhysicsBody(circleOfRadius: 2)
        let posX = (position.x) * -1
        let posY = (position.y) * -1
        let pos = CGPoint(x: posX, y: posY)
        bullet.position = pos
        bullet.physicsBody?.affectedByGravity = false
        bullet.physicsBody?.isDynamic = false
        bullet.physicsBody?.pinned = false
        numberOfBullets += 1
        bullet.name = String(numberOfBullets)
        bullet.physicsBody?.collisionBitMask = bodyType.enemy.rawValue
        bullet.physicsBody?.categoryBitMask = bodyType.bullet.rawValue
        bullet.physicsBody?.contactTestBitMask = bodyType.enemy.rawValue
        bullet.physicsBody?.usesPreciseCollisionDetection = true
        world.addChild(bullet)
        bulletForce(bullet: bullet, position: position)
    }

    private func bulletForce(bullet: SKShapeNode, position: CGPoint) {
        let ddx = Double((bullet.position.x - position.x))
        let ddy = Double((bullet.position.y - position.y))
        let degree = atan2(ddy, ddx) * (180.0 / M_PI)
        let magnitude = 900.0
        let angle = degree
        let dx = magnitude * cos(angle)
        let dy = magnitude * sin(angle)
        let vector = CGVector(dx: dx,dy: dy)
        bullet.physicsBody?.applyForce(vector)
        //bullet.run(fire, withKey: "firing\(bullet.name)")
    }

EDIT ::

This solved the problem thanks to the aid from the accepted answer

let posX = (position.x) * -1
        let posY = (position.y) * -1
        let pos = CGPoint(x: posX, y: posY)
        let theta = atan2((pos.y - player.position.y), (pos.x - player.position.x))

let dx = cos(theta) /  4
        let dy = sin(theta) /  4
        world.addChild(bullet)
        let vector = CGVector(dx: dx, dy: dy)
        bullet.physicsBody!.applyImpulse(vector)

where theta is the angle i want the bullet to go to and here it is

Note::

The player is in the middle ( circle ).

The posX and posY are the x and y coordinates where the user touched and they are multiplied by -1 to get the opposite direction where my bullet will be placed.

The angle theta is then calculated using the atan2 function that instead of positioning my bullet away from the player ( circle ), it will position it at the edge of circle.

Upvotes: 2

Views: 96

Answers (1)

sicvayne
sicvayne

Reputation: 620

Have you tried switching isDynamic from "false" to "true"? Also, try adding GCVector(dx: 1.0 * dx, dy: 1.0 * dy)

Upvotes: 1

Related Questions