终于讲到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

更多推荐