我正在为iPhone制作一款已经上市约一个月的游戏。我有不同颜色的球从屏幕顶部落下,底部有一个密封圈,玩家可以控制它来抓住它们。因为它们应该创建一个随每个新球一起增长的堆栈,类似于Scoops!目前在应用程序商店。我有一个身体和形状,每个新的球精灵,他们受到重力的影响。但是密封不会受到重力的影响,但我需要它进行collsion检测,以检测第一个球和每个后续球击中它并被添加到堆叠中的时间。我已经尝试过applyForce并施加了一个抵抗重力的力,这种方法直到一个球与密封件发生碰撞,然后它从屏幕上下沉。有人可以帮忙...我的代码很长,但我可以发布下面问题对象的主要部分:
-(void) AddSealSprite {
Seal = [CCSprite spriteWithFile:@"Seal2Inverted.png"];
Seal.position = ccp(160, 0);
[self addChild: Seal z:1];
Seal.tag = 2;
cpBody *SealBody = cpBodyNew(1, INFINITY);
SealBody->p = cpv(160, 0);
cpSpaceAddBody(space, SealBody);
//Creates Seal shape
int NumberOfVerts = 4;
CGPoint SealVerts[] = {
ccp(-60, -60),
ccp(60, -60),
ccp(60, 60),
ccp(-60, 60),
};
cpShape *SealShape = cpCircleShapeNew(SealBody, 100, cpvzero);
SealShape->e = 0.5;
SealShape->u = 1.0;
SealShape->data = Seal;
cpSpaceAddShape(space, SealShape);
// here is my gravity offset...
cpBodyApplyForce(SealBody, cpv(0, NumberOfBallsInStack * 200), cpvzero);
}
和球精灵方法
-(void) addNewSpriteX: (float)x y:(float)y
{
int posx, posy;
CCSpriteBatchNode *batch = (CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode];
posy = 0;
//New Random sprite code
switch (arc4random() % 5) {
case 0:
posx = 0;
break;
case 1:
posx = 60;
break;
case 2:
posx = 120;
break;
case 3:
posx = 180;
break;
case 4:
posx = 240;
break;
}
CCSprite *sprite = [CCSprite spriteWithBatchNode:batch rect:CGRectMake(posx, posy, 60, 60)];
[batch addChild: sprite];
sprite.position = ccp(x,y);
int num = 4;
CGPoint verts[] = {
ccp(-30, -30),
ccp(-30, 30),
ccp( 30, 30),
ccp( 30,-30),
};
cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, CGPointZero));
// TIP:
// since v0.7.1 you can assign CGPoint to chipmunk instead of cpVect.
// cpVect == CGPoint
body->p = ccp(x, y);
cpSpaceAddBody(space, body);
cpShape* shape = cpPolyShapeNew(body, num, verts, CGPointZero);
shape->e = 0.5f; shape->u = 0.5f;
shape->data = sprite;
cpSpaceAddShape(space, shape);
}
答案 0 :(得分:0)
你有一种可能性就是给予密封无限质量:
cpBody *SealBody = cpBodyNew(INFINITY, INFINITY);
以这种方式,它不会受到重力的影响。
如果移动印章,则需要调用cpHashResizeStaticHash
以便花栗鼠可以将其考虑在内(静态物体不会作为优化方式添加到空间中)。
答案 1 :(得分:0)
我不打算仔细阅读你的所有代码并告诉你一些简单的事情,这会节省你一些时间。
由于您使用的是Cocos2d,请创建一个ccTime函数。 Here是关于其他一些内容以及如何使用ccTime的教程。
在你的ccTime中,你的精灵(球)需要减去少量的y坐标(该数量取决于调用ccTime的频率)。简短的例子:
@interface Ball : Sprite {
float vx;
float vy;
float gravity;
float bounce;
}
@property float vx;
@property float vy;
- (void)update:(ccTime)dt;
@end
@implementation Ball
@synthesize vx;
@synthesize vy;
- (id) init
{
self = [super init];
if (self != nil) {
gravity = -20.0;
bounce = -0.7;
Sprite *ball = [Sprite spriteWithFile:@"Ball.png"];
[self addChild:ball];
[self schedule:@selector(update:)];
}
return self;
}
- (void)update:(ccTime)dt
{
float x = self.position.x;
float y = self.position.y;
vy += gravity; // You are essentially subtracting from the y axis of your sprite.
x += vx * dt;
y += vy * dt;
self.position = ccp(x, y);
}
@end
这不是一个legitimage程序,但通过查看它你可以看到它是如何工作的。