对于学校的一个项目,我需要在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以使球上升。通过主进程中的循环,球移动进程始终处于活动状态。循环中还有一个重画x:xball,y:yball中的球的命令,有人能帮我吗?谢谢!
发布于 2017-06-10 00:34:12
对您的代码进行了一些清理(注意我是如何使用标签名称和注释的,以便更容易地阅读代码并理解其工作原理)。“修复”是:现在所有的值和比较都是带符号的,出于性能原因避免了pusha/popa,代码现在只使用eax。
但这些并不能解释当你体验到球没有与表面碰撞时,你的bug可能在其他地方。
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发布于 2017-06-12 00:49:36
当球在平台的左边或右边时,你应该测试Y坐标。这并不像您的代码所说的那样属于表面碰撞。测试的顺序在这里很重要!
mov eax,yball cmp eax,ysurf jge表面碰撞
如果这个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
rethttps://stackoverflow.com/questions/44461418
复制相似问题