2010-06-04 53 views
2

我想在按下按钮时进行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]; 
} 

此外,当您按下按钮,相反你已经按下一个它的错误后,因为没有其他定时器的取消。我怎么做?

如何访问密钥注册事件?我似乎无法找到它。

+1

请编辑问题并将块代码放在tab按钮上方的反引号中。 – 2010-06-04 19:41:11

回答

2

听起来像你可能会在每个按钮水龙头上启动一个新的计时器。因此,在2次点击之后,您现在有2个定时器,其中每个定时器都会调用-animateCharRight:来移动您的视图10,总共为20个。点击更多,速度更快等等。这是怎么回事?

+0

是的,这就是我相信的事情。我会在哪里放[定时器无效]方法,我会用什么替换“定时器”? – tallen11 2010-06-04 20:52:49

1

我认为你的问题是,当你释放移动键时你没有将速度设置为零。你应该在keyup事件发生后立即复位,或者在释放键后让角色继续移动一会儿,在计时器到期后可以将速度设置为零。

2

那么你在你的方法中声明速度并且不要将它设置为任何值。所以它总是会把速度设置为10.0f。因为在你的if和else中,你都将它设置为10,那么if语句的重点是什么?

那么你rect.origin.x += speed;或者始终添加10个原点,没有例外。这和做rect.origin.x += 10;一样图像会不断移动。

速度总是会是10,并且总是加上rect.origin.x你想让速度成为实例变量而不仅仅是方法吗?

EDIT

因为速度的方法中,每次声明它具有0作为值。然后,如果你创建速度作为成员变量,则每次animateCharRight是叫你可以这样做

speed += speedIncrementAmount; 

speed += 1.0f; 

每个速度提高时这意味着它设置为10。 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是一个link我在快速Google搜索中找到的一个。

记得没人会让Doom成为第一场比赛。每个人都开始使用Brick Breaker或Tetris,这是游戏编程的'Hello World'。

+0

我是新来的游戏编程,所以这可能是垃圾,但每次你点击按钮的人物获得速度。我假设10.0f被添加到每个水龙头的速度变量。所以我正在检查“速度”是否超过10,如果是,请将其设置回10.如果不是这样做的话10.如果这是完全错误的,请纠正我,因为像我说的,我很漂亮所有这一切都是新的。 – tallen11 2010-06-04 19:54:46

+0

@泰特艾伦:看我的编辑。 – 2010-06-04 20:42:41

+0

谢谢大卫。这有帮助。但是现在当另一个计时器被激活时,我将如何使相反的计时器无效以防止人物跳来跳去? – tallen11 2010-06-04 21:21:33

1

该方法将始终将您的角色移动10.但是,您似乎每次按下按钮时都会启动一个新的计时器。所以如果你按下按钮3次,角色移动3x10 = 30。您需要取消现有计时器,因此始终只有一个计时器正在运行。

您可以使用[timer invalidate]取消NSTimer实例。 (See here

相关问题