2010-06-04 36 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