討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 討論區最近新進100則主題 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
glut-如何平順地移動物體?
更改我的閱讀文章字型大小
作者 : 19840930(程式弱者)
[ 貼文 19 | 人氣 4129 | 評價 10 | 評價/貼文 0.53 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/8/31 下午 06:36:44
小弟做了個物件在視窗中,並可用方向鍵控制移動。
可是效果並不像一般遊戲那樣,停就是停,走就是走。
程式執行時,當我按下右方向鍵時,會先移動一次後停頓一下,之後才會連續移動。
請教各位大大,如何才能讓移動變得平順呢?

以下是我的按鍵控制。
原座標(0,0,0) -> 按一下右鍵 -> 新座標(1,0,0)。
要如何才能使它從0漸變到1,而不是直接0變成1呢?

void ArrowKeys( int a_keys, int x, int y ) // Create Special Function (required for arrow keys)
{
    switch( a_keys )
    {
     case GLUT_KEY_UP: // When Up Arrow Is Pressed...
     P1.Move(0, 0, -1);
     break;

     case GLUT_KEY_DOWN: // When Down Arrow Is Pressed...
     P1.Move(0, 0, 1);
     break;

     case GLUT_KEY_RIGHT: // When Right Arrow Is Pressed...
     P1.Move(1, 0, 0);
     break;

     case GLUT_KEY_LEFT: // When Left Arrow Is Pressed...
     P1.Move(-1, 0, 0);
     break;

     default:
     break;
  }

  glutPostRedisplay();
}
作者 : dorkas(aming) VC++優秀好手遊戲程式設計卓越專家DirectX頂尖高手C++優秀好手貼文超過2000則
[ 貼文 2624 | 人氣 4536 | 評價 11810 | 評價/貼文 4.5 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/1 下午 05:26:02
要有Character的移動狀態
WALK,RUN,JUMP,STAND

每個狀態的持續時間
跟位移速度

然後放入 update(float deltaTime) 去做計算
距離等於速度乘於時間
s=v*dt


就可以算出非常漂亮的移動


class Character
{
Point3 mPos,mVal;


int mState;
void upDate(float deltaTime);
void changeState(int state);
};

void Character::upDate(float deltaTime)
{
   
  mPos+=mVal*deltaTime;
   
}
void Character::changeState(int state)
{
    switch (state)
    {
     case WALK:
     mVal=Point3(0.f,0.f,0.001f);
     break;
     }
    mState=state;
}








作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/1 下午 08:59:22
這個是視窗系統的功能, 你沒法使用 key repeat 的功能達到你想做的目標的.

但是, 只要你不使用 key repeat 的, 自己處理 key up 和 key down, 就可以了.

即...

glutIgnoreKeyRepeat( true ); // 關掉 key repeat

glutKeyboardFunc() // 註冊 key down callback

glutKeyboardUpFunc() // 註冊 key up callback

作者 : 19840930(程式弱者)
[ 貼文 19 | 人氣 4129 | 評價 10 | 評價/貼文 0.53 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/1 下午 09:43:39
哦,太感謝大大的教導了,馬上來去試試看~
作者 : 19840930(程式弱者)
[ 貼文 19 | 人氣 4129 | 評價 10 | 評價/貼文 0.53 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/10 下午 11:20:18
之前感謝幾位大大的幫忙,小弟經過一番思考與程式撰寫之後,總算是有點小進展。
接著還想請各位大大不吝指導:
小弟雖然已經初步解決了平順移動物體的鍵盤輸入,可是馬上就又遇上另一個問題了。因為我已經把REPEAT關掉了,因此變成程式會偵測使用者在鍵盤上輸入的最後一個動作。(鍵盤的按下去跟放開是不同的動作)結果就是當我按下向右時,物體就向右移動,接著我按下向上(向右鍵還沒放開),物體就向上移動,可是就在此時如果我放開向右鍵,物體就不動了。
我大概知道原理是因為程式偵測到最後一個輸入是「向右鍵放開」,但小弟卻不知道該怎麼解決這個問題,目前是有想法:在「放開」的鍵入產生時再檢查一遍是否有其它鍵正在「按著」。不知道這樣的想法正不正確,就算正確了又該怎麼實現呢???

還請各位大大予以指導,謝謝~
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/11 上午 09:25:58
為什麼只可以記著 上一個輸入 呢??

你應該為所有 ASCII CODE 字元也準備一個 bool, 記錄著它們是否按下了, 例如,

bool keymask[256];

在顯示時, 就根據這些資料去作顯示, 就可以了.
 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2720 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125