satanupup 喜歡上這裡的冒險者
註冊時間: 2007-05-29 文章: 80
68.10 果凍幣
|
發表於: 2007-6-28, PM 1:59 星期四 文章主題: [轉貼自程式設計俱樂部]glut 教學 - 按鍵 ~ 圖移動 |
|
|
作者 : ma_hty(白老鼠(Gary))
-----------------------------------
/////////////////////////
// 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();
}
-----------------------------------------------------------------------------------
這次教學, 是 "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) 之間, 因此, 計算 移動幅度 時, 就可以完全不考慮 視窗大小, 從而簡化了很多的不必要的運算.
請注意 :
由這次教學開始, 圖檔的寬 都假定是可以被 4 整除的, 因此 我把 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 移除了.
如果你想用其他的圖檔寬, 你需要把這個加回去呀, 不然, glDrawPixels() 讀取你的 memory block 時, 就會全錯了. |
|