電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[轉貼自程式設計俱樂部]glut 教學 - 按鍵 ~ 圖移動

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
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 時, 就會全錯了.
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作