作成中のプレーヤー コントローラーのアルゴリズムに問題があります。Cocos2D を使用してプラットフォーマー スタイルのゲームを作成しています (スーパー マリオ ブラザーズを考えてください)。私のコントローラーには左右のボタンがあり、画面の右半分をタッチするとジャンプします。
私が抱えている問題は、右または左のボタンを押したまま画面を押してジャンプし、方向ボタンを放すと、ユーザーが画面から指を離すまでプレーヤーがその方向に進み続けることです。 .
もう 1 つの問題は、ユーザーが画面を保持してジャンプし、方向ボタンをタップしてから、画面を保持したまま方向ボタンを放すと、プレイヤーはその方向に進み続けることです。プレイヤーが画面を離すと停止する時間の半分は、画面が再びタップされるまで、残りの半分の時間は離し続けます。
これは、コントローラーのどの部分がタップされているかを登録するための私のコードです。
- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch* touch in touches)
{
CGPoint point = [self convertTouchToNodeSpace: touch];
// Create a rect around right half of the window
CGSize winSize = [CCDirector sharedDirector].winSize;
CGRect jumpBox = CGRectMake(winSize.width / 2,
0,
winSize.width / 2,
winSize.height);
// left button
if (CGRectContainsPoint(leftButtonSprite.boundingBox, point))
{
self.isPressingLeftButton = YES;
self.isPressingRightButton = NO;
}
// right button
else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point))
{
self.isPressingRightButton = YES;
self.isPressingLeftButton = NO;
}
// player's trying to jump
if (CGRectContainsPoint(jumpBox, point))
{
self.isTouchingScreen = YES;
}
}
}
- (void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch* touch in touches)
{
CGPoint point = [self convertTouchToNodeSpace: touch];
// Create a rect around right half of the window
CGSize winSize = [CCDirector sharedDirector].winSize;
CGRect jumpBox = CGRectMake(winSize.width / 2,
0,
winSize.width / 2,
winSize.height);
// left button
if (CGRectContainsPoint(leftButtonSprite.boundingBox, point))
{
// CCLOG(@"Pressing left");
self.isPressingLeftButton = YES;
self.isPressingRightButton = NO;
}
// right button
else if (CGRectContainsPoint(rightButtonSprite.boundingBox, point))
{
// CCLOG(@"Pressing right");
self.isPressingRightButton = YES;
self.isPressingLeftButton = NO;
}
// player's trying to jump
if (CGRectContainsPoint(jumpBox, point))
{
// CCLOG(@"Jumping");
self.isTouchingScreen = YES;
}
}
}
- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if (self.isTouchingScreen)
{
CCLOG(@"Stop jumping");
self.isTouchingScreen = NO;
}
else
{
CCLOG(@"Stop moving");
self.isPressingLeftButton = NO;
self.isPressingRightButton = NO;
}
}
このコードは、 myHUDLayer.m
の子である my にありGameplayLayer.m
ます。GameplayLayer はupdate:
、HUDLayer のどのフラグが設定されているかを判断するために使用し、それに応じてプレイヤーを動かします