欢迎光临散文网 会员登陆 & 注册

梦开始的地方——FC游戏开发指南(5)导入并显示图片

2021-10-19 15:57 作者:皮皮关做游戏  | 我要投稿

上期链接:https://www.bilibili.com/read/cv13580523


上一次我们学习了FC像素画的绘制方法,理解了Tile、调色板的概念,以及制作流程。

这次我们试着引入chr文件与调色板,让它们在游戏中实际显示出来。主要涉及三个问题:导入chr,导入调色板,使用它们。

1、保存CHR和调色板

在YY-CHR中,选择 文件 -> 保存就可以保存CHR文件,后缀为chr。

然后保存调色板,调色板文件格式不统一,非常乱,给初学者带来很多困扰。这里我找到最简单的办法是保存“自定义调色板”。

自定义调色板是一个非常短小的二进制数据文件,里面只有颜色编号,别的什么都没有。

2、导入绘制好的CHR到游戏中

首先说明:FC游戏rom(卡带)作为一个整体,它的代码、图形、调色板都是要整体保存在一块儿的。咱们开发者要指定清楚具体怎么摆放,具体包括四类数据:代码、chr、调色板和地图(map)。

只要写清楚配置,编译器会自动帮我们摆好。具体做法:

1、修改汇编文件crt0.s

用任意编辑器打开crt0.s文件,它的内容像这样:

它是最主要的汇编文件,起到汇总所有资源的作用。未来我们经常需要修改它。

现在是导入我们新建的chr文件,建议大家在修改《移动》的crt0.s文件时,参考《迷宫不迷》的crt0.s文件,对比学习。修改时♥细心♥一点。

具体步骤:

1、在开头第9行后面加一行,加上自己的调色板符号,该符号是导出给C语言用的:

2、在140行左右,在rti和“hardware vectors”之间,插入具体的调色板数据。

3、在文件最后,替换掉原来的chr。删除或者注释原来的,写上新的:

编译测试,看看chr是不是已经被替换掉了。以前是“维京”的字符,现在已经变成其它字符了。

3、用代码显示指定的tile

比如说,在上一节我改完的chr是下图这样:

我现在想要用cprintf函数画出小飞机,怎么做呢?

把鼠标停在飞机左上角的tile上,看编辑器下方是不是有个ADF[80] = 80的提示?它说明该tile的编号是16进制的80,记作0x80。以此类推,飞机占9个tile,分别是0x80、0x81、0x82,0x90、0x91、0x92,0xA0、0xA1、0xA2。

在上次程序的基础略作修改,就得到了一架可以上下左右运动的飞机:

代码:


4、加载调色板

飞机倒是出来了,但是颜色不太对。

我们画的飞机是蓝白色,怎样使用自定义调色板my_chr.dat呢?

其实我们在汇编文件crt0.s里已经设置好了调色板_my_chr_dat,现在只要在C语言里导入它就行了。

在C语言开头加上外部变量定义:

这个变量名必须是my_chr_dat,为什么呢?因为我们在crt0.s里写的是_my_chr_dat,二者必须完全对应,注意一个开头有下划线另一个没有。编译器就是这么规定的。

改一下代码:

#include "mylib.c"extern u8 my_chr_dat;// 手柄输入变量,变量名不要改,与mylib.c保持一致u8 key, okey; // 当前输入值,上一帧输入值u8 x, y;// 程序入口void main(){ int t = 0; // 初始化 key = 0; okey = 0; x = 10; y = 10; // 加载背景调色板 // 如果不先关闭显示,会导致时序混乱而加载错误 disable_graphics(); // 关闭显示 load_BG_palette((u8*)(&my_chr_dat)); enable_graphics(); // 打开显示 // ★ 主游戏循环 while (1)…………后略………………

之后飞机颜色就正常啦

总结

  1. chr图形最终以二进制方式直接被包含在汇编文件中。

  2. 调色板以二进制方式直接被包含在汇编文件中,且暴露出一个链接符号给C语言,C语言就可以引用调色板的地址。

  3. 加载背景时需要关闭显示、开启显示。必须写这一步骤,是硬件设计决定的。

★预告:精灵(sprite)

实际上,将图片显示到背景中意义不是很大。FC游戏开发真正的重点在于“精灵”。精灵是PPU最核心的功能,下一期我们开始重点介绍精灵的原理与使用方法。


(本文作者 @goodorc_gamedev。欢迎加入游戏开发群欢乐搅基:1082025059

对游戏开发感兴趣的童鞋可戳这里进一步了解:http://www.levelpp.com/)


梦开始的地方——FC游戏开发指南(5)导入并显示图片的评论 (共 条)

分享到微博请遵守国家法律