Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Can';不要移动我的角色_Iphone_Objective C_Uiimageview - Fatal编程技术网

Iphone Can';不要移动我的角色

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

当我点击一个按钮时,我试图移动UIImageView。我已设置启动NSTimer的选项。点击该按钮时,角色(UIImageView)会移动自如。当我再次点击同一个按钮时,角色会加速,以此类推,最终他会以十亿英里/小时的速度移动。我如何解决这个问题?代码如下:

-(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;
}