标签: skphysicsworld

iOS Swift didBeginContact未被调用

在过去的两天里,我一直在努力争取两个SKSpriteNodes注册冲突并唤起他们didBegin#contact.

我为两个对象设置了位掩码' categoryBitMask',' contactTestBitMask'和' collisionTestBitMask'.

我也设置' dynamic'属性为' true'

initPhysics() 似乎建立了physicsWorld好.

我所期待的didBegin#Contact就是所谓的,但事实并非如此

//Set up Physicsbody bit masks
let playerCarBitMask: UInt32 = 0x1 << 1
let slowCarBitMask: UInt32 = 0x1 << 2



//initPhysics
func initPhysics() {
    println("(((((((((((((( Initiating Physicsbody ))))))))))))))")
    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVector.zeroVector

    println("self.physicsWorld.contactDelegate = \(self.physicsWorld.contactDelegate)")

}

//setupPlayer
func setupPlayer() {

    car = SKSpriteNode(imageNamed: "redCarUp")
    car.setScale(2.0)
    car.position = CGPoint(x: 800, y: 400)
    car.zPosition = 100
    car.name = "car"

    gameNode.addChild(car)

    let …
Run Code Online (Sandbox Code Playgroud)

collision-detection sprite-kit skphysicsbody skphysicsworld swift

8
推荐指数
2
解决办法
6247
查看次数

用物理SKSpriteNode子项暂停SpriteKit游戏

我有一个带有动态物理体的SKSpriteNode SKNode *_fgLayer.

现在,当我暂停或取消暂停游戏时,我希望SKSpriteNode保持原位而不是旋转或跌落.如果我只是使用_fgLayer.paused = YES;SKSpriteNode不会留在原地,而是旋转和跌倒.如果我physicsBody.dynamic = NO;在暂停physicsBody.dynamic = YES;时设置,当取消暂停 时它可以工作.

但是,经过几次尝试后,我总是遇到以下崩溃:

"Assertion failed: (typeA == b2_dynamicBody || typeB == b2_dynamicBody), function SolveTOI, file /SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Dynamics/b2World.cpp, line 670."

所以,我猜设置physicsBody.dynamic = NO;和返回不起作用.

当游戏暂停时,有没有人知道
如何暂停动态物理机构保持原位?

objective-c game-physics sprite-kit skspritenode skphysicsworld

7
推荐指数
1
解决办法
1612
查看次数

阻止 SKSpriteNode 减速

我试图让我的 SKSpriteNodes 永远以恒定的速度移动,即使在碰撞之后也是如此。我已将重力设置为 0,摩擦设置为 0,并将线性和角度阻尼设置为零,但精灵仍然缓慢地减慢到零速度。我怎样才能让他们动起来?

根据下面的答案,这就是我尝试过的:编辑下面的代码有效!我只需要检查节点是否比限制慢并加快它们的速度。

[self enumerateChildNodesWithName:kBallName usingBlock:^(SKNode *node, BOOL *stop)
    {
        SKSpriteNode *ball = (SKSpriteNode *)node;
        if (ball.physicsBody.velocity.dx < 0) {
            if (ball.physicsBody.velocity.dx > -50)
                ball.physicsBody.velocity = CGVectorMake(-50, ball.physicsBody.velocity.dy);
        }
        if (ball.physicsBody.velocity.dx > 0) {
            if (ball.physicsBody.velocity.dx < 50)
               ball.physicsBody.velocity = CGVectorMake(50, ball.physicsBody.velocity.dy);
        }
        if (ball.physicsBody.velocity.dy < 0) {
            if (ball.physicsBody.velocity.dy > -50)
                ball.physicsBody.velocity = CGVectorMake(ball.physicsBody.velocity.dx, -50);
        }
        if (ball.physicsBody.velocity.dy > 0) {
            if (ball.physicsBody.velocity.dy > 50)
                ball.physicsBody.velocity = CGVectorMake(ball.physicsBody.velocity.dx, 50);
        }
    }];
Run Code Online (Sandbox Code Playgroud)

ios sprite-kit skphysicsbody skspritenode skphysicsworld

6
推荐指数
1
解决办法
1107
查看次数

为什么 SceneKit 的物理世界 didBeginContact 在一次碰撞中会多次触发?

我使用 SceneKit 的物理主体系统来检测对象之间的碰撞,并得到一些非常奇怪的结果。为了说明这一点,我有一个最小的示例,它生成两个具有运动物理体的球体,并将它们沿直线移动,以便它们短暂重叠。

我希望看到当球体第一次重叠时,physicalWorld(:didBeginContact:) 被调用一次,而当球体停止重叠时,physicalWorld(:didEndContact:) 被调用一次。相反,我看到每个函数被调用了 25 次!

以下是要重现的代码:在 Xcode 8.0 中,使用“Game”模板创建一个全新的项目。将 GameViewController.swift 的内容替换为:

import UIKit
import SceneKit

class GameViewController: UIViewController, SCNSceneRendererDelegate, SCNPhysicsContactDelegate {

    var scnScene: SCNScene!
    var scnView: SCNView!
    var cameraNode: SCNNode!

    var nodeA: SCNNode!
    var nodeB: SCNNode!

    var countBeginnings: Int = 0
    var countEndings: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        setupScene()
        setupNodes()
    }

    func setupScene() {
        // create a new SCNScene and feed it to the view
        scnView = self.view as! SCNView
        scnScene = SCNScene()
        scnView.scene …
Run Code Online (Sandbox Code Playgroud)

scenekit skphysicsworld swift

5
推荐指数
1
解决办法
1673
查看次数

iOS7 SKScene如何让精灵从屏幕边缘反弹?

我正在建造一个带有球在iPad屏幕内弹跳的游戏.类似于Pong游戏.我看到SKScene的SKPhysicsWorld具有重力属性,还可以控制物体相互碰撞的方式.

有没有什么方法可以自动检测精灵的边缘是否与屏幕边缘相撞,所以它可以反弹掉?或者我是否需要编写自己的碰撞代码?

ios7 sprite-kit skscene skphysicsworld

4
推荐指数
2
解决办法
8469
查看次数

SKPhysicsContactDelegate 不工作

我有以下代码:

在我的场景中:

static const uint32_t enermyCategory    =  0x1 << 0;
static const uint32_t fatherCategory    =  0x1 << 1;

self.physicsWorld.contactDelegate = self;

    //init ship
Ship *ship = [Ship getFather];
ship.position = CGPointMake(CGRectGetMaxX(self.frame) - ship.frame.size.width , ship.frame.size.height);
[self addChild: ship];

    //init enermy
    Enermy *ene = [[Enermy alloc] initWithImageNamed:enermyName gameScene:self];
ene.position = ship.position;
[self addChild:ene];

#pragma mark - Physics Delegate Methods
- (void)didBeginContact:(SKPhysicsContact *)contact{
    NSLog(@"contact detected");
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我一开始就将飞船和能量设置在同一位置,因此它们总是会发生碰撞。

对于这两个类,我在其 init 方法中有以下代码:

//setup physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.dynamic = NO; …
Run Code Online (Sandbox Code Playgroud)

collision-detection ios sprite-kit skphysicsbody skphysicsworld

2
推荐指数
1
解决办法
3207
查看次数