easycker
2010-11-10 16:26:44
[i=s] 本帖最后由 easycker 于 2010-11-10 16:53 编辑 [/i]
[b]按键触发处理分为一下几种[/b]:
1,按下后只执行1次(GameButtonDown)
2,弹起后执行1次(GameButtonUp)
3,按下后一直执行(利用状态机)
4,按下后执行,弹起后不执行(利用状态机)
还有其他的,这里的初级DEMO 暂时不介绍了(比如长按短按,按下后一直执行,按下后执行一段时间等等)
[b]按键是否支持同时按可以用以下几种方式:[/b]1,if...if...if....支持同时按下
2,if...else if.....else if..... 不支持同时按下
3,switch(){case...case...}不支持同时按下,但可以做重叠,case前者优先级大于后者 ([color=Red]本例采用这种[/color])
还有其他的,状态机处理等等,暂时不介绍了
了解了基本处理按键的方法,那我们就一起来看看DEMO吧
一、按下处理执行一次[code]
//Game.h
#ifndef _GAME_H
#define _GAME_H
#include "ZGame.h"
class Game : public ZGame
{
public:
Game(){}
~Game(){}
void GameInitial();
void GameCircle();
void GameDrawScene();
void GameButtonDown(int nKeyNumber);
void GameButtonUp(int nKeyNumber);
void GameEnd();
private:
//(1)
ZImage *m_img;
float m_img_x,m_img_y; //m_img的左上角的坐标x,y
};
#endif
[/code][code]
//Game.cpp
//游戏入口类
#include "Game.h"
//游戏初始化
void Game::GameInitial()
{
//(2)
m_img = new ZImage;
m_img->Load("image/block.png");
m_img_x = 200,m_img_y = 100; //一出来时图片显示在200,100处
}
//游戏循环
void Game::GameCircle()
{
}
//游戏绘图
void Game::GameDrawScene()
{
//(3)
m_img->Show(m_img_x,m_img_y);
}
//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
//(final)按键按下时 ,只执行1次
switch(nKeyNumber)
{
case PSP_BUTTON_UP:
m_img_y -= 10;
break;
case PSP_BUTTON_DOWN:
m_img_y += 10;
break;
case PSP_BUTTON_LEFT:
m_img_x -= 10;
break;
case PSP_BUTTON_RIGHT:
m_img_x += 10;
break;
}
}
//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{
}
//游戏结束
void Game::GameEnd()
{
Quit();
}
[/code]二、弹起后执行1次
只要把GameButtonDown(int nKeyNumber)中的所有内容剪贴到GameButtonUp(int nKeyNumber)中即可
三、按下后一直执行(利用状态机)[code]
//Game.h
#ifndef _GAME_H
#define _GAME_H
#include "ZGame.h"
class Game : public ZGame
{
public:
Game(){}
~Game(){}
void GameInitial();
void GameCircle();
void GameDrawScene();
void GameButtonDown(int nKeyNumber);
void GameButtonUp(int nKeyNumber);
void GameEnd();
private:
//(1)
ZImage *m_img;
float m_img_x,m_img_y; //m_img的左上角的坐标x,y
int m_img_state; //m_img的状态 0为静止,1为上移等等,,下个例子介绍如何利用枚举来做
};
#endif
[/code][code]
//Game.cpp
//游戏入口类
#include "Game.h"
//游戏初始化
void Game::GameInitial()
{
//(2)
m_img = new ZImage;
m_img->Load("image/block.png");
m_img_x = 200,m_img_y = 100; //一出来时图片显示在200,100处
m_img_state = 0; //默认图片静止
}
//游戏循环
void Game::GameCircle()
{
//(4)
switch(m_img_state)
{
case 0: //静止什么都不做
break;
case 1:
m_img_y -= 3;
break;
case 2:
m_img_y += 3;
break;
case 3:
m_img_x -= 3;
break;
case 4:
m_img_x += 3;
break;
}
}
//游戏绘图
void Game::GameDrawScene()
{
//(final)
m_img->Show(m_img_x,m_img_y);
}
//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
//(3)按键按下时 ,只执行1次
switch(nKeyNumber)
{
case PSP_BUTTON_UP:
m_img_state = 1;
break;
case PSP_BUTTON_DOWN:
m_img_state = 2;
break;
case PSP_BUTTON_LEFT:
m_img_state = 3;
break;
case PSP_BUTTON_RIGHT:
m_img_state = 4;
break;
default:
m_img_state = 0; //按下其他除了以上的任何按键停止移动
}
}
//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{
}
//游戏结束
void Game::GameEnd()
{
Quit();
}
[/code]四、按下后执行,弹起后不执行(利用状态机)[code]
//Game.h
#ifndef _GAME_H
#define _GAME_H
#include "ZGame.h"
class Game : public ZGame
{
public:
Game(){}
~Game(){}
void GameInitial();
void GameCircle();
void GameDrawScene();
void GameButtonDown(int nKeyNumber);
void GameButtonUp(int nKeyNumber);
void GameEnd();
private:
//(1)
ZImage *m_img;
float m_img_x,m_img_y; //m_img的左上角的坐标x,y
int m_img_state; //m_img的状态 0为静止,1为上移等等,,这次 利用枚举来做
public:
enum m_img_state_enum //和结构体定义一样。作用是吧0,1等数字换成名字:静止,上移等
{
MOVE_STOP = 0, //0
MOVE_UP, //1
MOVE_DOWN, //2
MOVE_LEFT, //3
MOVE_RIGHT //4
};
};
#endif
[/code][code]
//Game.cpp
//游戏入口类
#include "Game.h"
//游戏初始化
void Game::GameInitial()
{
//(2)
m_img = new ZImage;
m_img->Load("image/block.png");
m_img_x = 200,m_img_y = 100; //一出来时图片显示在200,100处
m_img_state = MOVE_STOP; //默认图片静止,用了enum枚举.MOVE_STOP其实就是0
}
//游戏循环
void Game::GameCircle()
{
//(4)
switch(m_img_state) //这是个状态机
{
case MOVE_STOP: //静止什么都不做
break;
case MOVE_UP:
m_img_y -= 3;
break;
case MOVE_DOWN:
m_img_y += 3;
break;
case MOVE_LEFT:
m_img_x -= 3;
break;
case MOVE_RIGHT:
m_img_x += 3;
break;
}
}
//游戏绘图
void Game::GameDrawScene()
{
//(final)
m_img->Show(m_img_x,m_img_y);
}
//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
//(3)按键按下时 ,移动
switch(nKeyNumber)
{
case PSP_BUTTON_UP:
m_img_state = MOVE_UP; //上移 ,MOVE_UP就是1
break;
case PSP_BUTTON_DOWN:
m_img_state = MOVE_DOWN;
break;
case PSP_BUTTON_LEFT:
m_img_state = MOVE_LEFT;
break;
case PSP_BUTTON_RIGHT:
m_img_state = MOVE_RIGHT;
break;
}
}
//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{
//(4)弹起按键时,静止
switch(nKeyNumber)
{
case PSP_BUTTON_UP:
m_img_state = MOVE_STOP; //上移 ,MOVE_UP就是1
break;
case PSP_BUTTON_DOWN:
m_img_state = MOVE_STOP;
break;
case PSP_BUTTON_LEFT:
m_img_state = MOVE_STOP;
break;
case PSP_BUTTON_RIGHT:
m_img_state = MOVE_STOP;
break;
}
}
//游戏结束
void Game::GameEnd()
{
Quit();
}
[/code]
boy545003571
2010-11-10 18:21:10
唔,好多代码哈。。。收藏
幻の上帝
2010-11-10 23:00:04
果然是用状态机吗……看来我又发明了个轮子……orz`
早知道我就偷懒不考虑在DS上实现按键事件了= =...