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

news/2024/11/28 4:35:00/

显示Tile图块,首先要有tile图块,这就要用到一个小工具了,叫Sega Genesis Tile Designer,软件界面如下:

看起来很复杂,其实自己亲自操作一下几分钟就能搞懂了,都是些很基础的功能,软件可以到我群里的群文件下载。

这一节课,我就来演示一下如何显示出图中的这个小人儿。

前面讲过的操作我都会省略,没看过前面几节课的童鞋可以补一下,编辑器我用vscode。

点击下图中的按钮,导出数据:

点击后弹出如下窗口,按下图操作:

Export Format选择C语言,Start Tile是从第几个tile开始,End Tile就是到第几个tile结束了,我这里只画了一个tile,所以是从0到0,如果画了两个tile那就是从0到1,以此类推。

设置完毕点Generate Data生成数据,弹出如下窗口:

点Save To File存到你的工程目录里。

把unsigned long 替换成const u32,变量名你自己喜欢改就改个名字,不想改就不用动了,变量名我就叫tile了,如下代码:

const u32 tile[8] = {0x00FFFF00,0x0F1111F0,0xF111111F,0xF1F11F1F,0xF111111F,0xF11FF11F,0x0F1111F0,0x00FFFF00, //  Tile: 0
};

改完之后会报错,说未定义标识符u32,在上面include一下<genesis.h>就好了,然后新建一个tile.h头文件,头文件里就不用include<genesis.h>了,代码如下:

const u32 tile[8];

忘了一件事,tile的调色板还没处理,回到tile编辑器里,点如下按钮切换到调色板编辑界面:

调色板一共有64种颜色,每16种颜色一组,分成4组,这是同屏幕可以显示的最多颜色数,一个tile块最多可以使用16种颜色,每一个颜色对应一个16进制颜色数,咱么可以不用tile编辑器,直接用手来写一个tile块(8x8),代码如下:

const u32 tile[8]={0x55555555,    //一位数代表一个像素,这个数是从0-F,正好对应了调色板中的16种颜色。0x50000005,    //5意思就是这个像素用了调色板中的第6个颜色0x50000005,    //0意思就是这个像素用了调色板中的第1个颜色0x50000005,    //不难看出这个tile绘制出来之后是一个矩形0x50000005,0x50000005,0x55555555,
};

这里我就不去测试绘制这个矩形tile了,只是告诉大家一下原理,帮助理解,回到正题。

按Export Palette导出调色板数据,依然选择C语言,这里只用到了第一组色板,导出从0到0就可以了:

导出pal.c文件到工程:

把代码改成如下:

#include<genesis.h>const u16 palette [16] = {0x0EEE,0x00EE,0x0E0E,0x000E,0x0EE0,0x00E0,0x0E00,0x0888,	//  Pallette: 00x0CCC,0x0088,0x0808,0x0008,0x0880,0x0080,0x0800,0x0000,	
} ;

新建pal.h就不说了,跟tile.h一样道理。

新建main.c,代码如下:

#include <genesis.h>
#include <vdp.h>
#include "tile.h"
#include "pal.h"int main()
{/*简介:加载tile数据tile:就是tile数组了第一个1:VRAM(显存)中存储Tile块的数量是固定的,上限多少块Tile我也不清楚,如果填写0,则全部位置都填充这个tile,如果填写1,则1这个位置就是这个tile,如果填写2,那么2这个位置就是这个tile,以此类推,如果后面再写一句VDP_loadTileData,第一个参数是另一个tile,第二个参数还是1,那么1这个位置的tile则被后来的tile覆盖掉(这个地方太拗口)第二个1:是一共有几个tile块,这里就一个图块就写1,要是绘制了5个图块就写5最后一个参数可以写0-2,这里写0就可以了,0代表CPU,1代表DMA,2代表DMA_QUEUE*/VDP_loadTileData(tile, 1, 1, 0);/*设置调色板颜色0代表从第几个颜色开始设置,范围是0-63pal就是pal数组了16是你要设置的颜色数量,pal数组里有16种颜色,就写16*/VDP_setPaletteColors(0, palette, 16);/*简介:在xy位置显示VRAM中指定位置的tile块。PLAN_A:是卷轴A,还有PLAN_B,用A卷轴也可以,用B卷轴也可以。1:指定VRAM中的位置,就是VDP_loadTileData中的第二个参数,如果VRAM中指定的位置没有tile,那么你将得到一个垃圾值。2:x网格坐标,这里的xy不是像素位置,是以8x8为单位分割成的网格坐标。2:y网格坐标。*/VDP_setTileMapXY(PLAN_A, 1, 2, 2);while (1){VDP_waitVSync();}return 0;
}

最后一步,按下Ctrl+Shift+B编译,看到工程目录下多出一个out文件夹,out文件夹里有一个rom.bin文件,就是制作好的游戏rom了,用MD模拟器打开rom就能看到tile图块了,是一个笑脸。

未完待续。。。

复古游戏开发群:879063892


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

相关文章

世嘉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 读写分离原…

构建安全架构的 Azure 云:深入了解零信任体系结构

文章目录 前言一、零信任安全模型的概念以及背景介绍二、传统安全模型&#xff08;边界模型&#xff09;三、零信任模型&#xff08;现阶段主流云厂商策略&#xff09;四、Azure 中的零信任体系结构&#xff08;本文重点&#xff09;4.1 基础知识点&#xff08;必须了解&#x…

修改及刷写蓝魔V3 value MP3固件心得

刷写蓝魔V3 value MP3固件心得 出于无聊网购了一台蓝魔V3 value 来听&#xff0c;拿来之后发现有诸多的不足之处&#xff0c;于是想修改下固件&#xff0c;从官方网上下载来了固件和刷机工具。结果发现原来的ResEdit V2.0已经无法胜任此修改了&#xff0c;知道是蓝魔固件进行过…

蓝魔RM990 RK2706工具集

今天意外的本来想出去买条音频线的时候&#xff0c;带上P4&#xff0c;结果发现触摸屏不能用了。 于是&#xff0c;就再次准备刷固件了。 好吧&#xff0c;就这样把自己所有的电子设备貌似都刷了一遍机了。又再次DIY了一次。 然后总结了一下&#xff0c;自己就这样。首先是笔…