我想在sprite-kit游戏中实现经典的“爆头”效果。
我的想法和尝试:
在同一个精灵上创建单独的“body”和“head”physicsBodies并用关节固定它们。不可能:(
在“敌人”精灵上创建一个“body”物理体,并创建另一个透明精灵,其物理身体后面的“head”physicsBody(位于顶部)。这种方法要求我跟踪头部与身体的关联。这也会降低游戏效率。我很好奇我是否可以创建SKSpriteNode的子类并创建一个将这两个spritenodes和physicsBodies捆绑在一起的“敌人”。
检查射弹与敌人的位置,看看射弹是否在精灵顶部的某个Y范围内接触。我相信这种方法效率很低,因为弹丸飞得很快。
如果有人创造了这种效果并且可以分享他们的知识,我将不胜感激。谢谢!
答案 0 :(得分:1)
我在很多地方使用此设置。如果您发现自己想要添加更多零件或武器,它可以很好地扩展,并且它可以让您轻松地在视觉上隐藏任何这些零件或武器。使用userData可以派上用场,如果你有很多事情发生,并且不同的敌人有不同的东西"或者你正在做疯狂的事情,比如根据游戏玩法等将孩子精灵养育到不同的实体
-(SKSpriteNode*)makeAnEnemy
{
SKSpriteNode *mainEnemy;
SKSpriteNode *enemyHead;
//setup mainEnemy physics body
//setup enemyHead physics body
[mainEnemy addChild:enemyHead];
// depending on your plans, on hit you could use the following code later:
SKSpriteNode *theEnemyThatWasHit = (SKSpriteNode*)enemyHead.parent;
//or you can use userdata and set it all up here
[mainEnemy.userData setObject:enemyHead forKey:@"myHead"];
[enemyHead.userData setObject:mainEnemy forKey:@"myBody"];
return mainEnemy;
}
答案 1 :(得分:1)
使用physicsBody的pinned
属性可以轻松创建具有多个接触区域的复杂精灵。将物理主体固定到节点的父节点:
默认值为NO。如果是,则节点的位置是固定的 相对于其父母。节点的位置不能改变 动作或物理力量。节点可以绕其自由旋转 位置以应对碰撞或其他力量。如果是父节点 有一个物理机构,那么这两个物理机构就像对待它们一样 用针接头连接。
这是一个基本的狗类,其中狗有一个主体和一个头。请注意,我也设置了allowsRotation = false
,因此头部无法在身体周围移动。
import SpriteKit
// for readability
let mainSize = CGSize(width: 300, height: 300)
let headSize = CGSize(width: 100, height: 100)
class Dog : SKSpriteNode {
let head = SKSpriteNode(color: SKColor.greenColor(), size: headSize)
init() {
super.init(texture: nil, color: SKColor.redColor(), size: mainSize)
head.position = CGPoint(x: mainSize.width - headSize.width, y: 0)
addChild(head)
}
// called after Dog has been added to the scene
func configurePhysicsBody() {
physicsBody = SKPhysicsBody(circleOfRadius: mainSize.width / 2)
physicsBody.dynamic = true
physicsBody.allowsRotation = false
// set contactBitmask for main body
head.physicsBody = SKPhysicsBody(circleOfRadius: headSize.width / 2)
head.physicsBody.dynamic = true
head.physicsBody.allowsRotation = false
// The head is pinned to the parent node, so position is fixed relative to parent
head.physicsBody.pinned = true
// set contactBitmask for head
}
}