2014-09-10 76 views
1

我想從紙條開始。我嘗試使用jsfiddle,但出於某種原因,HTML5畫布無法正常工作。所以作爲一種解決方法,我使用了http://jsbin.com/gugihuwegopa/1/。要使用此網站進行編輯,請點擊窗口右上角的編輯按鈕。無論如何,我的問題是,當槳沒有移動時,球正確地從所有側面彈跳(nomove變量與此無關,只是爲了使它與「w」鍵一起消失)。但是,當我用鼠標將槳移向球時,它會卡在槳內。我認爲這是因爲它沒有足夠快地更新槳的位置,所以球終止在它內部,並且我的代碼在內部繼續引起球跳動。 (直到快速移動槳葉並使其脫開)。是的,我曾嘗試在cxt.arc()之前放置cxt.fillRect。有時球也會穿過槳。我想辦法解決,這將在球的方向需要考慮到我的兩個if聲明:乒乓球拍移動時帆布球彈向錯誤方向

if(y+ymove>=w && y+ymove<=w+h && x>=s && x<=s+l) ymove*=-1; //top and bottom 
if(x+xmove>=s && x+xmove<=s+l && y+ymove<=w+h && y+ymove>=w) xmove*=-1; //left and right 

我已經嘗試了一些其他的方法包括:

if(y+ymove>=w && y+ymove<=w+h && x>=s && x<=s+l && centerY+17.5 < y+ymove+5 && centerX+12.5 < x+xmove+5) ymove*=-1; //top and bottom, extra +5 for radius 
    if(x+xmove>=s && x+xmove<=s+l && y+ymove<=w+h && y+ymove>=w && centerX+12.5 < x+xmove+5 && centerY+17.5 < y+ymove+5) xmove*=-1; //left and right 

所以基本上我只需要無論我如何移動球拍,球都能正確地彈起。隨意編輯所有你想要的,即使這意味着增加更多if陳述。我所要求的是絕對沒有JQuery。提前致謝。

回答

0

您必須將碰撞處理視爲具有(至少)兩個階段:碰撞檢測和碰撞解析。在這裏,只有通過改變速度來解決碰撞,但如果一個速度非常高,那麼兩個物體可能仍然相交:一個物體可能位於另一個物體的內部:因此,您還需要解決位置問題,或者,如果您更願意「推」反對最重的對象。您可以通過在兩個對象的x,y,w,h上使用幾分鐘/最大值來完成此操作。

或者,還有另一種避免物體重疊的「動態」方法:使碰撞處理具有時間驅動性。將碰撞處理分解爲時間子步驟,以避免每次碰撞。您必須計算下一次碰撞發生的時間,然後將所有人移動到那個時間,然後只更新速度,然後重新執行此操作,直到經過足夠的時間。所以甚至不會有重疊的機會發生:在碰撞時停止監視,然後改變速度,然後再次重新開始。並且在一幀中可能會發生多次碰撞,這種情況不會由單次通過算法正確處理(當球碰到角落時)。 舉個例子:說你的遊戲幀時間,'dt'是16毫秒,現在你在10.2ms檢測到球擊中槳 - >你讓對象移動10.2ms(x + = vx * 10.2/y ...)解決他們的速度(只),然後你要求你的碰撞引擎進一步迭代5.8ms。
這是一個小工作,但我在我的遊戲引擎中做到了,它工作正常。

(希望我一直在幫助,而不是混淆...... :-))

1

我會建議您做更友好的代碼,以獲得幫助,刪除評論並僅保留需要修復的部分。

關於你的問題你可以做的一件事是使用一個標誌,如果球擊中槳,將標誌設置爲真,重做一次並停止檢查碰撞,直到標誌爲假。

肯定應該有更好的解決方法,但這是一個開始。