- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请帮助我,我已经尝试解决这个问题 24 小时了,我快要疯了:) 我试图通过 didBeginContact
委托(delegate)方法检测 Sprite Kit 中的碰撞,但是这个方法没有触发,网上的答案我都试过了
#import "MyScene.h"
#import "GameOverScene.h"
static const uint32_t basketCategory = 1 << 0;
static const uint32_t ballCategory = 1 << 1;
// 1
@interface MyScene () <SKPhysicsContactDelegate>
//@interface MyScene ()
@property BOOL contentCreated;
@property (nonatomic) SKSpriteNode * basket;
@property (nonatomic) SKSpriteNode * ball;
@property (nonatomic) NSTimeInterval lastSpawnTimeInterval;
@property (nonatomic) NSTimeInterval lastUpdateTimeInterval;
@property (nonatomic) int ballDestroyed;
@property (nonatomic) int score;
@end
static inline CGPoint rwAdd(CGPoint a, CGPoint b) {
return CGPointMake(a.x + b.x, a.y + b.y);
}
static inline CGPoint rwSub(CGPoint a, CGPoint b) {
return CGPointMake(a.x - b.x, a.y - b.y);
}
static inline CGPoint rwMult(CGPoint a, float b) {
return CGPointMake(a.x * b, a.y * b);
}
static inline float rwLength(CGPoint a) {
return sqrtf(a.x * a.x + a.y * a.y);
}
// Makes a vector have a length of 1
static inline CGPoint rwNormalize(CGPoint a) {
float length = rwLength(a);
return CGPointMake(a.x / length, a.y / length);
}
@implementation MyScene
float balltime;
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
/* Setup your scene here */
}
return self;
}
- (void)didMoveToView:(SKView *)view
{
if (!self.contentCreated) {
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
self.physicsWorld.gravity = CGVectorMake(0,0);
self.physicsWorld.contactDelegate = self;
self.basket = [SKSpriteNode spriteNodeWithImageNamed:@"basket"];
self.basket.size = CGSizeMake(100, 100);
self.basket.position = CGPointMake(self.frame.size.width/2, self.basket.size.height/2);
self.basket.physicsBody.dynamic = YES; // 2
self.basket.physicsBody.categoryBitMask = basketCategory; // 3
self.basket.physicsBody.contactTestBitMask = ballCategory; // 4
self.basket.physicsBody.collisionBitMask = 0; // 5
self.basket.physicsBody.usesPreciseCollisionDetection = YES;
[self addChild:self.basket];
// self.physicsWorld.contactDelegate = self;
}
}
- (void)addball {
balltime=1;
// Create sprite
self.ball = [SKSpriteNode spriteNodeWithImageNamed:@"basketball"];
self.ball.size = CGSizeMake(100, 100);
self.ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.ball.size]; // 1
self.ball.physicsBody.dynamic = YES; // 2
self.ball.physicsBody.categoryBitMask = ballCategory; // 3
self.ball.physicsBody.contactTestBitMask = basketCategory; // 4
self.ball.physicsBody.collisionBitMask = 0; // 5
self.ball.physicsBody.usesPreciseCollisionDetection = YES;
// self.physicsWorld.contactDelegate = self;
// Determine where to spawn the ball along the x axis
int minX = self.ball.size.width / 2;
int maxX = self.frame.size.width - self.ball.size.width / 2;
int rangeX = maxX - minX;
int actualX = (arc4random() % rangeX) + minX;
// Create the monster slightly off-screen along the right edge,
// and along a random position along the X axis as calculated above
// ball.position = CGPointMake(actualX,self.frame.size.height + ball.size.height/2);
self.ball.position = CGPointMake(actualX,self.frame.size.height + 300);
[self addChild:self.ball];
// Determine speed of the ball
int minDuration = 3.99;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (arc4random() % rangeDuration) + minDuration;
// Create the actions
SKAction * actionMove = [SKAction moveTo:CGPointMake(actualX,-self.ball.size.height/2) duration:actualDuration];
SKAction * actionMoveDone = [SKAction removeFromParent];
SKAction * loseAction = [SKAction runBlock:^{
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:NO];
[self.view presentScene:gameOverScene transition: reveal];
}];
[self.ball runAction:[SKAction sequence:@[actionMove, actionMoveDone]]];
}
- (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)timeSinceLast {
self.lastSpawnTimeInterval += timeSinceLast;
if (self.lastSpawnTimeInterval > balltime) {
self.lastSpawnTimeInterval = 0;
[self addball];
}
}
- (void)update:(NSTimeInterval)currentTime {
// Handle time delta.
// If we drop below 60fps, we still want everything to move the same distance.
CFTimeInterval timeSinceLast = currentTime - self.lastUpdateTimeInterval;
self.lastUpdateTimeInterval = currentTime;
if (timeSinceLast > 1) { // more than a second since last update
timeSinceLast = 1.0 / 60.0;
self.lastUpdateTimeInterval = currentTime;
}
[self updateWithTimeSinceLastUpdate:timeSinceLast];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];
self.basket.position=positionInScene;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];
self.basket.position=positionInScene;
}
- (void)ball:(SKSpriteNode *)ball didCollideWithbasket:(SKSpriteNode *)basket {
NSLog(@"Hit");
[self.ball removeFromParent];
self.ballDestroyed++;
if (self.ballDestroyed > 20) {
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:YES];
[self.view presentScene:gameOverScene transition: reveal];
}
}
- (void)didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"contact");
// 1
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
// 2
if ((firstBody.categoryBitMask & basketCategory) != 0 &&
(secondBody.categoryBitMask & ballCategory) != 0)
{
[self ball:(SKSpriteNode *) firstBody.node didCollideWithbasket:(SKSpriteNode *) secondBody.node];
}
}
最佳答案
尝试移动 <SKPhysicsContactDelegate>
到您的 MyScene.h 文件,并将您的类别位掩码更改为如下所示。 static const uint32_t basketCategory = 0x1 << 0;
并确保设置了冲突位掩码。我发现如果不设置碰撞位掩码,它不会触发接触方法。
关于IOS sprite 套件 didBeginContact 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21954037/
我有两个节点和一个 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 个节点物理交叉时,我一直无法让碰撞发
我是一名优秀的程序员,十分优秀!