我有几个关于SKNodes和/或SKSpriteNodes动画的问题。第一个问题是如何在视图加载后让它们移动?我如何让它们相互碰撞和反弹,然后走向另一个方向。为此,我使用了一个SKScene。另外,有没有一种方法可以用SKLabels对SKSriteNodes进行分组?
我有:
#import <SpriteKit/SpriteKit.h>
//constants for the collision bitmap
static const uint32_t classicCategory = 1 << 0;
static const uint32_t arcadeCategory = 1 << 1;
static const uint32_t frenzieCategory = 1 << 2;
@interface HomeScene : SKScene <SKPhysicsContactDelegate> {
BOOL isSoundActionCompleted;
}
@end
下面是我声明SKSpriteNodes的地方
SKSpriteNode *classicMode = [SKSpriteNode spriteNodeWithImageNamed:@"bubble.png"];
classicMode.size = CGSizeMake(130, 130);
classicMode.position = CGPointMake(self.size.width/2, self.size.height/2+50);
classicMode.name = @"classicMode";
[self addChild:classicMode];
SKLabelNode *classicTitle = [SKLabelNode labelNodeWithFontNamed:@"Noteworthy"];
classicTitle.text = @"Classic";
classicTitle.fontSize = 25;
classicTitle.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter;
classicTitle.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
classicTitle.fontColor = [SKColor darkGrayColor];
classicTitle.position = CGPointMake(self.size.width/2, self.size.height/2+50);
classicTitle.name = @"classicTitle";
[self addChild:classicTitle];
另一个在这里
SKSpriteNode *arcadeMode = [SKSpriteNode spriteNodeWithImageNamed:@"bubble.png"];
arcadeMode.size = CGSizeMake(130, 130);
arcadeMode.position = CGPointMake(self.size.width/2+68, self.size.height/2-65);
arcadeMode.name = @"arcadeMode";
[self addChild:arcadeMode];
SKLabelNode *arcadeTitle = [SKLabelNode labelNodeWithFontNamed:@"Noteworthy"];
arcadeTitle.text = @"Arcade";
arcadeTitle.fontSize = 25;
arcadeTitle.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter;
arcadeTitle.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
arcadeTitle.fontColor = [SKColor darkGrayColor];
arcadeTitle.position = CGPointMake(self.size.width/2+68, self.size.height/2-65);
arcadeTitle.name = @"arcadeTitle";
[self addChild:arcadeTitle];
冲突:
//collision and contact detection
self.physicsBody.categoryBitMask = arcadeCategory;
//physics and collision detection
classicMode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:classicMode.size];
classicMode.physicsBody.dynamic = NO; //no gravity
classicMode.physicsBody.categoryBitMask = arcadeCategory;
arcadeMode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:arcadeMode.size];
arcadeMode.physicsBody.dynamic = NO; //no gravity
arcadeMode.physicsBody.categoryBitMask = classicCategory;
和碰撞检测:
//collision detection
classicMode.physicsBody.categoryBitMask = classicCategory;
classicMode.physicsBody.collisionBitMask = arcadeCategory;
classicMode.physicsBody.contactTestBitMask = arcadeCategory;
arcadeMode.physicsBody.categoryBitMask = arcadeCategory;
arcadeMode.physicsBody.collisionBitMask = classicCategory;
arcadeMode.physicsBody.contactTestBitMask = classicCategory;
发布于 2014-09-27 18:02:13
1)代码中的第一个问题是,两个静态实体永远不会发生冲突,从而使它们成为动态的。因此,至少使一个或两个身体为动力学。
2)其次,对于线性运动,对动态身体使用body.physicsBody.velocity属性。
3)修改位掩码类别classicMode.physicsBody.categoryBitMask = classicCategory;classicMode.physicsBody.collisionBitMask = arcadeCategory;classicMode.physicsBody.contactTestBitMask = arcadeCategory;
arcadeMode.physicsBody.categoryBitMask = arcadeCategory;
请记住,当两个物体相互接触或碰撞时,contactTestBitMask在spritekit中使用,而collisionBitMask用于使它们相互重叠或穿过
我从您的代码中删除了arcadeMode.physicsBody.collisionBitMask = classicCategory;arcadeMode.physicsBody.contactTestBitMask = classicCategory;,因为您已经在classicMode.physicsBody.categoryBitMask = classicCategory;classicMode.physicsBody.collisionBitMask = arcadeCategory;classicMode.physicsBody.contactTestBitMask = arcadeCategory;中定义了它,所以不需要修改它
当您想要两个类别相互交互时,只能使用contactTestBitMask和collisionBitMask一次
4)在didbegincontact和didEndContact中处理所有的冲突和冲突逻辑
https://stackoverflow.com/questions/26028844
复制相似问题