前期废话
SpriteKit
是苹果封装好的一个非常简单方便的2D游戏框架,内容丰富,想怎么玩就怎么玩。
刚好这段时间有些时间,就写了一个小时候玩过的弹珠小游戏,只是用来练练手,因为没有素材,所以整个页面略显简单,不过整个游戏逻辑已经完成哈,先来展示下效果,看看你能玩多少分。
最终效果详细过程
1、给游戏设置4种状态
enum GameStatus {
case idle//初始状态
case running//运行中
case over//结束
case pass//过关
}
2、布置游戏场景:
1.添加一个挡板
2.添加白球
3.添加顶部砖头
4.在底部添加一个透明body,用来检测是否游戏结束
5.为了让游戏界面更加丰富一点,在顶部留了100的空余显示金币数,那个头像在左边还没有弄
3、具体实现:
因为不想贴那么多,这里就把顶部砖头的代码贴下,注意,spriteKit中的坐标系与普通OC是不一样的,
坐标系.JPG
添加砖头代码
///设置上方砖头
func setUpBarrier() {
///方便重置游戏界面
for pipeNode in self.children where pipeNode.name == "brick" {
if let pipeSprite = pipeNode as? SKSpriteNode {
pipeSprite.removeFromParent()
}
}
//设计成正方形
let width = self.size.width/19
let height = width
for i in 1...19*6 {
let copyNode = SKSpriteNode.init(texture: nil, size: CGSize(width: width, height: height))
copyNode.name = "brick"
let pointx = (i-1)%19
let pointy = (i-1)/19
var nodeX = CGFloat(pointx)*width
var nodeY = self.size.height - CGFloat(pointy)*height-100///给顶部留了100
nodeX += width*0.5
nodeY -= height*0.5
copyNode.position = CGPoint(x: nodeX, y: nodeY)
///因为缺少素材,这里使用随机色了
copyNode.color = self.randomColor()
copyNode.physicsBody = SKPhysicsBody.init(rectangleOf: CGSize(width: width, height: height), center: CGPoint(x: 0.5, y: 0.5))
///设置自身的physicsBody二进制数据,在实体出现碰撞后根据这个值判断是否为本对象
copyNode.physicsBody?.categoryBitMask = brickCategory
///设置 在实体运动过程中与哪些实体可发生碰撞,这里设置关联对象为球,因为只会与球发生碰撞,在碰撞后会通过代理回调结果
copyNode.physicsBody?.contactTestBitMask = ballCategory
copyNode.physicsBody?.isDynamic = false
addChild(copyNode)
}
///一个砖头就一分,所以总分在设置砖头后就已经知道了
self.destinationScore = 19*6
}
///设置随机色
func randomColor()->SKColor {
return SKColor.init(red: CGFloat(arc4random_uniform(255))/255.0, green: CGFloat(arc4random_uniform(255))/255.0, blue: CGFloat(arc4random_uniform(255))/255.0, alpha: 1.0)
}
当砖头与球发生碰撞的时候,砖头会消失,并产生碰撞声音,本来想做一个砖头碎掉的动画,缺少素材或者技术还不行就放弃了,各位有好点子可以留个言哈。
///当撞击的时候,障碍物消失
func briierRemoveAction(brickNode:SKSpriteNode) {
brickNode.run(SKAction.sequence([
SKAction.fadeAlpha(to: 0, duration: 0.5),
SKAction.removeFromParent()]))
}
游戏声音管理者,专门播放各种声音,素材网上随便找的,class GameAudioManager: NSObject
关于挡板手势拖动,非常感谢这个博主
碰撞代理回调分析:
稍微难点就是球和挡板碰撞后球该往哪个方向弹的问题,其实分析后就很简单了,默认初始的时候,球和挡板的position.x是一样的,只要判断position.x的大小即可确定方向
if(bodyA.categoryBitMask == boardCategory && bodyB.categoryBitMask == ballCategory){
///通过比较挡板和球的位置的x值的相对值来确定应该的角度
let boardPointX = self.boardNode.position.x
let ballPointX = self.ballNode.position.x
var value = CGFloat(fabsf(Float(boardPointX-ballPointX)))
value = value/2
if(boardPointX > ballPointX){//球在挡板的左边
value = -value
}else if(boardPointX == ballPointX){//球在挡板的中间
value = 0
}else{//球在挡板的右边
}
GameAudioManager.share.manager.playTapAudio()
self.ballNode?.physicsBody?.applyImpulse(CGVector(dx: value, dy: 15))
}
OK,写到这整个游戏差不多了,具体细节各位可以看看源码,其他细节就不贴上了。
demo在这
网友评论