Iphone Can';不要移动我的角色
当我点击一个按钮时,我试图移动UIImageView。我已设置启动NSTimer的选项。点击该按钮时,角色(UIImageView)会移动自如。当我再次点击同一个按钮时,角色会加速,以此类推,最终他会以十亿英里/小时的速度移动。我如何解决这个问题?代码如下:Iphone Can';不要移动我的角色,iphone,objective-c,uiimageview,Iphone,Objective C,Uiimageview,当我点击一个按钮时,我试图移动UIImageView。我已设置启动NSTimer的选项。点击该按钮时,角色(UIImageView)会移动自如。当我再次点击同一个按钮时,角色会加速,以此类推,最终他会以十亿英里/小时的速度移动。我如何解决这个问题?代码如下: -(void)animateCharRight:(NSTimer *)theTimer { float speed; if (speed > 10.0f) { speed = 10.0
-(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];
}
另外,当你按下一个相反的按钮后,它会出错,因为没有取消另一个计时器。我该怎么做
如何访问密钥更新事件?我好像找不到。我想你的问题是,当你松开钥匙移动时,你没有将速度设置回零。您应该在keyup事件触发后立即重置,或者如果您希望角色在释放密钥后继续移动一段时间,您可以在时间过期后使用计时器将速度设置为零。您在方法中声明速度,而不将其设置为任何值。因此,它总是将速度设置为10.0f。因为在if和else中都将其设置为10,那么if语句的意义是什么呢 然后你
rect.origin.x+=速度代码>或始终添加10个原点,无例外。这与执行rect.origin.x+=10相同代码>图像将不断移动
速度始终为10,并且始终添加到rect.origin.x
是否要将速度设置为实例变量而不仅仅是方法中的变量
编辑
因为每次速度值为0时,它都在方法中声明。然后设置为10。如果将速度创建为成员变量,则每次调用animateCharRight
时,都可以执行以下操作
speed += speedIncrementAmount;
或
这意味着每次速度增加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(速度>10.0f)
{
//这将把速度限制在10.0f;
速度=10.0f;
}
如果(速度<-10.0f)
{
//这将确保你永远不会快速向左走
速度=-10.0华氏度;
}
上述if语句可能有效,也可能无效。取决于用途。如果游戏是侧滑板车,您只想向右移动,那么您可能需要确保速度永远不低于0
考虑一下你想要的设计
由于您是游戏编程新手,我将从一个教程开始,并在教程中学习的技能的基础上进行构建。这是我在谷歌快速搜索中找到的一个
记住,没有人会因为第一场比赛而注定失败。每个人都会从一个砖块破解或俄罗斯方块开始,这是游戏编程的“你好世界”。听起来你可能会在每次点击按钮时启动一个新的计时器。因此,轻敲两下后,您现在有2个计时器,每个计时器将调用-animatecharlight:
以移动视图10,总共20次。更多的点击,更快,等等。是这样吗?该方法将始终将角色移动10。但是,似乎每次按下按钮时都会启动一个新计时器。因此,如果按下按钮3次,角色移动3x10=30。您需要取消现有计时器,以便始终只有一个计时器在运行
您可以使用[timer invalidate]
取消NSTimer
实例。()请编辑问题,并在tab按钮上方用反勾号将代码分块。我是游戏编程新手,所以这可能是垃圾,但每次点击按钮,角色都会加快速度。我假设每轻敲一次,速度变量都会增加10.0f。因此,我正在检查“速度”是否超过10,如果是,请将其设置回10。如果不是,那就定在10号。如果这是完全错误的,请纠正我,因为就像我说的,我对这一切都很陌生。谢谢你,大卫。这很有帮助。但是现在,当另一个计时器被激活以防止角色四处跳跃时,我该如何使另一个计时器无效?是的,我相信这就是正在发生的事情。我将把[timer invalidate]方法放在哪里,用什么替换“timer”?
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;
}