Objective c Box2d Cocos2d转盘与地面接触时发生碰撞
这是我在这里的第一个问题,如果我做错了什么,或者这太长了,很抱歉。我一直在阅读Ray Wenderlich的作品,我对其进行了修改,使其更加平缓,并逐渐走下坡路。基本上我有一个球从崎岖不平的小山上滚下来,但现在球只从上面大约100像素处落下。触摸时,应用程序崩溃(该应用程序是Mac Cocos2d Box2d应用程序)。球码是这样的:Objective c Box2d Cocos2d转盘与地面接触时发生碰撞,objective-c,crash,cocos2d-iphone,box2d,collision,Objective C,Crash,Cocos2d Iphone,Box2d,Collision,这是我在这里的第一个问题,如果我做错了什么,或者这太长了,很抱歉。我一直在阅读Ray Wenderlich的作品,我对其进行了修改,使其更加平缓,并逐渐走下坡路。基本上我有一个球从崎岖不平的小山上滚下来,但现在球只从上面大约100像素处落下。触摸时,应用程序崩溃(该应用程序是Mac Cocos2d Box2d应用程序)。球码是这样的: CGSize winSize = [CCDirector sharedDirector].winSize; self.oeva = [CCSprite sprit
CGSize winSize = [CCDirector sharedDirector].winSize;
self.oeva = [CCSprite spriteWithTexture:[[CCTextureCache sharedTextureCache] addImage:@"Ball.png"]rect:CGRectMake(0, 0, 64, 64)];
_oeva.position = CGPointMake(68, winSize.height/2);
[self addChild:_oeva z:1];
b2BodyDef oevaBodyDef;
oevaBodyDef.type = b2_dynamicBody;
oevaBodyDef.position.Set(68/PTM_RATIO, (winSize.height/2)/PTM_RATIO);
// oevaBodyDef.userData = _oeva;
_oevaBody = world->CreateBody(&oevaBodyDef);
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(60/PTM_RATIO, 400/PTM_RATIO);
bodyDef.userData = _oeva;
b2Body *body = world->CreateBody(&bodyDef);
// Define another box shape for our dynamic body.
b2CircleShape dynamicBox;
dynamicBox.m_radius = 70/PTM_RATIO;//These are mid points for our 1m box
// Define the dynamic body fixture.
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);
那很好。这是地形代码,也可以正常工作:
-(void)generateTerrainWithWorld: (b2World *) inputWorld: (int) hillSize;{
b2BodyDef bd;
bd.position.Set(0, 0);
body = inputWorld->CreateBody(&bd);
b2PolygonShape shape;
b2FixtureDef fixtureDef;
currentSlope = 0;
CGSize winSize = [CCDirector sharedDirector].winSize;
float xf = 0;
float yf = (arc4random() % 10)+winSize.height/3;
int x = 200;
for(int i = 0; i < maxHillPoints; ++i) {
hillPoints[i] = CGPointMake(xf, yf);
xf = xf+ (arc4random() % x/2)+x/2;
yf = ((arc4random() % 30)+winSize.height/3)-currentSlope;
currentSlope +=10;
}
int hSegments;
for (int i=0; i<maxHillPoints-1; i++) {
CGPoint p0 = hillPoints[i-1];
CGPoint p1 = hillPoints[i];
hSegments = floorf((p1.x-p0.x)/cosineSegmentWidth);
float dx = (p1.x - p0.x) / hSegments;
float da = M_PI / hSegments;
float ymid = (p0.y + p1.y) / 2;
float ampl = (p0.y - p1.y) / 2;
CGPoint pt0, pt1;
pt0 = p0;
for (int j = 0; j < hSegments+1; ++j) {
pt1.x = p0.x + j*dx;
pt1.y = ymid + ampl * cosf(da*j);
fullHillPoints[fullHillPointsCount++] = pt1;
pt0 = pt1;
}
}
b2Vec2 p1v, p2v;
for (int i=0; i<fullHillPointsCount-1; i++) {
p1v = b2Vec2(fullHillPoints[i].x/PTM_RATIO,fullHillPoints[i].y/PTM_RATIO);
p2v = b2Vec2(fullHillPoints[i+1].x/PTM_RATIO,fullHillPoints[i+1].y/PTM_RATIO);
shape.SetAsEdge(p1v, p2v);
body->CreateFixture(&shape, 0);
}
错误日志为:
断言失败:(kNormal>1.19209290e-7F),函数b2ContactSolver,文件/Users/coooli01/Documents/Xcode Projects/cococs2d/Hill Slide/Hill Slide/libs/Box2D/Dynamics/Contacts/b2ContactSolver.cpp,第96行
对不起,如果我说得太久了,我已经被困在这个问题上很久了
这种碰撞通常发生在两个物体质量均为零的情况下
你的地面不需要有质量,因为它是由边缘组成的,但是你的身体应该有质量(通过设置密度)。我看到您正在设置密度,但请确保在碰撞时未更改密度。这看起来不健康:
for (int i=0; i<maxHillPoints-1; i++) {
CGPoint p0 = hillPoints[i-1];//first iteration accesses hillPoints[-1]
for(int i=0;iThanks我现在来看看。非常感谢!我不敢相信导致这次崩溃的唯一原因就是1个数字!如果可以的话我会投赞成票,但我需要更多的声誉。一个掉一个肯定是计算机科学中最常见的错误。
for (int i=0; i<maxHillPoints-1; i++) {
CGPoint p0 = hillPoints[i-1];//first iteration accesses hillPoints[-1]