用Java模擬游戲重力的實現(彈跳)


年末開了Java實訓大作業

想了好幾天決定選擇馬里奧小游戲

發現即使做出來但是跳躍功能是很“笨拙”的,和我們玩的游戲不一樣,沒有跳躍速度的快慢什么的,后來才知道這個叫做游戲里面重力的模擬。

組隊做系統當然也有一分收獲,但我覺得要做就做一個能讓自己收獲更大的,所以做游戲23333

發現重力模擬和碰撞檢測都有很深的學問和算法在里面

那么先研究一下重力模擬

 

我要先采集一下大概的信息哈

 

 

//****自定義繪圖函數*********************************   
// 1.窗口貼圖   
// 2.計算小球速度,坐標以及判斷是否碰到窗口下緣   
void MyPaint(HDC hdc)  
{  
    SelectObject(bufdc,bg);  
    BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);  
  
    SelectObject(bufdc,angrybird);  
    BitBlt(mdc,x,y,60,60,bufdc,60,0,SRCAND);  
    BitBlt(mdc,x,y,60,60,bufdc,0,0,SRCPAINT);  
  
    BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);  
  
  
    x += vx;            //計算X軸方向貼圖坐標,每調用一次MyPiant(),x坐標就加上一個恆定不變的vx,相當於勻速運動   
      
    vy = vy + gy/20;       //計算Y軸方向速度分量,vy隨着每一次MyPiant()函數的調用就加上一個gy(重力加速度),因為50毫秒刷新一次   
    y += vy;            //計算Y軸方向貼圖坐標,每調用一次MyPiant(),y坐標就加上一個剛改變過后的vy,相當於加速運動   
  
  
    //判斷是否觸地,如果觸碰到窗口邊界,vy調整為相反方向   
    if(y >= rect.bottom-60)       
    {  
        y = rect.bottom - 60;  
        vy = -vy;  
    }  
  
    tPre = GetTickCount();     //記錄上次的繪圖時間   
}  

 

 

重力系統涉及到的一些常見問題及解決方案如下:

 

1.給球體一個釋放初速度,如何實現越向下運動且在接觸邊緣之前,豎直方向上的速度speedY越大的效果?

答案:可以在計時器中,每及時一次,豎直方向上的速度speedY自增一個固定值來實現,例如:speedY += 6;

 


2.球體接觸地面(此例中指瀏覽器下邊緣)后,如何實現速度反向效果?

答案:接觸地面后,將方向速度置為當前速度的反方向即可,代碼if (iW >= w||iW <= 0){speedX = -speedX;}if中條件表示如果超出運動范圍,實現水平方向接觸邊緣后運動方向相反,代碼if (iH >= h||iH <= 0){speedY = -speedY;}則表示Y方向接觸邊緣后速度變反。



3.球體接觸地面反彈后,如何實現再次上升的高度低於上一次高度的效果?

答案:在接觸地面后,速度變為負值,計時器開始執行下一個間隔,立即執行了speedY += 6,彈起速度立刻減小了6,其大小相對接觸地面前一瞬間小,因此球體不會彈跳到原來的高度。



4.如何實現球體豎直方向上的速度絕對值越來越小直至逼近於0的效果?

答案:事實上,僅利用speedY += 6;此例中豎直方向上速度speedY不可能達到0,因為在該函數設置好了初速度的前提下,某一次落地速度不可能為6(通過后來打印速度每次執行結果可以確定),所以下一次執行不可能為0,那么究竟是怎樣實現落到地面靜止的效果的呢?實際上,當把speedY增加值設置為6時,當球體某一次落地瞬間它的速度是1,2,3,4,5中的任何一個值是,經加上6后反彈瞬時速度分別為-5,-4,-3,-2,-1,經過一個計時器周期(此例中為30毫秒),速度再加6立刻變為1,2,3,4,5,下一次速度變為-5,-4,-3,-2,-1......,由於speedY += 6在計時器的頭處,因此最終結果將總是在加6之前,停留在-5,-4,-3,-2,-1.中的任何一個數值,且計時器始終處於動態,最終球體顯示在底部。



5.當球體釋放后,也具備有個橫向速度speedX,如何使橫向速度也逐漸減小值0?

答案:此例中不需要考慮x方向的碰撞,因此每次計時可將speedX乘以一個小於1的數,最終的speedX值將無限趨近於0,顯示為靜止。



當拖動窗口時如何實現不出現滾動條的效果?

答案:拖動后瀏覽器窗口后,對球體設置新的運動范圍即可。

 

 

參考博客:https://blog.csdn.net/weixin_34151004/article/details/87964263

                  https://blog.csdn.net/weixin_36185028/article/details/53015790


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM