用C语言开发NES游戏(CC65)03、VRAM缓冲区
粘贴到CSDN格式没调,想看格式好的点下面
https://happysoul.github.io/nes/nesdoug/
我写了一些支持函数来填充VRAM缓冲区。
我使用了一些后台场景的代码,在crt0.s中定义了一个VRAM_BUF,地址是 $700。
请注意,这在技术上与C堆栈共享700-7ff空间。他们可能会发生冲突。如果你担心这个问题请将VRAM缓冲区设置为600-6ff。
但是你不能向VRAM缓冲区写入超过74 bytes,这样就不会比77 bytes更多了。
C堆栈从7ff开始增长。并且,C堆栈只需要十几个字节,如果你像我一样编程,并且不使用局部变量,并且一次只传递几个函数(最好是没有),并且不使用递归。如果你做那些事情,你会没事的。但是,我想我应该让你知道。
要使用我的系统,您需要指向我的系统的一些内部指针。这不需要传递值,该地址由crt0.s中的VRAM_BUF定义。
set_vram_buffer()
这有点像set_vram_update()。
要将PPU更新指向另一个数据集,您可以使用set_vram_update(&data)
关闭可以使用set_vram_update(NULL)
您需要做的另一件事是每帧重置缓冲区。
clear_vram_buffer()
当您写入缓冲区时,它会记住它所在的位置,并且会继续增长。clear_vram_buffer()会将索引重置为零。
数据在帧之间自动传输,因此在ppu_wait_nmi()之后,数据已经发送,我们就可以清除它了。
缓冲单个贴图
one_vram_buffer(tile, ppu_address)
你只需要瓷砖编号和地址。这个宏可以得到地址 NTADR_A(x,y)
X和Y是平铺位置。X从0到31,Y从0到29。
您还可以使用我编写的函数在运行时计算地址
像素点 0-255 X, 0-239 Y
NT是nametable,0-3 (备注:也就是4块显示屏)
get_ppu_addr(char nt, char x, char y);
你可以写一个连续的运行
multi_vram_buffer_horz(const char * data, unsigned char len, int ppu_address);
或
multi_vram_buffer_vert(const char * data, unsigned char len, int ppu_address);
Horz 从左到右,Vert从上到下
地址、数据、EOF被复制到VRAM缓冲区,其中一个优点是,当持续写入缓冲区的时候,EOF会自动调整。
但是这里有个需要注意的问题,缓冲区的大小没有监控,如果你不小心写多了(溢出缓冲区),就会出问题了(花屏、乱码、不对齐、崩溃)
我写了很写屏幕的例子,而且这些都是在一个 v-blank 期间完成的。这几乎是你在一帧中可以可以改变的最大数量。
https://github.com/nesdoug/03_Hello3/blob/master/hello3.c
https://github.com/nesdoug/03_Hello3
用C语言开发NES游戏(CC65)03、VRAM缓冲区相关推荐
- 用C语言开发NES游戏(CC65) 前言
作者网站更新日期 2018年9月 翻译日期从2018年11月底开始逐步翻译,基于浏览器的翻译,重要地方逐句对比原和译文,有时候会加入些个人见解,让文字变得能像是句人话. 作者github地址: htt ...
- 用C语言开发NES游戏(CC65) 简介
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/ 简介: 作者nesdoug,作者重写了他的代码并发布到了github https://gi ...
- 用C语言开发NES游戏(CC65)11、Metatiles
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 什么是metatile,对于贴图来说这是个特殊的词.在我的工程里有2x2的 ...
- 用C语言开发NES游戏(CC65)15、音乐
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 我前段时间写了一篇关于NES Audio文章. https://nesdo ...
- 用C语言开发NES游戏(CC65)04、完整的背景
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 制作一张全屏显示的背景图 (备注:这里的RLE是作者将图片变成NES可以识 ...
- 用C语言开发NES游戏(CC65)21、完成一个游戏
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 我要做的第一件事是标题屏幕.这部分快速搞定,毕竟只是为了展示一下.我用 N ...
- 用C语言开发NES游戏(CC65)06、精灵
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 什么是精灵?精灵是一种可以在整个屏幕上自由移动的贴图.精灵通常是8×8,但 ...
- 用C语言开发NES游戏(CC65)14、游戏平台
粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 我们要做的是向右滚动显示. 游戏吸引人的地方在哪里呢?重力. 我们需要16 ...
- 聊聊在博客园写博客的这两年《Unity 3D脚本编程:使用C#语言开发跨平台游戏》正式出版...
版本状态: 2016.9 第一次印刷 (2016.11 输出到台湾) 2017.1 第二次印刷 2017.5 第三次印刷 2017.5 电子书上线:Unity 3D脚本编程--使用C#语言开发跨平台游 ...
最新文章
- gdb来调式多线程(转)
- 将动态路由、布局和RouteViews添加到Blazor应用程序组件
- 做报表的朋友偷偷告诉我月薪5w的秘密:让报表动起来
- 网络的日常——破解电信光猫后开启NAT接口映射
- hilbert变换简介
- gpio引脚介绍 树莓派3b_树莓派引脚对照表
- JavaScript实现富文本编辑器
- tags与categories
- 联想微型计算机怎么恢复系统,联想一体机系统还原的方法 联想一体机如何还原系统...
- Java实体类(entity)作用
- 淘宝主图优化技巧 测试淘宝女鞋主图点击率方法
- __weak 关键字的作用
- 告别传统开店模式,借鉴餐饮理发店经营思路,谁都可以当甩手掌柜
- 跟烟草有关的一些“第一”
- 多款非常优秀的基于 vue3.x 、Native UI、TypeScript 的中后台管理系统模板
- 智能工厂信息管理系统软件-工厂信息化管理系统
- wireshark抓包日志分析--洗号空闲超时案例
- jquery实现随机点名(点名器)
- zynq平台,PS 与 PL共享内存的方法
- 管控软件开发进度 4大关键项需要重视