对于学校的项目,我需要在visual studio中使用masm32汇编程序制作游戏。 到目前为止,我已经取得了相当不错的进步,但我遇到了一个无法解决的问题:做碰撞。 在我建造的游戏中,你需要使用一些表面\平台之王才能将球撞到篮筐上。问题是,由于某种原因,我不能正确地进行碰撞,因此球会直接通过平台。 有人可以帮我理解我做错了吗?
碰撞代码:
ballmovement PROC
pusha
mov eax,yball
cmp eax,ysurf
jge surfacecollision
jmp exit
surfacecollision:
mov eax,xball
cmp eax,xsurf
jb exit
mov ebx,xsurf
add ebx,240
cmp eax,ebx
jg exit
mov eax, -1
mov yangle,eax
jmp exit
exit:
mov eax,xangle
add xball,eax
mov eax,yangle
add yball,eax
popa
ret
ballmovement ENDP
该代码应该将球的y与表面的y进行比较 而不是检查球是否在x轴的表面的一侧与另一侧之间。如果是这样,它会移动到yangle -1而不是将其添加到yball以使球上升。通过主过程中的循环,ballmovement proc始终处于活动状态。在循环中也是一个在x:xball y:yball中重绘球的命令 有人能帮助我吗? 谢谢!
答案 0 :(得分:3)
代码的清理版本(注意我如何使用标签名称和注释,以便更容易阅读代码并了解其工作原理)。 “修复”包括:现在已对所有值和比较进行了签名,出于性能原因而避免pusha/popa
,代码现在仅使用eax
。
但是这些并没有解释,当你遇到没有与表面碰撞的球时,你的错误可能在其他地方。
ballmovement PROC
push eax
mov eax, [yball]
cmp eax, [ysurf]
jl do_move ; ball is above surface (yball < ysurf)
mov eax, [xball]
sub eax, [xsurf]
jl do_move ; ball is ahead of surface (xball < xsurf)
cmp eax, 240 ; (xball-xsurf) compare with 240
jg do_move ; ball is beyond surface (xsurf+240 < xball)
; set yangle to -1 to make ball go up
mov eax, -1
mov [yangle], eax
do_move:
; adjust [xball, yball] by vector [xangle, yangle]
mov eax, [xangle]
add [xball], eax
mov eax, [yangle]
add [yball], eax
pop eax
ret
ballmovement ENDP
答案 1 :(得分:1)
当球位于平台的左侧或右侧时,您应该不测试Y坐标。这不符合您的代码所说的表面碰撞。测试顺序在这里很重要!
mov eax,yball cmp eax,ysurf jge surfacecollision
如果此cmp
给出了EQ条件,那么您就可以了。通过将 yangle 更改为-1,这将是向上反弹球的最佳起点。
当碰撞有效地穿透表面/平台时,问题就开始了 这里的解决方案是首先将 yball 返回到 ysurf ,然后像以前一样向上移动。
ballmovement PROC
push eax
mov eax, xsurf
cmp xball, eax
jb exit
add eax,240
cmp xball, ebx
jg exit
mov eax, ysurf
cmp yball, eax
jl exit
surfacecollision:
mov eax, ysurf <<<<< Add these
mov yball, eax <<<<< Add these
mov yangle, -1
exit:
mov eax, xangle
add xball, eax
mov eax, yangle
add yball, eax
pop eax
ret