-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Description
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
var player: SKSpriteNode!
var scoreLabel: SKLabelNode!
var score = 0 {
didSet {
scoreLabel.text = "Score: (score)"
}
}
override func didMove(to view: SKView) {
physicsWorld.contactDelegate = self
backgroundColor = .black
setupPlayer()
setupScoreLabel()
startEnemySpawn()
}
func setupPlayer() {
player = SKSpriteNode(imageNamed: "player")
player.position = CGPoint(x: size.width / 2, y: 100)
player.setScale(0.5)
player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
player.physicsBody?.isDynamic = false
player.name = "player"
addChild(player)
}
func setupScoreLabel() {
scoreLabel = SKLabelNode(fontNamed: "Arial")
scoreLabel.text = "Score: 0"
scoreLabel.fontSize = 24
scoreLabel.fontColor = .white
scoreLabel.position = CGPoint(x: size.width / 2, y: size.height - 50)
addChild(scoreLabel)
}
func startEnemySpawn() {
let spawn = SKAction.run { self.createEnemy() }
let wait = SKAction.wait(forDuration: 1.5)
let sequence = SKAction.sequence([spawn, wait])
let repeatForever = SKAction.repeatForever(sequence)
run(repeatForever)
}
func createEnemy() {
let enemy = SKSpriteNode(imageNamed: "enemy")
let xPosition = CGFloat.random(in: 50...(size.width - 50))
enemy.position = CGPoint(x: xPosition, y: size.height)
enemy.setScale(0.5)
enemy.physicsBody = SKPhysicsBody(rectangleOf: enemy.size)
enemy.physicsBody?.velocity = CGVector(dx: 0, dy: -200)
enemy.physicsBody?.linearDamping = 0
enemy.physicsBody?.categoryBitMask = 2
enemy.name = "enemy"
addChild(enemy)
}
func fireBullet() {
let bullet = SKSpriteNode(color: .yellow, size: CGSize(width: 5, height: 20))
bullet.position = player.position
bullet.physicsBody = SKPhysicsBody(rectangleOf: bullet.size)
bullet.physicsBody?.velocity = CGVector(dx: 0, dy: 300)
bullet.physicsBody?.linearDamping = 0
bullet.physicsBody?.categoryBitMask = 1
bullet.name = "bullet"
addChild(bullet)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let location = touch.location(in: self)
let move = SKAction.moveTo(x: location.x, duration: 0.2)
player.run(move)
fireBullet()
}
}
override func update(_ currentTime: TimeInterval) {
for node in children {
if node.position.y < 0 {
node.removeFromParent()
}
}
}
func didBegin(_ contact: SKPhysicsContact) {
if let bullet = contact.bodyA.node as? SKSpriteNode,
let enemy = contact.bodyB.node as? SKSpriteNode {
bullet.removeFromParent()
enemy.removeFromParent()
score += 10
}
}
}
Metadata
Metadata
Assignees
Labels
No labels