世嘉MD游戏开发【十】:精灵动画,Sprite Animation

news/2024/11/28 2:54:47/

能在世嘉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 3int main()
{//sprite的位置s16 pos_x = 30;s16 pos_y = 100;//声明一个SpriteSprite *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_MOVESPR_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模拟器运行,如下图所示:


http://www.ppmy.cn/news/535659.html

相关文章

世嘉MD游戏开发【四】:输入控制(下)

上一节讲了世嘉MD两种输入控制当中的一种&#xff0c;也是比较容易理解的一种&#xff0c;这一节讲一下剩下的这种控制方式&#xff1a;回调函数式。 建好文件夹&#xff0c;用vscode打开&#xff0c;新建main.c&#xff0c;依然是直觉一般的写下如下代码&#xff1a; #inclu…

世嘉MD游戏开发【九】:Sprite精灵

终于讲到Sprite精灵了&#xff0c;我自己也很希望快点讲精灵&#xff0c;但是欲速则不达&#xff0c;自己要是还没研究透彻这个知识点就去讲下一个&#xff0c;感觉文章肯定是写不好的。 我用下图来做演示&#xff0c;SFC幽游白书-魔界最强列传里的雷禅&#xff1a; 怎么处理图…

世嘉MD游戏开发【五】:显示Tile图块

显示Tile图块&#xff0c;首先要有tile图块&#xff0c;这就要用到一个小工具了&#xff0c;叫Sega Genesis Tile Designer&#xff0c;软件界面如下&#xff1a; 看起来很复杂&#xff0c;其实自己亲自操作一下几分钟就能搞懂了&#xff0c;都是些很基础的功能&#xff0c;软件…

世嘉MD游戏开发【十二】:伪3D地面,Pseudo-3D

终于讲到伪3D效果了&#xff0c;这一块比较棘手&#xff0c;我从github上下载的老外写的例子一点点研究&#xff0c;研究了两三天才研究出原理&#xff0c;其实原理很TM简单&#xff0c;主要是那个老外写的代码太烂了&#xff0c;写了很多没用的东西&#xff0c;而且算法上还啰…

世嘉MD游戏开发【二】:Hello World

上一节课已经讲了SGDK环境的配置&#xff0c;这一节课来开发我们的第一个世嘉MD程序&#xff1a;Hello World 编辑器我用的vscode&#xff0c;本文就以vscode为主。 一、新建一个工程&#xff0c;其实不用说的这么正式&#xff0c;意思就是在你喜欢的任意位置新建一个文件夹&…

世嘉MD游戏开发【七】:绘制图片,drawImage

这一期讲绘制图片。 上一期讲的是绘制tile&#xff0c;还要用那个不怎么好用的工具导出数组数据&#xff0c;很繁琐&#xff0c;这次就不用那个蹩脚的工具了&#xff0c;随便一个图片用photoshop处理一下就可以了&#xff0c;对于图片的要求有这么几点&#xff1a; 1.图片分辨…

神龟对打java_谁知道世嘉游戏忍者神龟对打的出招表!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 忍者神龟之格斗大会 Teenage Mutant Hero Turtles Tournament Fighters (E) KONAMI/93.12.10/机种MD/类型FTG 基本操作-出招-- A 轻斩 B 轻踢 C 挑衅 投技&#xff1a; 近身 → A或B 当血槽减少呈闪灭状态时可使用超必杀 ~~~~~~~…

【数据库七】MySQL主从复制与读写分离

MySQL主从复制与读写分离 1.案例概述2.什么是读写分离&#xff1f;3.为什么要读写分离呢&#xff1f;4.什么时候要读写分离&#xff1f;5.主从复制与读写分离6.MySQL主从复制原理6.1 mysql的复制类型 7.主从复制的工作过程7.1 MySQL架构图7.2 口语化工作工程 8.MySQL 读写分离原…