看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code::Blocks / MinGW 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL GLUT 問題(Question): 小弟目前剛學 OpenGL (三天) 想用來跑 2D 平面繪圖 (簡單的動畫) 我想連續輸出畫面 但是中間要暫停個0.1秒 不然跑太快閃過去就沒了 只剩最後一張圖而已 我自己想說用 _sleep(100) 這樣子的功能去暫停 但結果是暫停時間內整個程式會當掉不用動 還是沒辦法達成動畫的效果 程式碼(Code):(請善用置底文網頁, 記得排版) http://pastie.org/2992365 補充說明(Supplement): 成功的話 應該會看到色點往四個角落移動 不過實際上只會看到最後的點而已 中間的過程都不見了 麻煩各位高手們看看能不能給點提示 感謝 ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.221.54
VictorTom:小弟我用VC2005試了一下, 色點是會往四個角落移動啊.... 12/10 02:49
VictorTom:把glColor()裡傳i的部份都加個0.1或0.2, 並且一開始先用 12/10 02:53
VictorTom:glPointSize()給個10.0, 效果看起來很明顯啊.... 12/10 02:53
Esvent:要慢一點的話就glutTimerFunc + glutPostRedisplay 12/10 06:40
謝謝兩位 程式小修改後大致上可以跑 但是不知道為什麼 跑兩次就自己停掉了 不會無限循環下去 然後視窗感覺還是盪盪的 ※ 編輯: cory8249 來自: 140.114.221.54 (12/12 21:24)
Esvent:gultTimerFunc裡面每次都要設定下一次的timerFunc才會迴圈 12/12 21:29
Esvent:找個範例來看應該就懂了 12/12 21:29
Esvent:當當的感覺我猜是fps太低? timerFunc的頻率設短一點即可 12/12 21:31
關於 TimerFunc 這部分 我在網路上看來看去還是不太明白 亂改的程式碼: http://pastie.org/3005736 會呈現一直在重繪的情況 還是沒有 delay @@" ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 00:04)
VictorTom:你是要一直重覆從裡到外的過程, 還是只要一次裡到外但是 12/13 00:19
VictorTom:慢慢畫? 你的設計裡Timer每隔段時間call PostRedisplay, 12/13 00:20
VictorTom:然後display func裡都是從裡到外畫完一次的全程, 自然你 12/13 00:21
VictorTom:看到最後的結果就是一直重繪從裡到外的流程.... 12/13 00:21
VictorTom:如果你只是要一次慢慢畫的過程, 簡單作法就是display裡 12/13 00:22
VictorTom:那個for直接拿掉, 把i提成global變數, 然後原本for裡的 12/13 00:23
VictorTom:條件判斷與i+=0.01這些都拉進Timer裡(PostRedisplay前) 12/13 00:23
VictorTom:另外, 總覺得display裡最後兩行clear相關的是不需要的. 12/13 00:28
VictorTom:還有, TimerFunction() 好像應該從display裡拉到main裡. 12/13 00:31
對不起 我資質駑鈍 弄一弄都變成全黑一片 我想做到以下兩點: 1. 像 _sleep() 這樣的延遲功能 就是每次畫一次小方塊之後 都短暫停個 0.2 秒 (舉例來說) 然後下一次 小方塊的位置、顏色都改變之後 再把它畫出來 也就是方塊會慢慢變亮、從內移往外移動 , 像動畫那樣 clear那邊如果不打 他會全部連在一起 變成一條線 我是想要方塊移動的樣子 2. 以上流程可以一直重複的跑 若鍵盤輸入 p 就暫停 輸入 r 回復播放動畫 輸入 q 或者 ESC 之類的才結束 Thanks !! ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 02:02)
VictorTom:你如果要用Sleep, 就不需要搞Timer, 而我這邊試再前一次 12/13 10:23
VictorTom:的版本就已經會從裡到外跑了.... 12/13 10:23
VictorTom:一般的設計會是display只畫一個frame, 然後等Timer到或 12/13 10:23
VictorTom:需要ReDraw的時候才clear, 然後render frame內容.... 12/13 10:24
VictorTom:你的設計裡是display裡把動畫的所有frame都畫完, 所以 12/13 10:26
VictorTom:clear, render, timer全攪和在一起了, 你可能要想想你的 12/13 10:27
VictorTom:你想要做的與目前你的程式實際運行的流程再作修改.... 12/13 10:28
VictorTom:最後要收key event, 可以查 glutKeyboardFunc 的用法. 12/13 10:28
VictorTom:這是小弟我改過的Timer版: http://pastie.org/3008420 12/13 10:34
VictorTom:原來的迴圈加Sleep版: http://pastie.org/3008431 12/13 10:38
VictorTom:迴圈版我懶得改成一直loop跑了, 反正多掛一層loop的事; 12/13 10:38
VictorTom:每個Point的Color我都多加了0.2, 不然不容易看出來結果. 12/13 10:39
VictorTom:Key event的等你自己搞清楚試了有問題再說吧.... 12/13 10:39
原來如此 ... 感謝 V大 詳細的講解 不過我還是不太清楚 void TimerFunction(int value); 還有 glutTimerFunc(millisecond,TimerFunction, value); 他的引數 value 是做什麼用的? (這邊看似沒用到 ?) 然後 關於整個 glut 的流程 感覺還是一知半解 我另外加了一個三角形 http://pastie.org/3009372 如果想要兩個輪流 (或者同時) display 該怎麼做 ? glutPostRedisplay() 是重播哪個函數 ? ※ 編輯: cory8249 來自: 140.114.221.54 (12/13 17:09)
VictorTom:你需要去查一下你提到與寫到的所有函數的使用說明.... 12/13 22:14
VictorTom:http://0rz.tw/qpoVX 搭配google應該也能找到些例子. 12/13 22:15
官方說明文件有看過幾遍了 不過小弟程度粗淺 不慎明白 @@" 這部分我再慢慢 google 看看好了 這幾天麻煩 V大 了 真是非常感謝 !! ※ 編輯: cory8249 來自: 140.114.221.54 (12/14 03:04)