ZEngine Demo 1 - ZImage 初级使用 (更新版本v101109)



easycker
2010-11-08 22:57:14

[i=s] 本帖最后由 easycker 于 2010-11-10 16:30 编辑 [/i]

[color=Red]以后默认C:psp_developmentNGE2libnge2NGE2 ZeusEngineproject 1为引擎项目目录[/color]

ZImage类:图形处理类

新建一个ZEngine项目(就是复制,说明文件中有写)

在里面新建一个image文件夹,在里面放入名为demo0.jpg的图片文件
零,框架。以下是Game.h和Game.cpp的原始内容,只要把之后教材中不同的地方添加进去就可以了[code]Game.h:
#ifndef _GAME_H
#define _GAME_H

#include "ZGame.h"

[code]
class Game : public ZGame
{
public:
Game(){}
~Game(){}

void GameInitial();
void GameCircle();
void GameDrawScene();
void GameButtonDown(int nKeyNumber);
void GameButtonUp(int nKeyNumber);
void GameEnd();
};

#endif
[/code][/code]Game.cpp:[code]
//游戏入口类

#include "Game.h"

void Game::GameInitial()
{

}


//游戏循环
void Game::GameCircle()
{

}

//游戏绘图
void Game::GameDrawScene()
{

}

//按下按键
void Game::GameButtonDown(int nKeyNumber)
{

}

//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{

}

//游戏结束
void Game::GameEnd()
{
Quit();
}

[/code]一,最基本的显示

Game.h:[code]
#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:
ZImage *m_img_demo; //这里添加图形类的对象
};

#endif
[/code]Game.cpp:
//游戏入口类[code]
#include "Game.h"

void Game::GameInitial()
{
//图像加载
this->m_img_demo = new ZImage;
this->m_img_demo->Load("image/demo0.jpg");
}


//游戏循环
void Game::GameCircle()
{

}

//游戏绘图
void Game::GameDrawScene()
{
this->m_img_demo->Show();
}

//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
if(nKeyNumber == PSP_BUTTON_SELECT)GameEnd(); //按Select退出程序
}

//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{

}

//游戏结束
void Game::GameEnd()
{
Quit();
}
[/code]运行后显示图片

[attach]16669[/attach]




二,简单的移动图片[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:
ZImage *m_img_demo;
float m_img_demo_x,m_img_demo_y;
};

#endif
[/code]Game.cpp:
//游戏入口类[code]

#include "Game.h"

void Game::GameInitial()
{
//图像加载
this->m_img_demo = new ZImage;
this->m_img_demo->Load("image/demo0.jpg");
this->m_img_demo_x = 0;
this->m_img_demo_y = 0;
}


//游戏循环
void Game::GameCircle()
{

}

//游戏绘图
void Game::GameDrawScene()
{
this->m_img_demo->Show(this->m_img_demo_x,this->m_img_demo_y); //按坐标显示
}

//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
if(nKeyNumber == PSP_BUTTON_SELECT)GameEnd(); //按Select退出程序
if(nKeyNumber == PSP_BUTTON_UP) //上 用IF IF IF IF 而不用IF ELSE 意在按键可以做同时按下的处理
this->m_img_demo_y -= 10;
if(nKeyNumber == PSP_BUTTON_DOWN)//下
this->m_img_demo_y += 10;
if(nKeyNumber == PSP_BUTTON_LEFT)//左
this->m_img_demo_x -= 10;
if(nKeyNumber == PSP_BUTTON_RIGHT)//右
this->m_img_demo_x += 10;
}

//弹起按键
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:
ZImage *m_img_demo; //图片对象
float m_img_demo_x,m_img_demo_y; //图片显示的左上角的坐标
int m_img_demo_state; //图片坐标变化的状态值 0为静止,1为上移等等 [color=Red],状态机[/color]};

#endif

[/code]Game.cpp:[code]
//游戏入口类

#include "Game.h"

void Game::GameInitial()
{
//图像加载
this->m_img_demo = new ZImage;
this->m_img_demo->Load("image/demo0.jpg");
this->m_img_demo_x = 0;
this->m_img_demo_y = 0;
this->m_img_demo_state = 0;
}


//游戏循环
void Game::GameCircle()
{
//处理坐标变化
switch(this->m_img_demo_state)
{
case 1: //图片上移
this->m_img_demo_y -= 1;
break;
case 2: //图片下移
this->m_img_demo_y += 1;
break;
case 3: //图片左移
this->m_img_demo_x -= 1;
break;
case 4: //图片右移
this->m_img_demo_x += 1;
break;
case 0: //图片静止
break;
}
}

//游戏绘图
void Game::GameDrawScene()
{
this->m_img_demo->Show(this->m_img_demo_x,this->m_img_demo_y); //按坐标显示
}

//按下按键
void Game::GameButtonDown(int nKeyNumber)
{
if(nKeyNumber == PSP_BUTTON_SELECT)GameEnd(); //按Select退出程序
switch(nKeyNumber) //上下左右按下时
{
case PSP_BUTTON_UP:
this->m_img_demo_state = 1;
break;
case PSP_BUTTON_DOWN:
this->m_img_demo_state = 2;
break;
case PSP_BUTTON_LEFT:
this->m_img_demo_state = 3;
break;
case PSP_BUTTON_RIGHT:
this->m_img_demo_state = 4;
break;
}
}

//弹起按键
void Game::GameButtonUp(int nKeyNumber)
{
switch(nKeyNumber) //上下左右弹起时
{
case PSP_BUTTON_UP:
this->m_img_demo_state = 0;
break;
case PSP_BUTTON_DOWN:
this->m_img_demo_state = 0;
break;
case PSP_BUTTON_LEFT:
this->m_img_demo_state = 0;
break;
case PSP_BUTTON_RIGHT:
this->m_img_demo_state = 0;
break;
}
}

//游戏结束
void Game::GameEnd()
{
Quit();
}
[/code][attach]16670[/attach]



四,提示:做个图片查看器(支持BMP ,JPG,PNG等),需要用到标准库的 文件处理函数(遍历文件名)。


浅仓奈绪狸猫君
2010-11-08 23:13:24

这这这…瞎了俺的超级合金狗眼般的存在啊%…算了抛弃之前的来搞这个吧……


william6849
2010-11-09 00:00:16

有待研究 俺的眼睛啊


boy545003571
2010-11-09 08:01:05

教程什么的,一定要收藏的~~谢谢LZ了,辛苦


雷精灵
2010-11-09 11:52:24

狗眼!乃赔我的狗眼!C++什么的最讨厌了。


cshfelix
2010-11-09 12:25:38

现在偶正在学习C++中


乐不思蜀
2010-11-09 16:16:34

表示很无力的说…


andy
2010-11-09 16:54:55

看不懂说.......
虽然想学.......


easycker
2010-11-09 20:42:48


C嘎嘎有那么难吗~~~!!!


easycker
2010-11-09 20:56:08

已更新 了


白枫
2010-11-10 08:04:13

[quote]狗眼!乃赔我的狗眼!C++什么的最讨厌了。
[size=2][color=#999999]雷精灵 发表于 2010-11-9 11:52[/color] [url=http://www.yayabo.cn/redirect.php?goto=findpost&pid=150407&ptid=13382][img]http://www.yayabo.cn/images/common/back.gif[/img][/url][/size][/quote]


。。。。


幻の上帝
2010-11-11 14:14:08

[quote]
ISO/IEC 14882:2003
17.4.3.1.2 Global names [lib.global.names]
1 Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
letter (2.11) is reserved to the implementation for any use.[/quote]
所以header guard最好不要用_GAME_H之类的,这样确实比较瞎眼……


easycker
2010-11-11 18:35:33

没有看明白,上面的英文是什么东西。


幻の上帝
2010-11-12 20:26:47

[quote]回复 幻の上帝


没有看明白,上面的英文是什么东西。
[size=2][color=#999999]easycker 发表于 2010-11-11 18:35[/color] [url=http://www.yayabo.cn/redirect.php?goto=findpost&pid=151304&ptid=13382][img]http://www.yayabo.cn/images/common/back.gif[/img][/url][/size][/quote]
简而言之,遵守C++标准的规定,不要使用包含两个连续下划线或者以下划线紧接大写字母开头的自定义标识符,除非你写了个编译器来把它当作一个关键字,或者你在写一个标准库的实现。
当然,实际上问题不大。但这多少能体现出一个库的严谨性。


easycker
2010-11-13 20:08:47

Each name that contains a double underscore (_ _) or begins

_GAME_H
是定义的宏

MFC里到处都是这种N个下划线的。


幻の上帝
2010-11-14 15:32:18

[b]回复 [url=http://www.yayabo.cn/redirect.php?goto=findpost&pid=152118&ptid=13382]15#[/url] [i]easycker[/i] [/b]
向MFC这种古董看齐么?
也罢。MFC出来的时候倒是还没有标准。


easycker
2010-11-17 09:00:27

那么Qt4呢?


幻の上帝
2010-11-18 20:00:34

Qt后台硬,非标准工具链就是有人用,所以无所谓——反正不是“纯”C++嘛。如果LZ能有时间自己写附加预处理器那就最好不过——尽管仍然要看编译器脸色。
PS.Qt刚出的那时候也还没标准,和MFC一样存在历史遗留问题;当然,后续维护要好一些。