能在世嘉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模拟器运行,如下图所示:

更多推荐