gpt4 book ai didi

objective-c - Box2D 动态体卡住(iPhone)

转载 作者:行者123 更新时间:2023-12-01 17:34:56 25 4
gpt4 key购买 nike

我有一个地面物体和一个矛形物体(动态)。当一个按钮被按下时,一个线速度被应用到长矛上。它工作正常,但有时会卡在地上。这种情况大多数时候(并非总是)发生在矛皮的对面直接与地面碰撞时。我附上一些图片,让你们得到图片:
enter image description here

这是我的代码:

#import "HelloWorldLayer.h"

#define PTM_RATIO 32


@implementation HelloWorldLayer

+(CCScene *) scene{
CCScene *scene = [CCScene node];

HelloWorldLayer *layer = [HelloWorldLayer node];
[scene addChild: layer];

return scene;
}

-(id) init {

if( (self=[super init])) {

isSimulating = NO;

CGSize winSize = [CCDirector sharedDirector].winSize;

self.isAccelerometerEnabled = YES;
self.isTouchEnabled = YES;

// Create sprite and add it to the layer
_spear = [CCSprite spriteWithFile:@"image_SPEAR.png"];
_spear.position = ccp(40, 30);

[self addChild:_spear];


label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:20];
CGSize size = [[CCDirector sharedDirector] winSize];
label.position = ccp( size.width /2 , size.height/2 );
[self addChild: label];

CCMenuItem *starMenuItem = [CCMenuItemImage
itemFromNormalImage:@"ball.png" selectedImage:@"ball.png"
target:self selector:@selector(starButtonTapped:)];
starMenuItem.position = ccp(60, 250);
CCMenu *starMenu = [CCMenu menuWithItems:starMenuItem, nil];
starMenu.position = CGPointZero;
[self addChild:starMenu];


// Create a world
b2Vec2 gravity = b2Vec2(0.0f, -20.0f);
bool doSleep = true;
_world = new b2World(gravity, doSleep);

// Create edges around the entire screen
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body *groundBody = _world->CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
boxShapeDef.friction = 0.3f;


[self setup];

}
return self;
}

- (void)setup {

NSLog(@"Setting up...");
//set the sprite's initial position
_spear.position = ccp(40, 30);
_spear.rotation = 0.0f;


//row 1, col 1
int num = 7;
b2Vec2 verts[] = {
b2Vec2(-36.0f / PTM_RATIO, -2.7f / PTM_RATIO),
b2Vec2(20.1f / PTM_RATIO, -2.1f / PTM_RATIO),
b2Vec2(24.4f / PTM_RATIO, -4.6f / PTM_RATIO),
b2Vec2(36.7f / PTM_RATIO, -1.4f / PTM_RATIO),
b2Vec2(23.9f / PTM_RATIO, 2.7f / PTM_RATIO),
b2Vec2(20.7f / PTM_RATIO, 0.0f / PTM_RATIO),
b2Vec2(-36.0f / PTM_RATIO, -0.5f / PTM_RATIO)
};






// Create spear body and shape
b2BodyDef spearBodyDef;
spearBodyDef.type = b2_dynamicBody;
spearBodyDef.position.Set(40.0/PTM_RATIO, 30.0/PTM_RATIO);
//spearBodyDef.angle = 45.0 * (180.0f/b2_pi);
spearBodyDef.userData = _spear;
_spearBody = _world->CreateBody(&spearBodyDef);

b2PolygonShape spearShape;
spearShape.Set(verts, num);

b2FixtureDef spearShapeDef;
spearShapeDef.shape = &spearShape;
spearShapeDef.density = 0.75f;
spearShapeDef.friction = 0.2f;
spearShapeDef.restitution = 0.2f;
_spearBody->CreateFixture(&spearShapeDef);

}


- (void)starButtonTapped:(id)sender {

if (isSimulating) {
NSLog(@"Not simulating now...");

[self unschedule:@selector(tick:)];
_world->DestroyBody(_spearBody);
_spearBody = NULL;
[self setup];
} else {
NSLog(@"Simulating now...");
[self schedule:@selector(tick:)];

float angle = _spearBody->GetAngle();

b2Vec2 force;
force.Set(cos(angle) * 15.0f , sin(angle) * 15.0f);
_spearBody->SetLinearVelocity(force);
}
isSimulating = !isSimulating;

}

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

if (!isSimulating) {

UITouch* touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
location = [[CCDirector sharedDirector] convertToGL: location];

float angleRadians = atanf((float)location.y / (float)location.x);
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);

_spear.rotation = -1 * angleDegrees;
_spearBody->SetTransform(_spearBody->GetPosition(), angleRadians);

[label setString:[NSString stringWithFormat:@"Angle: %f X: %f Y:%f", angleDegrees, location.x, location.y]];
NSLog(@"%@", @"touched");

}

}



- (void)tick:(ccTime) dt {
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *ballData = (CCSprite *)b->GetUserData();
ballData.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}

- (void) dealloc {
delete _world;
_world = NULL;

[super dealloc];
}
@end

我猜这与摩擦和恢复有关,但我尝试了很多值(value)观,但没有什么能让这种行为消失。谢谢。

**更新:**我弄清楚是什么原因造成的。每次卡住的时候,就是长矛离开groundBody的时候。每次。但是,为什么它首先会出现在 groundBody 之外呢?这是显示此内容的图像。在底部,长矛在 body 之外:
enter image description here

最佳答案

试试关掉 sleep ...

bool doSleep = false;
_world = new b2World(gravity, doSleep);

我在我的一个基于 box2d 的游戏中遇到了类似的问题,而这个“功能”就是导致它的原因。

关于objective-c - Box2D 动态体卡住(iPhone),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com