gpt4 book ai didi

iOS Box2d/Cocos2d : Sometimes Ignores My Touch, 导致间歇性游戏中断

转载 作者:行者123 更新时间:2023-11-29 02:56:17 25 4
gpt4 key购买 nike

我真的很想深入了解为什么这段代码会导致对触摸输入的间歇性响应...即使将 NSLog 作为第一条指令...

我刚刚用 Box2d 在 cocos2d 中为一个游戏创建了一个新项目,在这个阶段只需要一些简单的东西......

出现在屏幕中央的篮子。它必须是 b2Fixture 并且落在表面上。然后,如果用户触摸了屏幕,我希望篮子缩放到触摸点,然后用户可以从那里在屏幕上拖动它。

当用户放手时,篮子会掉落...我现在正在使用...

但是BUG是触摸屏幕并不总是有效......它间歇性地响应触摸,因此间歇性地调用方法。

正如您将在下面看到的,我使用了 NSLog 来检查每个方法何时被调用。结果是有时你必须将手指从屏幕上抬起然后再抬起几次,然后“看似随机”,它会决定运行代码....

这是我得到的...

我的触摸方法....

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Multi Touch Moved...");
if (_mouseJoint == NULL) return;

UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

_mouseJoint->SetTarget(locationWorld);
}

-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{
NSLog(@"\nThe touch was CANCELED...");
}

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
NSLog(@"Single Touch Moved...");
}

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

NSLog(@"\n\nTouch did begin...");

if (_mouseJoint != NULL)
{
_mouseJoint->SetTarget(locationWorld);
NSLog(@"The IF statment was met...");
return;
}

NSLog(@"The IF statment was NOT met...Running _mouseJoint setup...");

b2MouseJointDef md;
md.bodyA = _groundBody;
md.bodyB = _body;
md.target = _body->GetPosition();
md.collideConnected = true;
md.maxForce = 100000000.0f * _body->GetMass();
_mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md);
_body->SetAwake(true);

_mouseJoint->SetTarget(locationWorld);
}

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if (_mouseJoint != nil) {
_world->DestroyJoint(_mouseJoint);
_mouseJoint = nil;
}
}

这是一些代码引用的接口(interface)......

@interface HelloWorldLayer : CCLayerColor
{
b2World *_world;
b2Body *_body;
b2Fixture *_bodyFix;
b2MouseJoint *_mouseJoint;
b2Body *_groundBody;
}

另一个成员帮助我确定的唯一想法是,因为我在一个场景中工作,并且我在屏幕上有一个 CCMenu 和一个 CCLabelTTF,CCMenu 是否有可能仍在拦截触摸,并且如果是这样,我如何在动画完成后销毁 CCMenu?

按下唯一的按钮项目只是简单地将标题和标签(CCMenuItem)垂直移出屏幕......但对象仍然存在......

最佳答案

这里的问题是我的 CCMenu 仍在接收触摸(我假设在屏幕的某些部分形成了 CCMenuItems)。

解决方案是在我的 @implementation 中而不是在我的 init 场景设置中声明我的 CCMenu

@implementation HelloWorldLayer
{
CCLabelTTF *label;
CCLabelTTF *startTheGameLabel;
CCSprite *theCattery;
CCMenu *_menu;
}

然后在我的 init 中,我没有在那里声明它,而是简单地分配给 @implementation 中的那个。

-(id) init { if( (self=[super initWithColor:ccc4(50, 180, 220, 255)]) )
{
//.. Other "irrelevant to question" scene setup stuff here...//

// Start the game button
startTheGameLabel = [CCLabelTTF labelWithString:@"Save Some Kitties!" fontName:@"Zapfino" fontSize:20];
CCMenuItemLabel *startTheGameLabelItem = [CCMenuItemLabel itemWithLabel:startTheGameLabel target:self selector:@selector(startGameStub:)];

// Push the menu
_menu = [CCMenu menuWithItems: startTheGameLabelItem, nil];
[self addChild:_menu];

//.. Other "irrelevant to question" scene setup stuff here...//
}

这使我可以在整个类里面访问 CCMenu,因此我可以稍后在用户做出选择后禁用触摸输入。

-(void) startGameStub:(id)sender
{
CGSize size = [[CCDirector sharedDirector] winSize];

// Clear the labels off the screen
CMoveTo *moveTheTitleLabelAction = [CCMoveTo actionWithDuration:1.0 position:ccp(label.position.x, size.height + label.boundingBox.size.height)];
CCMoveTo *moveTheStartLabelAction = [CCMoveTo actionWithDuration:1.0 position:ccp(startTheGameLabel.position.x, size.height + startTheGameLabel.boundingBox.size.height)];

// Commit actions
[label runAction:moveTheTitleLabelAction];
[startTheGameLabel runAction:moveTheStartLabelAction];

// LIFE SAVING MESSAGE!!!
[_menu setTouchEnabled:NO]; // This is what fixes the problem
}

关于iOS Box2d/Cocos2d : Sometimes Ignores My Touch, 导致间歇性游戏中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23882360/

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