C64平台Chrome Dino Demake开发问题:Sprite 0无法移动且顶部有乱码像素
C64平台Chrome Dino Demake问题:Sprite 0无法移动+顶部垃圾像素
我正在C64平台开发Chrome Dino的Demake,但代码运行异常:Sprite 0无法移动,且屏幕顶部出现垃圾像素。
Demake指将现代游戏适配到旧平台,或转换为旧的图形/玩法风格的游戏改编,本质上是Remake(通常适配到更先进平台)的对立面。
我的代码:
* = $0801 !word $0810 !word 2021 !byte $9e !text "2064" !byte 0 !word 0 * = $0810 dino_y = $fb dino_vy = $fc ; Ustawienia początkowe lda #$01 ; set bg color white sta $d021 lda #$80 ; set sp0 pointer to $2000 sta $07f8 lda #$00 ; set sp0 color to black sta $d027 lda #$80 ; sprite 0 x sta $d000 lda #$40 ; sprite 0 y sta $d001 lda #$01 ; sprite 0 enable sta $d015 ; init pos lda #$40 sta dino_y lda #$00 sta dino_vy mainloop: ; grawitacja lda dino_vy clc adc #1 sta dino_vy ; update dino ypos lda dino_y clc adc dino_vy sta dino_y ; update dino sprite lda dino_y sta $d001 ; delay setup ldx #$ff delay1: ldy #$ff delay2: dey bne delay2 dex bne delay1 jmp mainloop * = $2000 sprite0_data: !byte %00000000,%00000000,%00000000 !byte %00000000,%00000011,%11111100 !byte %00000000,%00000111,%11111110 !byte %00000000,%00000110,%11111110 !byte %00000000,%00000111,%11111110 !byte %00000000,%00000111,%11111110 !byte %00000000,%00000111,%11000000 !byte %00000000,%00000111,%11111000 !byte %00001000,%00001111,%10000000 !byte %00001000,%00011111,%10000000 !byte %00001100,%01111111,%11100000 !byte %00001110,%11111111,%10100000 !byte %00001111,%11111111,%10000000 !byte %00001111,%11111111,%10000000 !byte %00000111,%11111111,%00000000 !byte %00000011,%11111111,%00000000 !byte %00000001,%11111110,%00000000 !byte %00000000,%11101100,%00000000 !byte %00000000,%11000100,%00000000 !byte %00000000,%10000100,%00000000 !byte %00000000,%11000110,%00000000
问题分析与修复
1. Sprite 0无法移动的原因
- 重力逻辑无限制累加速度,导致
dino_y快速溢出,Sprite坐标超出屏幕范围后无法观察到移动 - 缺少地面碰撞检测,恐龙会一直向下"掉落"出屏幕
修复:
- 添加地面碰撞逻辑,当恐龙Y坐标触达地面时重置位置和速度
- 限制速度避免无限制加速
2. 屏幕顶部垃圾像素的原因
C64的单个Sprite仅需21字节数据(每行1字节),但你的代码中每行写入了3个字节,导致Sprite数据溢出到显存的其他区域,产生垃圾像素。
修复:
- 将Sprite数据调整为每行1字节的标准21字节结构
修改后的代码
* = $0801 !word $0810 !word 2021 !byte $9e !text "2064" !byte 0 !word 0 * = $0810 dino_y = $fb dino_vy = $fc GROUND_Y = $c0 ; 地面Y坐标,可根据需求调整 ; 初始化设置 lda #$01 ; 设置背景色为白色 sta $d021 lda #$80 ; 设置Sprite 0指针到$2000($80*64=$2000) sta $07f8 lda #$00 ; 设置Sprite 0颜色为黑色 sta $d027 lda #$80 ; Sprite 0 X坐标 sta $d000 lda #$40 ; Sprite 0 Y坐标 sta $d001 lda #$01 ; 启用Sprite 0 sta $d015 ; 初始化位置和速度 lda #$40 sta dino_y lda #$00 sta dino_vy mainloop: ; 重力逻辑:速度累加 lda dino_vy clc adc #1 sta dino_vy ; 更新恐龙Y位置 lda dino_y clc adc dino_vy sta dino_y ; 地面碰撞检测:触达地面则重置 cmp #GROUND_Y bcc update_sprite lda #GROUND_Y sta dino_y lda #$00 sta dino_vy update_sprite: ; 更新Sprite 0的Y坐标 lda dino_y sta $d001 ; 延迟循环 ldx #$ff delay1: ldy #$ff delay2: dey bne delay2 dex bne delay1 jmp mainloop * = $2000 sprite0_data: !byte %00000000 !byte %00000011 !byte %00000111 !byte %00000110 !byte %00000111 !byte %00000111 !byte %00000111 !byte %00000111 !byte %00001000 !byte %00001000 !byte %00001100 !byte %00001110 !byte %00001111 !byte %00001111 !byte %00000111 !byte %00000011 !byte %00000001 !byte %00000000 !byte %00000000 !byte %00000000 !byte %00000000
内容的提问来源于stack exchange,提问作者Karolina Sadowska
相关产品推荐
相关产品推荐

