世嘉MD游戏开发【九】:Sprite精灵
终于讲到Sprite精灵了,我自己也很希望快点讲精灵,但是欲速则不达,自己要是还没研究透彻这个知识点就去讲下一个,感觉文章肯定是写不好的。我用下图来做演示,SFC幽游白书-魔界最强列传里的雷禅:怎么处理图片已经演示的很清楚了,前面也有讲过,不明白的可以到SGDK/bin里查看rescomp.txt这个文档。怎么把图片设置成精灵呢,先把需要的精灵放到工程根目录下的res文件夹里,...
·
终于讲到Sprite精灵了,我自己也很希望快点讲精灵,但是欲速则不达,自己要是还没研究透彻这个知识点就去讲下一个,感觉文章肯定是写不好的。
我用下图来做演示,SFC幽游白书-魔界最强列传里的雷禅:
怎么处理图片已经演示的很清楚了,前面也有讲过,不明白的可以到SGDK/bin里查看rescomp.txt这个文档。
怎么把图片设置成精灵呢,先把需要的精灵放到工程根目录下的res文件夹里,然后在res文件夹里新建一个resources.res文件,用记事本打开,在里面写上:
SPRITE hq "hq.png" 8 8 0
SPRITE是代表这个资源的类型,hq是这个资源的名字(写成黄泉的缩写了,应该叫lc.png,不要在意这些细节),在代码里用到的话就写hq,双引号内的是文件路径,8 8是这个图片横着数有几个tile,竖着数有几个tile,这个雷禅分辨率是64x64,除以8,所以就是8 8了,最后的0代表压缩级别,0是不压缩,也是质量最好的。
接着在工程根目录下的src文件夹里新建main.c,开始撸代码:
#include <genesis.h>
#include <vdp.h>
#include <sprite_eng.h>
#include "resources.h" //resources.res文件自动生成的头文件
//声明一个精灵变量
Sprite *sprite_hq = NULL;
//位置
s16 px = 0;
s16 py = 0;
//输入管理
void HandleInput();
//打印位置信息
void PrintMessage();
int main()
{
//初始化sprite,默认VRAM内有512个tile缓存区,内存中有320个tile缓存区,
//要是需要自己设置tile缓存区可以用void SPR_initEx(u16 vramSize, u16 unpackBufferSize);
//注:这一句初始化一定要写,不然显示会乱码
SPR_init();
//设置PAL1调色板为hq.palette->data,hq是SpriteDefinition类型的结构体:详情可定位到头文件查阅
// typedef struct
// {
// Palette* palette;
// u16 numAnimation;
// Animation** animations;
// u16 maxNumTile;
// u16 maxNumSprite;
// } SpriteDefinition;
VDP_setPalette(PAL1, hq.palette->data);
//背景太黑了,改成灰色
VDP_setBackgroundColor(3);
//给精灵变量赋值,后面这几个参数不再详细赘述,前面讲绘制图片时有讲到过类似的
sprite_hq = SPR_addSprite(&hq, px, py, TILE_ATTR(PAL1, 0, FALSE, FALSE));
while (1)
{
//输入管理
HandleInput();
//更新精灵,一定要写这一句,不要忘记,否则对精灵的操作都是无效的,并且也不会显示精灵
SPR_update();
//在屏幕打印出精灵的坐标信息
PrintMessage();
VDP_waitVSync();
}
return 0;
}
//前面有讲过input,很简单,大家看看就行
void HandleInput()
{
u16 input = JOY_readJoypad(JOY_1);
if (input & BUTTON_UP)
{
py--;
}
if (input & BUTTON_DOWN)
{
py++;
}
if (input & BUTTON_LEFT)
{
px--;
}
if (input & BUTTON_RIGHT)
{
px++;
}
//void SPR_setPosition(Sprite* sprite, s16 x, s16 y);
//s16是short
SPR_setPosition(sprite_hq, px, py);
}
//打印位置信息
void PrintMessage()
{
//存储x坐标
char msg_x[25];
//存储y坐标
char msg_y[25];
//把坐标格式化成字符串分别存到俩msg数组中,这里只写%hd不行,必须在%后面加上一个数字
//否则得到的坐标会变得很诡异,可以自行试一下
sprintf(msg_x, "sprite pos x : %6hd", px);
sprintf(msg_y, "sprite pos y : %6hd", py);
//略过
VDP_drawText(msg_x, 1, 22);
VDP_drawText(msg_y, 1, 23);
}
注:精灵的默认顶点是图片左上角。
编译,得到rom.bin,用模拟器打开,就可以用方向键控制精灵移动了^_^
未完待续。。。
复古游戏开发群:879063892
更多推荐
已为社区贡献2条内容
所有评论(0)