我正在尝试在游戏中实现网格运动。网格有一列和三行。
[ ] Y3 - 60 % of height
[ ] Y2 - 40% of height
[ ] Y1 - 20% of height
在3.5英寸的iphone中,这些高度为:
[ ] Y3 - 193px
[ ] Y2 - 128px
[ ] Y1 - 64px
当用户点击NPC上方的屏幕时,NPC应该移动到他上方的下一个小区(例如,如果NPC在Y1中,他应该转到Y2)。同样的事情应该发生在相反的方向。但是,NPC不应该高于193px或低于64px。哪个没有发生。如果你点击两次,当NPC移动时,他开始移动得更快并忽略了研磨,并且高于/低于边界。
这是我的代码。如何改进它以做我想做的事?
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [touch locationInNode:self];
positionY1 = self.contentSize.height*.2;
positionY2 = self.contentSize.height*.40;
positionY3 = self.contentSize.height*.60;
float playerMove;
if (touchLocation.y > _player.position.y) {
if (_player.position.y >= positionY3) {
NSLog(@"decisao 1");
playerMove = positionY3;
} else if (_player.position.y >= positionY2 && _player.position.y <= positionY3) {
NSLog(@"decisao 2");
playerMove = positionY3;
} else if (_player.position.y >= positionY1 && _player.position.y <= positionY2) {
NSLog(@"decisao 3");
playerMove = positionY2;
} else if (_player.position.y <= positionY1) {
NSLog(@"decisao 4");
playerMove = positionY1;
}
} else if ((touchLocation.y < _player.position.y)) {
if (_player.position.y <= positionY1) {
NSLog(@"decisao 5");
playerMove = positionY1;
} else if (_player.position.y >= positionY1 && _player.position.y <= positionY2) {
NSLog(@"decisao 6");
playerMove = positionY1;
} else if (_player.position.y >= positionY2 && _player.position.y <= positionY3) {
NSLog(@"decisao 7");
playerMove = positionY2;
} else if (_player.position.y >= positionY3) {
NSLog(@"decisao 8");
playerMove = positionY3;
}
}
// Move our sprite to touch location
CCActionMoveTo *actionMove = [CCActionMoveTo actionWithDuration:1.0f position:CGPointMake(_player.position.x, playerMove)];
[_player runAction:actionMove];
}
答案 0 :(得分:2)
一个问题当然是您允许多个移动操作停止,因此每次您点击另一个移动操作都会运行,无论是否已经有移动操作正在运行。因此,在运行新动作之前删除它们(或所有动作):
[_player stopAllActions]; // or: remove by tag
[_player runAction:actionMove];
接下来,如果你的if / else都不为true,那么playerMove的值将保持未定义:
float playerMove;
如果发生这种情况,变量可以随机保存任何值,可能会使节点移动远离屏幕。这样看起来像精灵就会消失,让你很难弄清楚发生了什么。
总是使用默认值初始化标准值类型是一种很好的做法,非常好的做法:
float playerMove = 0.0;