Autre astuce simple dérivant de la méthode précédente : On crée une table représentant un même objet représenté dans les 8 directions possibles et c'est la direction du déplacement qui choisit le sprite à afficher . On aura ainsi un mouvement très réaliste .Dans le programme qui suit , 8 sprites sont contenus dans la table et stockés comme suit : Numéro : 1 ;Direction représentée : Haut Numéro : 2 ;Direction représentée : Diagonale haut droite Numéro : 3 ;Direction représentée : Droite Numéro : 4 ;Direction représentée : Diagonale bas droite Numéro : 5 ;Direction représentée : bas Numéro : 6 ;Direction représentée : Diagonale bas gauche Numéro : 7 ;Direction représentée : Gauche Numéro : 8 ;Direction représentée : Diagonale haut gauche Une petite amélioration à été apportée au déplacement latéral ce qui a permis d'optimiser la routine d'affichage des sprites par rapport à la version SOS6 . C'est la présente version de AFFISP qui sera utilisée dans tous les exemples d'animation multi-sprites de ce numéro .------------------------ ; ;- ANim3.MAX - ; ;- Changement de sprite selon la direction donnee par le joystick - ;- Utilise une table en mode 0 ou TOUS LES SPRITES SONT DE TAILLE IDENTIQUE - ;- Tous les parametres (LSP,HSP,Etc ...) Sont connus par le programme FIXETSG - ; ORG 35000 JP DEBUT NOLIST ; Les définitions EQU et variables sont identiques au programme précédent on y-ajoute juste ADPROV , OLDADV , DIRJOY pour les calculs de déplacement . HSP EQU #1A09 ;Largeur & hauteur du sprite HSP1 EQU #1908 ;Largeur-1 & hauteur-1 du sprite HSP2 EQU #1A ;Hauteur du sprite LSP EQU 9 ;Largeur du sprite LSP1 EQU 8 ;Largeur-1 du sprite TOTSP EQU 234 ;Nombre d'octets par sprite NBSP EQU 8 ;Nombre de sprites TABLSP EQU 40000 ;Adresse de chargement de la table ADINK EQU NBSP*TOTSP+TABLSP+4 ;Formule qui donne la table des encres PREMAFF EQU #C050 ;1ere adresse d'affichage ; NUMSP DB 1 ;Numero du sprite choisi ADSP DW 0 ;Adresse du sprite choisi VISAD DW 0 ;Adresse d'affichage du sprite choisi COINBD DW 0 ;Coin oppose en bas a droite du sprite choisi ADPROV DW 0 ;Adresse écran provisoire pour diagonale OLDADV DW 0 ;Adresse écran avant déplacement DIRJOY DB 0 ;Direction du joystick ADR38 DB 0Toujours comme programme précédent . ; ;- Initialiser - ; DEBUT LD HL,ADINK ;Adresse des encres table de sprites . XOR A FIXINK INC A ;Initialiser les encres LD B,(HL) LD C,(HL) ;BIT 7,B JR NZ,FININK PUSH AF PUSH HL CALL #BC32 POP HL INC HL POP AF JR FIXINK ; FININK LD BC,#4000 ;Attendre un peu avant de bloquer les interruptions WAIT DEC BC ;pour finir l'affectation des encres LD A,B OR C JR NZ,WAIT ; MODI38 DI ;Annuler TOUTE interruption LD A,(#38) LD (ADR38),A LD A,#C9 LD (#38),A EI ; LD HL,PREMAFF ;Adresse 1er affichage donnee par EQU LD (VISAD),HL CALL FINDSP ;Trouver le sprite voulu CALL AFFISP ;1er affichage ; Ici commence la boucle principale d'animation . Si SPACE est pressée on quitte le programme . ; TSTKEY DI ;Test direct de SPACE presse LD BC,#F792 OUT (C),C LD BC,#F645 OUT (C),C LD B,#F4 IN A,(C) ;SPACE ? Oui si #7F CP #7F JR NZ,TSTJOY ; LD A,(ADR38) ;Si SPACE presse restaurer interruptions LD (#38),A ;et fini EI RETIci on teste le joystick par les ports E/S pour ne pas utiliser le vecteur #BB24 . La correspondance des bits avec FIRE et les 4 directions est la même que par #BB24 mais c'est un bit à 0 qui signale une opération active au lieu d'un bit mis ! Un XOR #FF (Voir le cours assembleur de SOS6 pour XOR) inverse tous les bits du résutat du test clavier . Ceci nous permet de rester 100% compatible avec les routines de déplacement décrites dans SOS6 . ; ;- Test direct du joystick - ; TSTJOY LD BC,#F792 OUT (C),C LD BC,#F649 OUT (C),C LD B,#F4 IN A,(C) ;BIT 4=Fire , 3=Droite , 2=Gauche , 1=Bas , 0=haut XOR #FF ;Contrairement a #BB24 , les bits concernes sont mis AND %00011111 ;a 0 si la direction est active . XOR #FF inverse JR Z,TSTKEY ;l'etat de ces bits ce qui permet de rester compatible ; ;avec les routines du trimestre dernier . LD (DIRJOY),A ;Memoriser direction LD HL,(VISAD) ;et adresse écran en cours . LD (OLDADV),HLPetit rappel de notre cours d'assembleur SOS5 , INC (IY+0) incrémente LE CONTENU DE L'OCTET POINTE PAR IY . Cela revient à faire :LD A,(NUMSP) - INC A - LD (NUMSP),A L'avantage notoire de ceci est de laisser libre le registre A qui doit rester inchangé pour la suite de comparaisons . Si vous prenez la peine de regarder la table des durées d'instructions (SOS6) vous verrez que si INC(IY+0) est assez prohibitif en durée , cela reste plus rapide que tout autre combinaison d'instructions préservant l'accumulateur à chaque comparaison . ; ;- Pointer le sprite voulu en fonction de la direction (de 1 a 8) - ; LD IY,NUMSP ;Numero du sprite LD (IY+0),1 ;mis a 1 pour le sprite representant le vaisseau ; ;en position verticale . CP %0001 ;Si haut on garde JR Z,GOSPR INC (IY+0) ;Sinon on passe au suivant tant que la direction ; ;donnee n'est pas trouvee CP %1001 ;Haut droite JR Z,GOSPR INC (IY+0) ; CP %1000 ;Droite JR Z,GOSPR INC (IY+0) ; CP %1010 ;Bas droite JR Z,GOSPR INC (IY+0) ; CP %0010 ;Bas JR Z,GOSPR INC (IY+0) ; CP %0110 ;Bas gauche JR Z,GOSPR INC (IY+0) ; CP %0100 ;Gauche JR Z,GOSPR INC (IY+0) ; CP %0101 ;Haut gauche JR Z,GOSPR INC (IY+0) ; GOSPR PUSH AF ;Preserver direction CALL FINDSP ;et pointer le sprite correspondant a cette POP AF ;direction ; ;RRCA ;comme le trimestre precedent PUSH AF CALL C,ENHAUT POP AF ;RRCA PUSH AF CALL C,ENBAS POP AF ;RRCA PUSH AF CALL C,AGAUCH POP AF ;RRCA CALL C,ADROIT ; CALL AFFISP JP TSTKEY ; ;- En bas - ; ENBAS LD B,4 LD HL,(COINBD) ; B1 LD A,H ;SUB #FF JR NZ,OKBAS LD A,L CP #80 RET NC ; OKBAS CALL ADINF DJNZ B1 LD (COINBD),HL ; LD HL,(VISAD) LD (ADPROV),HL LD B,4 B2 CALL ADINF DJNZ B2 LD (VISAD),HL RET ; ;- Mouvement en haut - ; ENHAUT LD HL,(VISAD) LD B,4 ; H1 LD A,H ;SUB #C0 JR NZ,OKHAUT LD A,L CP #50 RET C ; OKHAUT CALL ADSUP DJNZ H1 LD (VISAD),HL ; LD HL,(COINBD) LD B,4 H2 CALL ADSUP DJNZ H2 LD (COINBD),HL ; LD BC,LSP1 ;Defini par EQU AND A ;SBC HL,BC CALL ADINF LD (ADPROV),HL RET ; ;- A DROITE - ; STOPLAT LD A,(DIRJOY) AND %00000011 LD (DIRJOY),A RET ; ADROIT LD HL,(COINBD) CALL TSTLAT CP #4F JR Z,STOPLAT ; INC HL LD (COINBD),HL LD HL,(VISAD) LD (OLDADV),HL INC HL LD (VISAD),HL RET ; ;- A gauche - ; AGAUCH LD HL,(VISAD) CALL TSTLAT OR A JR Z,STOPLAT ; DEC HL LD (VISAD),HL ;Petite modification par rapport a SOS6 . LD BC,LSP ;Calcule OLDADV ici au lieu de s'en occupper ADD HL,BC ;dans AFFISP LD (OLDADV),HL LD HL,(COINBD) DEC HL LD (COINBD),HL RET ; ;- Tester hors écran - ; TSTLAT PUSH HL LD A,H RESUB SUB 8 ;BIT 6,A JR NZ,RESUB ADD A,8 ; LD H,A AND A LD DE,#50 RESUB1 SBC HL,DE BIT 6,H JR NZ,RESUB1 ADD HL,DE LD A,L POP HL RET ; ;- Affichage sprite a l'ecran - ; AFFISP LD BC,HSP ;Defini par EQU LD DE,(VISAD) LD HL,(ADSP) LIST CALL FRAME ;Sinon ca va beaucoup trop vite NOLIST ; BCLAFI PUSH DE PUSH BC LD B,0 LDIR POP BC LASUIT POP DE LD A,D ADD A,8 LD D,A JR NC,EXITAF PUSH HL LD HL,#C050 ADD HL,DE EX DE,HL POP HL EXITAF DJNZ BCLAFI ; ;- Afficher les lignes écran stockees pour recouvrir les traces de - ;- l'ancien affichage - ; LD A,(DIRJOY) AND %00000011 JR Z,TSTCOL ; LD HL,(ADPROV) LD BC,LSP1 ;Defini par EQU ; AFLINE LD B,4 BCLINE PUSH HL ; PUSH HL POP DE INC DE LD (HL),0 PUSH BC LD B,0 LDIR ; POP BC POP HL ; LD A,H ADD A,8 LD H,A JR NC,F1 LD DE,#C050 ADD HL,DE ; F1 DJNZ BCLINE ; ;- Colonnes - ; TSTCOL LD A,(DIRJOY) ;Ici un seul test car OLDADV est calcule depuis AND %00001100 ;les routines de déplacement ce qui permet de JR Z,EXIT ;gagner quelques cycles d'horloge par rapport ; LD HL,(OLDADV) ;a la version SOS6 LD A,HSP2 ;Defini par EQU LD B,A BCLCOL LD (HL),0 LD A,H ADD A,8 LD H,A JR NC,F2 LD DE,#C050 ADD HL,DE F2 DJNZ BCLCOL XOR A EXIT LD (DIRJOY),A RET ; ;- Calcul de l'octet au dessus et en dessous d'un octet écran - ; ADINF LD A,H ADD A,8 LD H,A RET NC PUSH DE LD DE,#C050 ADD HL,DE POP DE RET ; ADSUP LD A,H ;SUB 8 LD H,A AND %01000000 RET NZ PUSH DE LD DE,#3FB0 ADD HL,DE POP DE RET ; LIST FRAME PUSH BC NOLIST LD B,245 ATTEND IN A,(C) RRA JR NC,ATTEND POP BC RET ; ;- Va chercher et range les paramtres du dessin NUMSP - ; FINDSP LD A,(NUMSP) ;Numero demande PUSH DE ;Preserver DE LD HL,TABLSP+4 ;TABLSP+4 est l'adresse ou commence le 1er sprite ; ;Defini par EQU LOOKSP DEC A JR Z,ESTFIND ; LD DE,TOTSP ;Nombre d'octets occupes par 1 sprite defini par EQU ADD HL,DE ;Pointer le debut du suivant JR LOOKSP ; ESTFIND LD (ADSP),HL ;Ranger l'adresse trouvee POP DE ; FINDCOIN PUSH BC LD BC,HSP1 ;LSP & HSP sont connus et invariables ; ;Defini par EQU PUSH BC LD B,0 ;On cherche COINBD LD HL,(VISAD) ADD HL,BC POP BC COIN CALL ADINF DJNZ COIN LD (COINBD),HL POP BC RET ; LIST ADR38 DB 0 ;Ceci est le dernier listing intégral concernant l'animation de sprites . La routine d'affichage AFFISP , les calculs d'adresses ADINF , ADSUP , la fonction FRAME et d'autres routines sont les mêmes pour tous les programmes . Elles seront supprimées des listings source pour gagner un maximum de place sur cette face . Ainsi , dans ces sources , vous verrez toujours : CALL AFFISP (Ou autre routine usuelle) sans trouver la routine appelée . C'est normal . Si vous voulez reconstituer le source intégral pour votre assembleur , il vous suffit d'aller chercher les routines manquante dans le listing ci-dessus . Souvenez vous que les fichiers texte de SOS PROGRAMMEURS sont en ASCII 100% et compatibles avec PYRADEV , MAXAM , LASER GENIUS . Il vous suffit de charger le fichier texte correspondant dans votre assembleur et d'éliminer tout ce qui n'est pas la routine proprement dite . Pour DAMS , il vous faut hélas tout recopier manu militari !Rendez vous au prochain chapitre pour l'animation multi-sprites . SOS PROGRAMMEURS ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.73-desktop/c Page créée en 196 millisecondes et consultée 2232 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|
|