NESASM教程——第五天——主角出场

简介:

【主角】

主角和背景比起来,你肯定觉得背景会更简单。错!主角才简单得要命。

制造主角只需要向SPR-RAM写入一点点内容(主角的x,y坐标,tile编号,等等)。

等等,我觉得咱们得先绘制主角的图片才行,走起~:)

【Tile Layer Pro】

存储主角像素块的表格称为Pattern Table,大小4KB,位于PPU $0000~$0FFF或$1000~1FFF(由PPU 控制寄存器设置,见第三天内容)。

绘制像素块的工具可以用Tile Layer Pro,我们从一个空白的像素块开始。

运行TLP.exe,打开MT.spr。点击View菜单,设置Format为NES。

点击大的网格窗口的左上角第一个小方块,看到右边有个Pallete Editor窗口,这就对了,我们只能用4种颜色。现在在Tile Editor窗口中画一个小笑脸或者其他什么东东。保存文件为our.spr。很好,我们拥有了一个主角!你要是实在做不来,那就下载我做的这个

之后,重新下载MT.spr,重命名为our.bkg。顾名思义,这个是用于背景的。今天我们不讨论背景的制作,但为了让今天程序运行,我们必须有这个文件。

将our.spr和our.bkg放到同一个文件夹下,你的源代码也放在这里。

【段2变得更重要了】

前一天,我们告诉PPU,我们将使用段2的$0000作为背景图片数据区,$1000作为主角图片数据区。这样一来段2就拥有8KB,即$2000字节。4KB就是4096B或十六进制下的$1000B。代码中我们这样实现:

	.bank 2
	.org $0000
	.incbin "our.bkg"
	.incbin "our.spr"

.incbin包含一个二进制文件。

【写SPR-RAM】

SPR-RAM也称“主角信息区”,写入通过两个寄存器:$2003和$2004。类似前面载入调色板时写$2006和$2007,我们同样需要先写两次$2003,告诉PPU地址,然后将数据写入$2004。

	lda #$00
	sta $2003
	sta $2003

这样设置SPR-RAM地址为$0000。

写$2004的内容包括4字节,具体如下:

Y —— 屏幕上的垂直位置

N —— 8x8 tile编号,我们包含的二进制.spr文件里面有256个不同tile,编号0~255

C —— 一些特殊信息,我还没细看

X —— 屏幕上的水平位置

PPU可以放置64个主角信息。如果我们想让主角在坐标(20,50)出场,tile编号为0,C不知是啥也写0,程序如下:

	lda #50     ; 
	sta $2004   ; 设置纵坐标为50
	lda #00     ; 
	sta $2004   ; tile编号为0
	sta $2004   ; C = 0.
	lda #20
	sta $2004   ; 设置横坐标为20

咣当!主角出现(希望如此)!

【VBlank】

理论上我们应该在场消隐期间写入SPR-RAM。这段时间称为VBlank。只给代码,不解释。我们重点是主角。

waitblank:
	lda $2002  ; 
	bpl waitblank  ; 

不用担心,我们马上就把代码组合到一起。

【第一个完整代码】

新建一个our.asm文件,用记事本或其他编辑器打开,拷贝以下代码:

	;;--- 程序开始 ---;;

	; INES 文件头
	.inesprg 1   ; 1 段代码
	.ineschr 1   ; 1 段数据
	.inesmir 1   ; 总是1
	.inesmap 0   ; 使用mapper 0

	.bank 1   ; 
	.org $FFFA  ; 
	.dw 0    ; dw 表示定义字,NMI中断向量 = 0(禁止)
	.dw Start ; 复位向量,代码从Start标签处开始
	.dw 0   ; VBlank 中断向量,0表示禁止
	; 

	.bank 0   ; bank 0 - 代码段
	.org $8000  ; 代码从 $8000开始
	
Start:  ;还记得大明湖畔的复位向量吗?
	lda #%00001000  ; 就像那天说的一样设置PPU
	sta $2000       ; 
	lda #%00011110  ; 
	sta $2001       ; 

	ldx #$00    ; 准备载入调色板

	lda #$3F    ; 
	sta $2006   ; 
	lda #$00    ; 
	sta $2006

loadpal:                ; 
	lda tilepal, x  ; 
	sta $2007       ; 
	inx             ; 
	cpx #32         ; 
	bne loadpal     ; 

waitblank:         ; 等待 VBlank 
	lda $2002  ; 读取 $2002的值
	bpl waitblank  ; 如果bit7 == 0,那就接着waitblank

	lda #$00   ; 写入SPR-RAM
	sta $2003  ; 
	lda #$00   ; 
	sta $2003  ; 

	lda #50  ; 
	sta $2004 ; 
	lda #$00  ; 
	sta $2004 ; 
	lda #$00 ; 
	sta $2004 ; 
	lda #20  ; 
	sta $2004 ; 
	; 注意顺序呀!

infin:
	jmp infin   ; 死循环

tilepal: .incbin "our.pal" ; 包含调色板,贴标签

	.bank 2   ; 数据段
	.org $0000  ; 
	.incbin "our.bkg"  ; 空白背景数据
	.incbin "our.spr"  ; 我们绘制的主角数据
	; 注意顺序呀!

	;;--- 代码结束 ---;;

上面代码如果有不懂的,再看看前面几天的教程。

【汇编】

把所有原材料准备好(our.pal, our.bkg, our.spr, nesasm.exe, our.asm),放到同一个文件夹,打开DOS,CD到这个文件夹,输入:

nesasm  our.asm

命令结束后,在当前文件夹下产生our.nes文件。用模拟器运行这个nes文件试试。

【今日回顾】

哇,这么多!别担心,看上去很多,一旦你懂了NES,这些东西都会乖乖听你的。明天我们也许会讲背景。睡个好觉~

目录
相关文章
|
7月前
|
前端开发 JavaScript Java
童年回忆——超级玛丽(内含源码inscode一键运行)
童年回忆——超级玛丽(内含源码inscode一键运行)
|
7月前
|
移动开发 前端开发 JavaScript
童年回忆——开心消消乐(内含源码inscode一键运行)
童年回忆——开心消消乐(内含源码inscode一键运行)
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
|
7月前
|
前端开发 JavaScript 程序员
程序员教你用代码制作圣诞树,正好圣诞节拿去送给女神给她个惊喜
使用HTML、CSS和JavaScript实现了一个圣诞树效果,包括一个闪烁的圣诞树和一个动态的光斑。代码包含一个<div>元素作为遮罩,一个<canvas>元素绘制星星动画,以及一个SVG元素绘制圣诞树。页面还包含一个提示用户先点赞再观看的提示。此效果适用于任何浏览器,推荐使用谷歌浏览器。提供了一段HTML代码,可以直接复制粘贴到文件中并以.html格式打开查看效果。
141 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死
151 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
145 0
|
SQL JavaScript Java
搭建情人节表白网站(超详细过程,包教包会)
网站的搭建其实在七夕的时候就已经弄好了,只是当时不会搭建,然后就放了好几个月,偶然发现情人节快到了,遂重新搭建了这个网站,不过说实话除了网站还真想不出有啥能够体现程序员的特长,你说各种代码,c,c++,java即时给你做出不错的GUI界面,人家还不一定会打开,网站最容易了,有手(机)就行,下面是它的效果展示视频,觉得好的记得三连哦
437 0
搭建情人节表白网站(超详细过程,包教包会)
|
前端开发 JavaScript 程序员
2023将至,前端程序员们应该一起放个烟花庆祝一下,走起
前言:小时候,在我印象中,每到快过年的时候就有很多卖炮仗的,一般也就是阳历的12月份到明年的正月15号卖炮仗的商家比较多,省下买辣条的钱去买炮仗,在老家也就过年和除夕两天及正月15日这几天放烟花和炮仗比较猛,现在年纪大了,听不得炮仗那种噪声了,也考虑到环保,工作之后的程序员以代码的形式演绎一下烟花的效果。
273 0
2023将至,前端程序员们应该一起放个烟花庆祝一下,走起
想过七夕?->女朋友陪你玩游戏(C)(上)
三子棋 七夕到了,没有女朋友怎么办?没事~ 写一个小游戏,让女朋友陪你玩三子棋~
想过七夕?->女朋友陪你玩游戏(C)(上)
|
存储 定位技术 C++
俄罗斯方块彩蛋(附星空表白彩蛋)
俄罗斯方块彩蛋(附星空表白彩蛋)
俄罗斯方块彩蛋(附星空表白彩蛋)