ZEngine Demo 7 - 按键的使用 初级



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上实现按键事件了= =...