- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是 swift(和编程)菜鸟。我正在 swift spriteKit 中制作一个简单的突破游戏。它正在工作,但现在我想为某些 block 添加“健康”,但遇到了一些问题。我搜索过谷歌,但什么也没找到。
首先,这是我的类(class):
class targets {
var _target: SKShapeNode;
var color: SKColor;
var life: Int;
var positionX: CGFloat = 100;
var positionY: CGFloat = 200;
var isDynamic: Bool = false;
var _name: String = "";
init(life:Int, target:SKShapeNode, name:String, color: SKColor) {
self.life = life;
self._target = target
self._name = name;
self.positionX = 100;
self.positionY = 200;
self.isDynamic = false;
self.color = color;
}
func spawnTargets() ->SKShapeNode {
let target = SKShapeNode(rectOfSize: CGSize(width: 20, height: 10));
target.name=_name;
target.fillColor=color;
target.position=CGPoint(x: positionX, y: positionY);
target.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 20, height: 10));
target.physicsBody?.dynamic=isDynamic;
target.physicsBody?.friction=0;
target.physicsBody?.categoryBitMask=physicsCategory.target;
target.physicsBody?.collisionBitMask = physicsCategory.ball;
target.physicsBody?.contactTestBitMask=physicsCategory.ball;
target.physicsBody?.usesPreciseCollisionDetection=true;
return target;
}
}
我在 GameScene 类中创建了两个“目标”实例:
var target1: targets = targets(life: 1, target: SKShapeNode(rectOfSize: CGSize(width: 20, height: 10)), name: "1", color: SKColor.blackColor());
var target2: targets = targets(life: 2, target: SKShapeNode(rectOfSize: CGSize(width: 20, height: 10)), name: "2", color: SKColor.yellowColor());
生成 block 的函数:
func spawnTarget(){
var count: Int = 0;
target1.isDynamic=false;
target1.positionX=100;
target1.positionY=200;
for(var i = 0; i<60; i++){
if(count==20){ target1.positionY=target1.positionY+11; target1.positionX=100; count=0; }
target1.positionX=target1.positionX+21;
let targetOneLives = target1.spawnTargets();
addChild(targetOneLives);
count++;
}
count=0;
target2.color=SKColor.yellowColor();
target2.isDynamic=false;
target2.positionX=100;
target2.positionY=target1.positionY+11;
for(var i = 0; i<60; i++){
if(count==20){ target2.positionY=target2.positionY+11; target2.positionX=100; count=0; }
target2.spawnTargets();
target2.positionX=target2.positionX+21;
let targetTwoLives = target2.spawnTargets();
addChild(targetTwoLives);
count++;
}
}
这是我的 didBeginContact 函数:
func didBeginContact(contact: SKPhysicsContact) {
let firstBody = contact.bodyA;
let secondBody = contact.bodyB;
let firstNode = firstBody.node as! SKShapeNode;
let secondNode = secondBody.node as! SKShapeNode;
let node;
if(firstBody.categoryBitMask == physicsCategory.ball && secondBody.categoryBitMask == physicsCategory.target){
node = secondNode;
}
else if(firstBody.categoryBitMask == physicsCategory.target && secondBody.categoryBitMask == physicsCategory.ball){
node = firstNode;
}
//This is what i want to do!
//node.life = node.life - 1
//if(node.life == 0){ node.removeFromParent(); }
}
我想更改“targets”实例的 .life 属性。有人知道怎么做吗?
最佳答案
更好的构建方法是子类化 SKShapeNode
。每个目标都应该是这个的一个实例。这样,在您的 didBeginContact
中,您可以将该节点强制转换为您的对象。
要在不更改架构的情况下解决您的问题,当您实例化目标时,您可以将它们存储到本地数组中。
var myArray: [targets] = [] // this should be in the scope of the class that all your logic is in
...
var target1: targets = targets(life: 1, target: SKShapeNode(rectOfSize: CGSize(width: 20, height: 10)), name: "1", color: SKColor.blackColor());
var target2: targets = targets(life: 2, target: SKShapeNode(rectOfSize: CGSize(width: 20, height: 10)), name: "2", color: SKColor.yellowColor());
myArray.append(target1)
myArray.append(target2)
然后在 didBeginContact
中,您可以迭代数组并检查该节点是否与 targets
对象的节点匹配。
func didBeginContact(contact: SKPhysicsContact) {
let firstBody = contact.bodyA;
let secondBody = contact.bodyB;
let firstNode = firstBody.node as! SKShapeNode;
let secondNode = secondBody.node as! SKShapeNode;
var node: SKShapeNode?
// reference to target that was hit
var myTarget: targets?
// index of target for removal if needed
var targetIndex: Int?
if(firstBody.categoryBitMask == physicsCategory.ball && secondBody.categoryBitMask == physicsCategory.target){
node = secondNode;
}
else if(firstBody.categoryBitMask == physicsCategory.target && secondBody.categoryBitMask == physicsCategory.ball){
node = firstNode;
}
// bail out if not a match
guard node != nil else { return }
for i in 0..<myArray.count {
let target = myArray[i]
if target._target == node {
// found
myTarget = target
targetIndex = i
break;
}
}
// verify we found the target
guard myTarget != nil else { return }
myTarget!.life = myTarget!.life - 1
if myTarget!.life == 0 {
// remove node from scene
myTarget!._target.removeFromParent()
// remove target from array
myArray.removeAtIndex(targetIndex!)
}
}
关于ios - didBeginContact,访问和更改对象的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227028/
我有两个节点和一个 bool 值。很简单。当节点 A 联系节点 B 并且 bool 值为 0 时,什么也没有发生。但是,如果 bool 值为 1,则通过 didBeganContact 方法删除节点
这里是 swift(和编程)菜鸟。我正在 swift spriteKit 中制作一个简单的突破游戏。它正在工作,但现在我想为某些 block 添加“健康”,但遇到了一些问题。我搜索过谷歌,但什么也没找
所以我已经在这个游戏上工作了一段时间,所有的工作都按照我想要的方式进行,但是我已经在 didBeginContact 上停留了几天,我想我无法理解它它看起来不错,我检查了几个论坛并得到了几乎相同的结果
我已经浏览了所有我可以理解的示例,但没有任何内容与我的问题相关。我有 SKPhysicsContactDelegate 并且添加了 self.physicalsworld.contactDelegat
我的 didBeginContact 方法应该在球击中时移除我的砖 block Sprite 。但是,它没有发挥作用。当我运行它时,当我击中桨和击中砖 block 时,我会得到 NSLog“桨”。我已
知道为什么我的 didBeginContact 方法从不触发吗?球体和矩形实际上相互接触...... 这里我声明了两个类别 static const uint32_t rectangleCategor
当我将 println() 放入我的 didBeginContact 时,没有任何打印。因此,我假设我的 didBeginContact 不起作用。为什么?我还有一个枚举(对撞机类型),其中列出了 C
当我的两个 SKSpriteNode 接触时,didBeginContact 函数没有被调用: func didBegin(_ contact: SKPhysicsContact) { let
在我的游戏中,我有从一个点向前发射的激光。我使用此代码拉伸(stretch)激光 Sprite 并移动它以模拟更新函数中的运动: let height = size.height yScale +=
我正在尝试创建一个程序,无论我的宇宙飞船越过一个圆圈,它都会打印出一些东西,但是当我把宇宙飞船放在圆圈上时,它没有打印任何东西。我是否构建了错误的 didBeginContact 方法?我是否设置了错
我有 2 个 SKSpriteNode 需要检测其接触。我尝试了各种方法并查找了很多东西,但似乎无法得到答案。下面是我的代码。 controlCircle 是一个类级别的变量,因为它需要在其他方法中使
我有两个 sprite 节点,我已确保 self.size 和它们各自的物理体的大小相同,但我仍然遇到这样一个非常奇怪的行为: 这张照片是在检测到碰撞时拍摄的,我暂停了场景。为什么会这样? 这里是设置
我为每个想要相互交互的不同对象创建了一个 struct PhysicsCatagory struct PhysicsCatagory { static let Blade : UInt32 =
我正在制作一个需要我的 spriteNodes 发生碰撞的游戏。我遵循了一个教程,但它对我不起作用。 当我运行我的游戏并且两个对象发生碰撞时,输出监视器中没有 println("beginContac
在一款使用 Sprite Kit 以及 Sprite Kit 内置物理引擎中的接触检测功能的 iOS 游戏中,每当英雄与敌人接触时,我都会将英雄的生命值减一。这是通过 didBeginContact
假设两次接触同时发生。它们的 didBeginContact 函数调用会在完全相同的时间发生(我猜是在不同的线程中),还是一个会在另一个之后发生? 最佳答案 否 - 为场景中接触的每对节点调用 did
我是 swift 语言的新手,遇到了一些问题。我猜这是一个简单的错误,但无论如何我似乎找不到问题。我正在制作一个游戏。当你输了之后,我会在屏幕上创建一个重播按钮。单击后,我开始重置游戏。 我基本上重置
我正在解决 SpriteKit 的一些碰撞检测问题。我在 didBeginContact 中触发了正确的碰撞,这很棒。 现在我遇到了一个范围问题,我无法根据碰撞命中之一在场景中删除和添加子项。第一次检
func didBeginContact(contact: SKPhysicsContact) { if contact.bodyA.categoryBitMask == Physic
我一直在开发一款游戏,每次我的测试节点与我的检查节点接触时都必须执行测试。由于这两个节点是游戏中唯一检查碰撞的节点,因此我决定使用此方法来启动测试。 问题是当 2 个节点物理交叉时,我一直无法让碰撞发
我是一名优秀的程序员,十分优秀!