討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
glut 教學 - 按鍵 ~ 圖移動
更改我的閱讀文章字型大小
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/19 上午 09:34:26
/////////////////////////
// glutTest04.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//


#include <stdio.h>

#include "glut.h"
#include "g_bmp.h"

GBmp bm0;


float bmx=0,bmy=0; // 記錄按鍵資料

// 處理按鍵函式
void keyboard( unsigned char key, int x, int y )
{
  switch( key )
  {
    case 'd':
     bmx += .01;
     glutPostRedisplay();
     break;
    case 'a':
     bmx -= .01;
     glutPostRedisplay();
     break;
    case 'w':
     bmy += .01;
     glutPostRedisplay();
     break;
    case 's':
     bmy -= .01;
     glutPostRedisplay();
     break;
  }
}

void display()
{
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glRasterPos2f( -bm0.w/640.0 + bmx, -bm0.h/640.0 + bmy ); // 在 "中心移動(bmx,bmy)" 的位置畫圖
    glDrawPixels( bm0.w, bm0.h, GL_RGB, GL_UNSIGNED_BYTE, bm0.rgb );

  glutSwapBuffers();
}

void main()
{
  glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB );
  glutInitWindowSize( 640, 640 );
  glutCreateWindow( "hihi" );
  //glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard); // 向 glut 註冊按鍵函式

  bm0.load( "blank.bmp" );

  glutMainLoop();
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/19 上午 10:09:26
這次教學, 是 "glut 教學 - 把我的圖放到視窗上!!" 的延伸, 按下 w s a d 圖就會向 上 下 左 右 的方向移動.

在 glut 擷取按鍵事件, 你需要先寫一個特定 prototype 的函式 ( 即 void keyboard( unsigned char key, int x, int y ), 其中的 key 就是被按鍵的 ASCII code, x y 是 按鍵時的滑鼠座標.

當 keyboard 函式寫好後, 就可以向 glut 註冊, 然後, glut 視窗收到 按鍵事件 就會呼叫你的 按鍵函式.

要對應 按鍵事件 去移動 圖, 我當然要先把 按鍵 傳譯成圖移動的幅度. 把 移動幅度 放到全域變數 (bmx,bmy), 等待 畫圖時使用.

畫圖時, 我們只需根據 移動幅度 換算出新的畫圖位置, 再交給 glRasterPos2f(), 就可以了.

順帶一提, 如果你從前學過 MFC 系列的圖像, 你可能會覺得 OpenGL 的預設座標系統很奇怪. 但是, 在這個範例, 我們卻可以由這樣的設定而得到好處. 因為把視窗的 x y 方向都按比例縮小到 (-1,1) 之間, 因此, 計算 移動幅度 時, 就可以完全不考慮 視窗大小, 從而簡化了很多的不必要的運算.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/19 上午 10:23:40
請注意 :

由這次教學開始, 圖檔的寬 都假定是可以被 4 整除的, 因此 我把 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 移除了.

如果你想用其他的圖檔寬, 你需要把這個加回去呀, 不然, glDrawPixels() 讀取你的 memory block 時, 就會全錯了.
作者 : mplcwsc(yuyu)
[ 貼文 5 | 人氣 464 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/9/23 下午 07:08:13
大大,在我COMPILE的时候,他说
"c:\Temp\Visual Studio Projects\test\rsr.cpp(4): fatal error C1083: Cannot open include file: 'g_bmp.h': No such file or directory"

那么'g_bmp.h'是OPENGL自带的还是额外的东西呢
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/9/24 上午 12:17:48
g_bmp.h 和 g_bmp.cpp 都是我寫的東西, 你可以隨便拿來用, 你可以在

"glut 教學 - 讀取 bmp圖檔"

找到這兩個檔案.
作者 : beenteen(一ㄍ頭2ㄍ大)
[ 貼文 21 | 人氣 3522 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 12:15:47
我希望做到除了背景圖之外
其他的圖都可以自由移動而互不影響

在鼠大的程式裡是利用 glClear() 去清除畫面上的圖
然後在新座標上繪出相同的圖
對單一個圖移動是沒問題的
只是 如果畫面上超過2張以上的圖時
除了 重繪所有的圖 之外
還有比較簡易的方法嗎
像是對單張圖做處理(我想的)

感謝鼠大
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 01:18:53
局部重繪, 在 MFC 繪圖主導的遠古時代, 是必修的課題, 但是, 我們, 現代人, 有 顯示卡 作硬體同步, 推速度的考慮, 跟 遠古時代 大不同了.

glut 教學 有說到這個的, 先爬爬文吧.
作者 : beenteen(一ㄍ頭2ㄍ大)
[ 貼文 21 | 人氣 3522 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 01:50:13
我再次的重新翻過討論區內絕大多數的文章
還是沒找到 局部重繪 的相關議題
是我粗心沒注意到
還是我會錯意了
麻煩鼠大高抬貴手指示明燈
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 01:55:26
glut 教學 - 邁向三維世界, 去吧!! 不要回頭
http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=opengl&id=916

局部重繪, 是已經被淘汰了的做法, 不再有人這樣做.
作者 : beenteen(一ㄍ頭2ㄍ大)
[ 貼文 21 | 人氣 3522 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 02:18:56
我從頭看到尾, 我發現我完全看不懂
現在先退而求其次, 先說一下我想做的事
1.先讀入3張圖 a(800*600) b(20*20) c(20*20)
2.以a 當背景分為4塊區域, 左上, 左下, 右上, 右下
3.b c 分別置於左上和右下區域內的任何地方
4.按 x 鍵, b向下移動 0.1, a,c 不動
5.按 w 鍵, c向上移動 0.1, a,b 不動
就這樣, 我現在的做法是3張圖重貼, 可是我不喜歡這個方法
我可以只對有動作的圖做處理嗎?
我換個說法好了, 我今天貼上了 b 之後, 可以拿掉而不損及 a 嗎??
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/11/9 下午 04:01:26
你的想法是不行的, 算了吧.
程式跑得慢, 就改用 texture 做貼圖, 這樣 局部重繪 與否, 所需的時間都是一樣的.
作者 : assam5035(小嫩嫩)
[ 貼文 46 | 人氣 7649 | 評價 10 | 評價/貼文 0.22 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/4 下午 03:36:38
請問一下 我把圖會進去之後
再用按鍵移動
可是一移動
畫面就會一直閃爍
請問大大 造成這樣的原因
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/4 下午 05:57:15
這個範例, 已經使用了 double buffer, 不應該會出現閃爍的情況, 或者你先把我的原碼完完整整的複製, 然後再試試吧.


不過, 有更好的進階範例了, 你可以參考

glut 教學 - 把我的圖放到視窗上!! (進階)
http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=opengl&id=1227
 板主 : 白老鼠(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.109375