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

Google
我研究出來了~關於判定按下的按鈕

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念
上一篇主題 :: 下一篇主題  
發表人 內容
fire231
散播福音的祭司


註冊時間: 2007-09-15
文章: 152

322.55 果凍幣

發表發表於: 2007-9-21, PM 8:49 星期五    文章主題: 我研究出來了~關於判定按下的按鈕 引言回覆

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef unsigned char BYTE;

int main()
{
    BYTE KeyArray[256];
    char PreKeyArray[256];
    int i;
//宣告需要的引數以及陣列
    printf("Press any key to test and press ENTER key to exit.\n",i);
choose:
       GetKeyState(VK_UP);
//這邊要設定
//函數的內容隨便用哪個Virtual Key Code代替都行
       GetKeyboardState(KeyArray);
//這個是用來比對的
       for(i=1;i<255;i++)
       {
           PreKeyArray[i]=KeyArray[i];
           if((KeyArray[38]&0x80)!=0)
           {
               printf("key(38) pressed.\n",i);
           }
//38是上 ~判斷並且印列出來
           if((KeyArray[39]&0x80)!=0)
           {
               printf("key(39) pressed.\n",i);
           }
//39是上 ~判斷並且印列出來
           if((KeyArray[13]&0x80)!=0)
           {
               break;
           }
//13是ENTER ~判斷並且跳出回圈後結束
            system("pause");
            goto choose;
       }
}


首先~前3行是檔頭
windows是為了要用GetKeyState()還有GetKeyboardState()

之後先宣告引數以及陣列
然後就開始判斷了
用來比對的
for(i=1;i<255;i++)從1到254
這邊只要先對照Virtual Key Code表
確定你要設定的按鍵有在 i 的範圍就可以了

之後
PreKeyArray[i]=KeyArray[i];
比對兩個陣列的資料

接下來後面可以自己設定
按鍵請參考Virtual Key Code表

要使用的語法是
if((KeyArray[代碼]&0x80)!=0)

&0x80似乎是要做AND的運算(與前面的東西做AND的運算)
若沒有加入
則沒有設定到的按鈕將會干擾判斷或是會直接進行這個判斷

之後最下面
有個system("pause")
在此例子中要加入
不然你按下按鈕後他會連續判定~按下的期間就會連續出現
使程式暫停可以停下~或是將間隔稍停住(每判斷1次會出現"按任何鍵繼續")

接下來就是goto choose
再回去可以連續判斷
--
用法

這個範例是判斷你按的按鈕

若實際要運用

則可在判斷按鈕之後接個goto XX

則可在最後面編寫~會直接跳過

至於這樣的話~除了在最下面goto choose的上面加上system("pause")

其他地方須視情況加入

例如goto之後到目標要在判斷的時候必須要加入~不然會連續判斷


以上就是用法

附上Virtual Key Code表

常數名稱 十六進位值 十進位值 滑鼠或按鍵的對應值
.............................................................
VK_LBUTTON 01 1 滑鼠左鈕
VK_RBUTTON 02 2 滑鼠右鈕
VK_CANCEL 03 3 Control-break 執行
VK_MBUTTON 04 4 滑鼠中鈕
05-07 5-7 未定義
VK_BACK 08 8 Backspace 鍵
VK_TAB 09 9 Tab 鍵
0A-0B 10-11 未定義
VK_CLEAR 0C 12 Clear 鍵
VK_RETURN 0D 13 Enter 鍵
0E-0F 14-15 未定義
VK_SHIFT 10 16 Shift 鍵
VK_CONTROL 11 17 Ctrl 鍵
VK_MENU 12 18 Alt 鍵
VK_PAUSE 13 19 Pause 鍵
VK_CAPITAL 14 20 Caps Lock 鍵
15-19 21-25 保留給Kanji 系統使用
1A 26 未定義
VK_ESCAPE 1B 27 Esc 鍵
1C-1F 28-31 保留給Kanji 系統使用
VK_SPACE 20 32 SpaceBar 鍵
VK_PRIOR 21 33 Page Up 鍵
VK_NEXT 22 34 Page Down 鍵
VK_END 23 35 End 鍵
VK_HOME 24 36 Home 鍵
VK_LEFT 25 37 Left Arrow 鍵
VK_UP 26 38 Up Arrow 鍵
VK_RIGHT 27 39 Right Arrow 鍵
VK_DOWN 28 40 Down Arrow 鍵
VK_SELECT 29 41 Select 鍵
2A 42 OEM 自訂使用
VK_EXECUTE 2B 43 Execute 鍵
VK_SNAPSHOT 2C 44 Print Screen 鍵
VK_INSERT 2D 45 Ins 鍵
VK_DELETE 2E 46 Del 鍵
VK_HELP 2F 47 Help 鍵
VK_0 30 48 0鍵
VK_1 31 49 1鍵
VK_2 32 50 2鍵
VK_3 33 51 3鍵
VK_4 34 52 4鍵
VK_5 35 53 5鍵
VK_6 36 54 6鍵
VK_7 37 55 7鍵
VK_8 38 56 8鍵
VK_9 39 57 9鍵
3A-40 58-64 未定義
VK_A 41 65 A鍵
VK_B 42 66 B鍵
VK_C 43 67 C鍵
VK_D 44 68 D鍵
VK_E 45 69 E鍵
VK_F 46 70 F鍵
VK_G 47 71 G鍵
VK_H 48 72 H鍵
VK_I 49 73 I鍵
VK_J 4A 74 J鍵
VK_K 4B 75 K鍵
VK_L 4C 76 L鍵
VK_M 4D 77 M鍵
VK_N 4E 78 N鍵
VK_O 4F 79 O鍵
VK_P 50 80 P鍵
VK_Q 51 81 Q鍵
VK_R 52 82 R鍵
VK_S 53 83 S鍵
VK_T 54 84 T鍵
VK_U 55 85 U鍵
VK_V 56 86 V鍵
VK_W 57 87 W鍵
VK_X 58 88 X鍵
VK_Y 59 89 Y鍵
VK_Z 5A 90 Z鍵
5B-5F 91-95 未定義
VK_NUMPAD0 60 96 數字鍵0鍵
VK_NUMPAD1 61 97 數字鍵1鍵
VK_NUMPAD2 62 98 數字鍵2鍵
VK_NUMPAD3 63 99 數字鍵3鍵
VK_NUMPAD4 64 100 數字鍵4鍵
VK_NUMPAD5 65 101 數字鍵5鍵
VK_NUMPAD6 66 102 數字鍵6鍵
VK_NUMPAD7 67 103 數字鍵7鍵
VK_NUMPAD8 68 104 數字鍵8鍵
VK_NUMPAD9 69 105 數字鍵9鍵
VK_MULTIPLY 6A 106 *鍵
VK_ADD 6B 107 +鍵
VK_SEPARATOR 6C 108 Separator 鍵
VK_SUBTRACT 6D 109 -鍵
VK_DECIMAL 6E 110 .鍵
VK_DIVIDE 6F 111

http://www.wretch.cc/blog/Nelson&article_id=752469


fire231 在 2007-9-22, PM 10:29 星期六 作了第 3 次修改
回頂端
檢視會員個人資料 發送私人訊息
fire231
散播福音的祭司


註冊時間: 2007-09-15
文章: 152

322.55 果凍幣

發表發表於: 2007-9-21, PM 9:36 星期五    文章主題: Re: 我研究出來了~關於判定按下的按鈕 引言回覆

代碼:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

using namespace std;
typedef unsigned char byte;

 
int main()
{
    byte KeyArray[256];
    char PreKeyArray[256];
    int i;
//宣告需要的引數以及陣列
menu:
    cout << "    > 開始遊戲 " << endl;
    cout << "      讀取遊戲 " << endl;
    cout << "      結束遊戲 " << endl;
    cout << "               " << endl;
    cout << "你可以按'下'來移動指標與按'Enter'選擇" << endl;
//選單第1
    system("pause");//停在這邊
    GetKeyState(VK_UP);//函數的內容隨便用哪個Virtual Key Code代替都行
    GetKeyboardState(KeyArray);//這個是用來比對的
    for(i=1;i<255;i++)
    {
        PreKeyArray[i]=KeyArray[i];
        if((KeyArray[40]&0x80)!=0)
        {             
            system("cls");                                   
            goto menu2;
        }
//下~跳到下面的選單2(menu2)
        if((KeyArray[13]&0x80)!=0)
        {
             goto start; 
        }
//選擇~跳到下面的開始(start)
         cout << "請勿按除了'下'與'Enter'的其他按鍵" << endl;
         system("pause");
         system("cls");         
         goto menu;
     }
//menu判斷結束
menu2:   
    cout << "      開始遊戲 " << endl;
    cout << "    > 讀取遊戲 " << endl;
    cout << "      結束遊戲 " << endl;
    cout << "               " << endl;
    cout << "你可以按'下'與'上'移動指標與按'Enter'選擇" << endl;
//選單第2
    system("pause");//停在這邊
    GetKeyState(VK_UP);//函數的內容隨便用哪個Virtual Key Code代替都行
    GetKeyboardState(KeyArray);//這個是用來比對的
    for(i=1;i<255;i++)
    {
        PreKeyArray[i]=KeyArray[i];
        if((KeyArray[38]&0x80)!=0)
        {                     
            system("cls");                                                 
            goto menu;
        }
//上~回到選單1(menu)                         
        if((KeyArray[40]&0x80)!=0)
        {
            system("cls");                                                                         
            goto menu3;
        }
//下~跳到下面的選單3(menu3)
        if((KeyArray[13]&0x80)!=0)
        {
            goto load;
        }
//選擇~跳到下面的讀取存檔(load)
         cout << "請勿按除了'下'和'上'與'Enter'的其他按鍵" << endl;
         system("pause");
         system("cls");   
         goto menu2;
    }
//menu2判斷結束
menu3:   
    cout << "      開始遊戲 " << endl;
    cout << "      讀取遊戲 " << endl;
    cout << "    > 結束遊戲 " << endl;
    cout << "               " << endl;
    cout << "你可以按'上'移動指標與按'Enter'選擇" << endl;
//選單第3
    system("pause");//停在這邊
    GetKeyState(VK_UP);//函數的內容隨便用哪個Virtual Key Code代替都行
    GetKeyboardState(KeyArray);//這個是用來比對的
    for(i=1;i<255;i++)
    {
        PreKeyArray[i]=KeyArray[i];   
        if((KeyArray[38]&0x80)!=0)
        {                     
            system("cls");                                                 
            goto menu2;
        }
//上~回到選單2(menu2)                         
        if((KeyArray[13]&0x80)!=0)
        {
            goto exit;
        }
//選擇~跳到下面的結束(exit)
         cout << "請勿按除了'上'與'Enter'的其他按鍵" << endl;
         system("pause");
         system("cls");   
         goto menu3;
    }
//menu3判斷結束
start://開始遊戲
    return 0;
load://讀取遊戲
    return 0;
exit://離開遊戲
    return 0; 
}

以上是我企劃的小型RPG開頭
這是使用了該語法的範例

會判斷是否按了按鈕
按錯還有提示
回頂端
檢視會員個人資料 發送私人訊息
s13579239
偶而上來逛逛的過客


註冊時間: 2007-12-01
文章: 12

0.00 果凍幣

發表發表於: 2008-1-12, PM 9:19 星期六    文章主題: 媽呀 引言回覆

我看到會哭,都看不懂
回頂端
檢視會員個人資料 發送私人訊息
fire231
散播福音的祭司


註冊時間: 2007-09-15
文章: 152

322.55 果凍幣

發表發表於: 2008-1-19, PM 3:26 星期六    文章主題: Re: 媽呀 引言回覆

s13579239 寫到:
我看到會哭,都看不懂


話說~我這個版法是比較困難的= =
回頂端
檢視會員個人資料 發送私人訊息
babu61509
散播福音的祭司


註冊時間: 2007-08-26
文章: 142

681.01 果凍幣

發表發表於: 2008-1-19, PM 4:35 星期六    文章主題: Re: 媽呀 引言回覆

s13579239 寫到:
我看到會哭,都看不懂

語法沒學過當然看不懂XD
用成流程圖應該就比較好瞭解了...
基本上程式是這樣跑...
代碼:

        --------------------
        (      開       始   )
        --------------------
                      |
        ----------------------         
        |     顯示選單          | <--------|
        ----------------------          |
                     |                  |
                    /\                  |
                  /    \        移動鍵    |
               /  判斷按鍵  \--------------|
                 \      /
                    \/
              確    |
              認    |
              鍵    |
                    |
                    /\
                  /    \
               /  判斷選擇  \  . . .
                \  的項目  /   
                  \    /
                    \/
                     .
                     .
                     .

其實這程式碼有很多重複的地方...
可以考慮用String或字元陣列來放要顯示的字...然後用 取得/更改 裡面的值來 顯示/判斷 目前所指位置.
這樣可以減少重複的程式碼.

_________________
已經畢業了!!
回頂端
檢視會員個人資料 發送私人訊息
fire231
散播福音的祭司


註冊時間: 2007-09-15
文章: 152

322.55 果凍幣

發表發表於: 2008-1-20, PM 12:56 星期日    文章主題: Re: 媽呀 引言回覆

我知道= =

這是我第1次寫的程式= =

現在知道大該要怎麼用了

話說

NEIL弄的判斷鍵比較好判斷
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

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


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