当我点击按钮时,我正在尝试移动UIImageView。我已经设置了一个UIIAction来启动NSTimer。点击按钮时,角色(UIImageView)移动正常。当我再次点击相同的按钮时,角色会加速等等,所以最终他的速度达到了10亿英里/小时。我该如何解决这个问题?这是代码:
-(void)animateCharRight:(NSTimer *)theTimer
{
float speed;
if (speed > 10.0f)
{
speed = 10.0f;
}
else
{
speed = 10.0f;
}
CGRect rect = [character frame];
rect.origin.x += speed;
[character setFrame:rect];
}
此外,当您按下相反按钮后按相反按钮时,它会因为没有取消另一个计时器而错误。我该怎么做?
如何访问按键事件?我似乎无法找到它。
答案 0 :(得分:2)
你在方法中声明速度并且不要将它设置为任何东西。因此总是将其他速度设置为10.0f。因为你在if和else中都将它设置为10,那么if语句的重点是什么?
然后你rect.origin.x += speed;
或者一直添加10个原点,没有例外。它与执行rect.origin.x += 10;
相同。图像将不断移动。
速度总是为10,并且总是添加到rect.origin.x
你想让速度变成实例变量而不仅仅是在方法中吗?
修改强>
因为每次将0作为值时,都会在方法中声明速度。然后将其设置为10.如果您将速度创建为成员变量,则每次调用animateCharRight
时都可以执行类似
speed += speedIncrementAmount;
或
speed += 1.0f;
每次速度增加1个单位或游戏所需的时间。
然后根据你的逻辑,你需要进行几次检查。
if (speed > 10.0f)
{
// This will clamp the speed at 10.0f;
speed = 10.0f;
}
if (speed < - 10.0f)
{
// This will make sure you will never go left to quickly
speed = - 10.0f;
}
以上if语句可能有效,也可能无效。取决于使用。如果游戏是侧边小人,你只想向右移动,那么你可能想要确保速度永远不会低于0.
想想你想要的设计。
由于您不熟悉游戏编程,我将从教程开始,并以本教程中学到的技能为基础。 Here是我在Google快速搜索中找到的link。
记住没有人像第一场比赛一样制造毁灭战士。每个人都以破砖者或俄罗斯方块开头,这是游戏编程的“Hello World”。
答案 1 :(得分:2)
听起来你可能会在每个按钮上启动一个新计时器。因此,在2次点击后,您现在有2个计时器,每个计时器将调用-animateCharRight:
移动您的视图10,总共20个。更多点击,更快,等等。那是怎么回事?
答案 2 :(得分:1)
我认为你的问题是当你释放移动键时你没有将速度设置回零。您应该在keyup事件触发后立即重置,或者如果您希望角色在释放键后保持移动一段时间,则可以在计时器到期后将速度设置为零。
答案 3 :(得分:1)
该方法将始终将您的角色移动10.但是,每次按下按钮时,您似乎都在启动新的计时器。因此,如果您按下按钮3次,角色将移动3x10 = 30。您需要取消现有的计时器,因此始终只有一个计时器。
您可以使用NSTimer
取消[timer invalidate]
个实例。 (See here)