世嘉MD游戏开发【十】:精灵动画,Sprite Animation
能在世嘉MD上显示自己做的精灵动画实在是一件令人兴奋的事啊,今天就来讲一下如何在MD上显示精灵动画。先准备好一张精灵图片序列,有这么几点要求:1.单个精灵的像素宽x高不能超过16384,(以tile为单位的话,就是16x16,以像素为单位就是128x128),而且分辨率必须是8的整数倍,颜色数不能超过16色。2.可以多个动画放在一张图上,要横着排列,一横排是一个动画,另一个动画就要...
能在世嘉MD上显示自己做的精灵动画实在是一件令人兴奋的事啊,今天就来讲一下如何在MD上显示精灵动画。
先准备好一张精灵图片序列,有这么几点要求:
1.单个精灵的像素宽x高不能超过16384,(以tile为单位的话,就是16x16,以像素为单位就是128x128),而且分辨率必须是8的整数倍,颜色数不能超过16色。
2.可以多个动画放在一张图上,要横着排列,一横排是一个动画,另一个动画就要另起一横排,如下图所示(注:图中网格是参考线,不属于图片):
动画1在代码中其实是0,从0开始数的,这都是常识了。
图片处理完后保存备用。
其实这一节讲的东西不多,前面一节讲精灵sprite的时候已经讲了不少了,这节就很简单了。
在工程目录下的res文件里放一张处理好的动画图和一张背景图,背景图大家随便找一个就好,然后ps处理一下,尺寸是8的整数倍,颜色不能超过16,处理好保存备用,然后用vscode打开工程,在res文件夹下新建resources.res:
里面写如下内容:
IMAGE bg "background.png" 0
SPRITE anim "animation.png" 13 13 0 8
IMAGE不需要介绍了,SPRITE稍微补充以下,两个13意思就是说,这个精灵动画的每一帧的tile尺寸都是13x13,像素宽高除以8就是tile尺寸了,0代表不压缩,8代表动画每一帧之间的间隔是8/60秒,详情可以看SGDK/bin目录下的rescomp.txt,然后在工程根目录下的src文件夹里写代码:
#include <genesis.h>
#include <vdp.h>
#include <sprite_eng.h> // Sprite有关的函数都在这里,可以F12定位过去查看注释
#include "resources.h" // .res文件自动生成的头文件
//定义动画ANIM_IDLE的值为0,后面要用到
#define ANIM_IDLE 0
#define ANIM_DEFENSE 1
#define ANIM_MOVE 2
#define ANIM_ATTACK 3
int main()
{
//sprite的位置
s16 pos_x = 30;
s16 pos_y = 100;
//声明一个Sprite
Sprite *spr = NULL;
//设置PAL0调色板为背景的调色板数据
VDP_setPalette(PAL0, bg.palette->data);
//略过,参考前面的内容
u16 index = TILE_USERINDEX;
//绘制背景,详细参数略过,前一节已经讲过
VDP_drawImageEx(PLAN_B, &bg, TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, index), 0, 0, FALSE, CPU);
//略,前面讲过
index += bg.tileset->numTile;
//设置PAL1调色板为精灵动画的调色板数据
VDP_setPalette(PAL1, anim.palette->data);
//绘制文字,略过
VDP_drawText("SEGA Genesis Animation Test.", 1, 11);
//初始化SPR,一定要写这一句,不能忘记
SPR_init();
//把anim的数据初始化为spr精灵
spr = SPR_addSprite(&anim, pos_x, pos_y, TILE_ATTR(PAL1, FALSE, FALSE, FALSE));
while (1)
{
//获取键值
u16 input = JOY_readJoypad(JOY_1);
//按下左键
if (input & BUTTON_LEFT)
{
//水平方向翻转,因为按了左键人物就要转身了
SPR_setHFlip(spr, TRUE);
//按了左键人物要行走了,所以设置精灵spr的动画为ANIM_MOVE
SPR_setAnim(spr, ANIM_MOVE);
//走的时候坐标x要动的
pos_x--;
}
//按下右键
if (input & BUTTON_RIGHT)
{
//同上
SPR_setHFlip(spr, FALSE);
//同上
SPR_setAnim(spr, ANIM_MOVE);
//同上
pos_x++;
}
//按下C键防御
if (input & BUTTON_C)
{
//按防御的时候是能移动的,逻辑就不写完整了,只是简单做一下示范
SPR_setAnim(spr, ANIM_DEFENSE);
}
//按下A键攻击,这里攻击动画的位置没对好,所以播放起来感觉比较鬼畜,处理图片素材的时候一定要对好角色的位置
if (input & BUTTON_A)
{
SPR_setAnim(spr, ANIM_ATTACK);
}
//什么都不按的时候就转到待机动画
if (!(input & BUTTON_LEFT) &&
!(input & BUTTON_RIGHT) &&
!(input & BUTTON_A) &&
!(input & BUTTON_C))
{
SPR_setAnim(spr, ANIM_IDLE);
}
//更新精灵的坐标
SPR_setPosition(spr, pos_x, pos_y);
//更新精灵,这一句一定要写,很容易忘记的,不写是不会显示精灵的
SPR_update();
VDP_waitVSync();
}
return 0;
}
编译,得到rom.bin,用MD模拟器运行,如下图所示:
更多推荐
所有评论(0)