教程源代码下载地址:点击打开链接
教程图片:
一维数组的索引值转换成相应的列编号与行编号的公式 :
行编号=索引值/每一行的图块个数;
列编号=索引值%每一行的图块个数;
小图块贴图坐标的公式 :
左上点X坐标=xstart+(列编号-行编号)×图块的宽度/2;
左上点Y坐标=ystart+(列编号+行编号)×图块的高度/2;
整张地图的宽与高的计算公式:
地图宽=(列编号+行编号)×图块的宽度/2;
地图高=(列编号+行编号)×图块的高度/2;
/*
** Haaf's Game Engine 1.8
**
** 斜面地图教程
*/
#include "hge.h"// 包含hge头文件
#include "GfxFont.h"// 包含hgefont头文件
#include "hgesprite.h"
#include <stdio.h>
HGE *hge = 0;//创建一个指向hge类的指针。
GfxFont* fnt;//定义字体指针,
//显示图片
hgeSprite *spr[4];// 创建精灵类指针
hgeSprite *sprbj;// 创建精灵类指针
HTEXTURE tex[4],texbj;//定义一个 texture(纹理)对象
const int rows=10,cols=10;//定义 行编号和列编号
bool FrameFunc()//逻辑函数,此函数每一帧都会被调用一次,把你的游戏循环的代码在这里。
{
//检测"ESC"键是否被按下,如果返回 "true" 则停止运行程序.
if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
return false;//程序正常时总是返回false,当你希望程序终止时返回true
}
bool RenderFunc()// 绘制函数,将你的渲染代码放在这里。
{
int rowNum,colNum,x,y,
xstart=50*(rows-1),//xstart和ystart是第一张图片的XY坐标
ystart=160;
int mapIndex[rows*cols]={
2,2,2,2,2,2,2,2,2,2,
2,0,0,0,0,0,0,0,0,2,
2,0,1,1,1,1,1,1,0,1,
2,0,1,1,1,1,1,1,0,2,
2,0,1,1,1,1,1,1,0,0,
2,0,1,0,0,0,0,1,0,0,
2,0,1,0,0,0,0,1,0,0,
2,0,1,1,1,1,1,1,0,2,
2,0,0,0,0,0,0,0,0,2,
2,2,2,2,2,1,1,1,2,2 };
//开始渲染图像
hge->Gfx_BeginScene();
hge->Gfx_Clear(0xFF000000);//以某颜色清屏,OxFF000000为透明度为0的黑色
sprbj->Render(0,0);
for(int i=0;i<rows*cols;i++)
{
rowNum=i/cols;//求行编号
colNum=i%cols;//求列编号
x=xstart+colNum*100/2+rowNum*(-100/2);//求贴图X坐标
y=ystart+rowNum*50/2+colNum*(50/2);//求贴图Y坐标
spr[mapIndex[i]]->Render(x,y);//在指定位置拼接地图
}
//设置字体颜色
fnt->SetColor(0xFF00FFFF);
//渲染格式化的文本字符串(屏幕X坐标,屏幕Y坐标,排列分类符,文本字符串)
fnt->Print(20,20,"你好,地图!");
//结束渲染图像
hge->Gfx_EndScene();
//当你希望程序终止时返回true, //返回true将从 System_Start往下执行
//否则返回false。
return false;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)//WinMain 函数,程序的入口。
{
hge = hgeCreate(HGE_VERSION);//创建HGE接口,参数必须为HGE_VERSION
hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);//设置逻辑函数为FrameFunc函数
hge->System_SetState(HGE_RENDERFUNC,RenderFunc);//设置绘制函数为RenderFunc函数
hge->System_SetState(HGE_TITLE, "斜面地图");// 设置窗口标题
hge->System_SetState(HGE_SCREENWIDTH, 1000);//程序窗口宽度
hge->System_SetState(HGE_SCREENHEIGHT, 660);//程序窗口高度
hge->System_SetState(HGE_WINDOWED, true);//是否是窗口模式,默认是 800x600
hge->System_SetState(HGE_USESOUND, false);//使用声音资源
hge->System_SetState(HGE_SHOWSPLASH, false);//去掉HGE开始的LOGO
hge->System_SetState(HGE_HIDEMOUSE,false); //设置鼠标
if(hge->System_Initiate())//初始化引擎所需的所有软硬件并创建程序窗口。
{
char filename[20]="";
fnt= new GfxFont("宋体",35,TRUE,FALSE,TRUE);// 宋书,粗体,非斜体,非平滑
texbj=hge->Texture_Load("bj.png");//根据路径载入图片路径和后缀,这里是相对目录
sprbj=new hgeSprite(texbj,0,0,1000,660);//初始化精灵spr,并且指定tex为它的纹理
for (int i=0;i<4;i++)
{
sprintf(filename,"%d.png",i);// //把整数I 打印成一个 I.png 字符串保存在filename中。
tex[i]=hge->Texture_Load(filename);//根据路径载入图片路径和后缀,这里是相对目录
if(!tex[i])//检测是否图片成功载入
{
// 如果下初始化失败显示错误消息
MessageBox(NULL, hge->System_GetErrorMessage(), "Error tex[i]tex", MB_OK | MB_ICONERROR | MB_APPLMODAL);
}
// (tex,图片的显示起始位置X,起始位置Y,图片宽,图片高)
spr[i]=new hgeSprite(tex[i],0,0,100,50);//初始化精灵spr,并且指定tex为它的纹理
if(!spr)//检测是否成功载入
{
// 如果下初始化失败显示错误消息
MessageBox(NULL, hge->System_GetErrorMessage(), "Error spr", MB_OK | MB_ICONERROR | MB_APPLMODAL);
}
}
hge->System_Start();//运行FrameFunc().函数. 如果成功则返回true。否则返回false
}
else
{
// 如果下初始化失败显示错误消息
MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
}
for (int i=0;i<4;i++)
{
hge->Texture_Free(tex[i]);//释放纹理
delete spr[i];//释放精灵
}
delete fnt;//释放字体
// hge->Texture_Free(texbj);
delete sprbj;
hge->System_Shutdown(); //复原视频模式,释放所有已分配的资源,并销毁程序窗口。
//删除资源
hge->Release();//释放HGE接口并在必要时删除HGE对象。
return 0;
}