You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:24:51