2017-04-24 10 views
2

J'avais besoin d'aide pour faire rebondir un personnage sur mon écran en utilisant l'emu8086. La taille de l'écran est (80x25 char). J'ai réussi à le déplacer en diagonale, mais il ne rebondit pas. Au lieu de cela, il va tout droit sur x axes après avoir atteint la limite (c'est-à-dire 24e ligne) Voici ce que j'ai fait jusqu'à présent.comment faire rebondir un char en assemblage

enter code here 
Data_seg segment 'data' 
char db 'A' 
char2 db ' ' 
x1 db (1) 
y1 db (1) 
Data_seg ends 

Code_seg segment 'code' 
assume CS:Code_seg,DS:Data_seg 

main PROC far 
    mov ax,Data_seg 
    mov ds,ax 


    mov cx,40 
    loop1: 
    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H 

    ;print a 
    mov al,char 
    mov dl,al 
    mov ah,02H 
    int 21H 

    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H  

    ;print " "  
    mov dl,char2 
    mov ah,02H 
    int 21H  

    inc x1  
    inc y1 

    ;if(x1<2)||(x1>79) 
    mov al,x1 
    cmp al,2 
    jl ifPart 
    mov al,x1 
    cmp al,79 
    jge ifPart  


    ;if(y1<2)||(y1>79) 
    y11:  
    mov al,y1 
    cmp al,2  
    jl ifPart2 

    mov al,y1 
    cmp al,24 
    jge ifPart2 ;jge for boundry(24) 

    jmp endif    
       ifPart: 
         dec x1 
         jmp y11 

       ifPart2: 
        dec y1 

       endif: 


    loop loop1 



    Code_seg ends 
end main 

Répondre

3

Vous devez écrire l'algorithme/la logique de rebondissement dans le code. Au moment où votre logique fait [+ 1, + 1] toujours et après avoir atteint la ligne 24, il commencera à faire additionnel [0, -1] (donc le changement total est (+ 1, + 0)), puis après en atteignant la colonne 79, il fera plus [-1,0], donc le changement total sera (+ 0, + 0). Par exemple, votre code fait ce que vous avez écrit là-bas, il n'y a pas de problème dans le code. Pour corriger votre logique, essayez d'écrire l'algorithme d'abord dans un langage simple (anglais aide, lorsque vous demandez SO), et transformez cela en étapes plus simples, jusqu'à ce qu'ils ressemblent à des instructions d'assemblage, écrivez cela comme commentaire dans votre source, et implémenter chaque commentaire avec quelques instructions.

Pour commencer, vous voudrez peut-être "déplacer" vecteur, et ajouter que [x1, y1], au lieu de:

inc x1 
    inc y1 

(à savoir, mov al,[moveX] add [x1],al ... et même pour y).

Ensuite, lorsque la limite est atteinte, annulez cette partie du vecteur de déplacement, de sorte qu'elle passe de +1 à -1 et inversement. Si votre position de départ est "inside", vérifier les limites après mise à jour est correcte (0 || 79 trigger flip), si la position de départ peut aussi être sur boundary, vous devriez essayer de faire update, détecter la position invalide (-1 || 80), retournez le vecteur, annulez la mise à jour non valide et effectuez une mise à jour valide.

+0

Le personnage rebondit maintenant, en déplaçant les vecteurs. Theres un léger problème qui se produit quand il rebondit.Il montre le personnage à la colonne la plus à gauche de la 24e rangée, puis rebondir. –

+0

Correction: J'ai réussi à résoudre le problème (décrit dans le commentaire) en changeant "cmp al, 24" en "cmp al, 23". Le programme fonctionne parfaitement maintenant. Merci beaucoup pour votre aide. –

+1

@MUHAMMADAHMEDVOHRA environ 24/23 .. n'est pas le problème avec votre utilisation de l'interruption de sortie DOS, rendant l'écran "défiler" lorsque la dernière ligne est utilisée? Considérez les écritures directes sur VRAM (le mode texte commence à B800: 0000 par défaut sauf si vous reconfigurez les composants internes de la carte graphique), ce qui sera beaucoup plus rapide et vous donnera un contrôle total sur le contenu VRAM. et utilisez toutes les combinaisons possibles de couleur/clignotement. Et pas de défilement à la dernière ligne (vous devrez faire défiler manuellement par code, soit en déplaçant le contenu VRAM, soit en changeant le début de la mémoire vidéo). – Ped7g