2017-06-09 18 views
0

学校のプロジェクトでは、Visual Studioでmasm32アセンブラを使用してゲームを作成する必要があります。 私は今までにかなり良い進歩を遂げましたが、私は解決できない問題があります。衝突を起こすことです。 私が構築したゲームには、ボールをバスケットに衝突させるために使用する必要があるサーフェイス\プラットフォームのキングがいくつかあります。問題は、何らかの理由で衝突を正しく行うことができないため、ボールがプラットフォームを正しく通過することです。 誰かが私が間違ったことを理解できるように助けることができますか?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はメインproc内のループを通して常にアクティブです。ループでは、x:xball y:yball 誰かが私を助けることができるボールを再描画するコマンドですか? ありがとう!

+0

「変数」の定義をすべて追加するだけで、十分なメモリが割り当てられていることを確認しています。 – Ped7g

+0

そして、コードはちょっと簡略化されているかもしれませんし、座標が符号付きか符号なしかを決めるべきです( '' jb exit''はunsigned "below"、 'jg exit'は" greater "これはそのまま動作するはずなので、デバッガで実行し、テストが失敗する理由(おそらく最初のコールで衝突するようなボールとサーフェイスの位置を初期化する)を自分で確認してください。 – Ped7g

答えて

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

ボールが左にまたはプラットフォームの右側にあるときは、テストY座標べきではありません。それはあなたのコードのように表面の衝突とはみなされません。テストの順序はここで重要です!

mov eax,yball 
cmp eax,ysurf 
jge surfacecollision 

このcmpは、あなたがOKなら、EQの条件を与えた場合。これは、の角をに-1に変更することで、ボールを上に戻すのに最適な出発点になります。

問題は、衝突が効果的に表面/プラットフォームを貫通したときに始まります。
ここで解決策は、最初にyballysurfに戻してから、以前と同じように上に移動することです。

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