首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Masm32:如何在程序集中进行碰撞

Masm32:如何在程序集中进行碰撞
EN

Stack Overflow用户
提问于 2017-06-09 23:19:57
回答 2查看 445关注 0票数 0

对于学校的一个项目,我需要在visual studio中使用masm32汇编程序来制作一个游戏。到目前为止,我已经取得了很好的进展,但我有一个我无法解决的问题:做碰撞。在我构建的游戏中,有一些表面\平台,你需要使用它来将球撞向篮下。问题是,由于某些原因,我不能正确地做碰撞,所以球直接穿过平台。有人能帮我弄明白我做错了什么吗?

冲突的代码:

代码语言:javascript
复制
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中的球的命令,有人能帮我吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2017-06-10 00:34:12

对您的代码进行了一些清理(注意我是如何使用标签名称和注释的,以便更容易地阅读代码并理解其工作原理)。“修复”是:现在所有的值和比较都是带符号的,出于性能原因避免了pusha/popa,代码现在只使用eax

但这些并不能解释当你体验到球没有与表面碰撞时,你的bug可能在其他地方。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-06-12 00:49:36

当球在平台的左边或右边时,你应该测试Y坐标。这并不像您的代码所说的那样属于表面碰撞。测试的顺序在这里很重要!

mov eax,yball cmp eax,ysurf jge表面碰撞

如果这个cmp给出了EQ条件,那么你就没问题。这将是通过将yangle更改为-1来使球向上反弹的最佳起点。

当碰撞有效地穿透表面/平台时,问题就开始了。

这里的解决方案是首先将yball返回到ysurf,然后像以前一样开始向上移动。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44461418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档