在过去的两天里,我一直在努力争取两个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
我有一个带有动态物理体的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
我试图让我的 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) 我使用 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) 我正在建造一个带有球在iPad屏幕内弹跳的游戏.类似于Pong游戏.我看到SKScene的SKPhysicsWorld具有重力属性,还可以控制物体相互碰撞的方式.
有没有什么方法可以自动检测精灵的边缘是否与屏幕边缘相撞,所以它可以反弹掉?或者我是否需要编写自己的碰撞代码?
我有以下代码:
在我的场景中:
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
sprite-kit ×5
ios ×2
skspritenode ×2
swift ×2
game-physics ×1
ios7 ×1
objective-c ×1
scenekit ×1
skscene ×1