[NEW] STAR TREK pour ALICE 32/90
Modérateurs : Papy.G, fneck, Carl
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Bon courage dans cette aventure (tu multiplies les projets en ce moment). Je vais suivre l'avancée de ce jeu.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
4) mise en place de quelques routines d'affichage :
J'ai repris quelques routines que j'avais déjà, et adapté d'autres pour les besoins du jeu.
Un petit CLEARSCREEN
Le BUSY du VDP
Redéfinition d'un caractère
un petit SPRINTF bien pratique
J'ai repris quelques routines que j'avais déjà, et adapté d'autres pour les besoins du jeu.
Un petit CLEARSCREEN
Code : Tout sélectionner
; CLEAR SCREEN
;---------------------
CLEARSCREEN
LDAA #32
STAA R1 ; selection generateur
LDAA #01
STAA R2 ; et caractère
LDAA #112
STAA R3 ;Attribut caractère
LDAA #0
STAA R6 ; ligne vdp
STAA R7 ; colonne vdp
LDX #25 ; nombre de ligne a effacer
REPEAT_LINE
LDAB #40 ; nombre de colonne par ligne
LOOP_WRITE_LINE
LDAA #$01 ; commande
STAA R0+EXEC ; execution
JSR BUSY ; attente flag vdp
DECB
CMPB #0 ; colonne = zero ?
BNE LOOP_WRITE_LINE ; non on continue
CPX #25 ; ligne = 25 ?
BNE NOTFIRSTLINE ; ce n'est pas la premiere ligne ?
LDAA #7 ; si oui on saute à 7 ( le vdp ne sait pas compter de 1 à 6 )
STAA R6 ; ligne vdp
NOTFIRSTLINE
INC R6 ; sinon incremente ligne
CLR R7 ; positionne colonne à 0
DEX
CPX #0 ; derniere ligne ?
BNE REPEAT_LINE ; on repete
RTS ; fin de la routine on sort
Code : Tout sélectionner
BUSY
TST R0
BMI BUSY
RTS
Code : Tout sélectionner
; X contient l'adresse du caractère a redefinir.
; R4 et R5 doivent être définis avec la bonne adresse de bloc et tampon.
REDEF_CHARS
LDAB #$0A ; 10 lignes pour un caractère
BI010
LDAA $0,X
STAA R1 ; dessin du caractère écrit en R1
LDAA #$34 ; commande OCT
STAA R0+EXEC ; execution de la commande
BSR BUSY
INC R5
INC R5
INC R5
INC R5
INX
DECB
BNE BI010
RTS
Code : Tout sélectionner
;-------------------------------
; AFFICHE TEXTE
; X contient l'adresse du texte
; $EE fin d'une ligne et pause
; $FF fin du texte
; la zone texte doit commencer par :
; 1-2 = coordonnées
; 3 = couleurs
; 4 = attibut ( double hauteur / largeur )
; 5 = timing 1=on 0=off
; 6 = debut texte
;-------------------------------
SPRINTF_
LDAA #50 ; RAZ timeur
STAA TIMEUR ;
LDAA #255 ;
STAA TIMEUR+1 ;
LDD #$3501 ; selectionne JEU G0
STD R1
LDAA $0,X ; lit premiere donnée
STAA R6 ; ligne VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R7 ; colonne VDP
STAA SAUVER7_ATTRIBUT ; sauvegarde colonne VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R3 ; couleur VDP
INX
LDAA $0,X ; lit donnée suivante
STAA R2 ; atribut VDP
INX
LDAA $0,X ; lit donnée suivante
STAA TIMEUR+2 ; Timing
INX
BOUCLE_Sprintf_ ; debut boucle affichage
LDAA $0,X ; lit donnée suivante
STAA R1 ; caractère VDP
LDAA #$01
STAA R0+EXEC
JSR BUSY
INX
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing ; pas de timing
JSR Timing ; saut a la routine de timing
Not_Timing
LDAA $0,X ; lit donnée suivante
CMPA #$EE ; fin de ligne ?
BNE Not_Feed ; pas fin de ligne
INX ; fin de ligne alors incremente index
LDAA SAUVER7_ATTRIBUT ; recupere colonne VDP
STAA R7 ; colone VDP
INC R6 ; increment ligne VDP
JMP BOUCLE_Sprintf_ ; continue ligne suivante
Not_Feed
CMPA #$FF ; fin de texte ?
BNE BOUCLE_Sprintf_ ; non alors on continu affichage sans avoir incrémenté 2 fois l'index ;)
FIN_Sprintf_
RTS
;-------------------------------
SAUVER7_ATTRIBUT .DB $00
TIMEUR .DB 50,$FF,$00
Timing
DEC TIMEUR+1
BNE Timing
DEC TIMEUR
BNE Timing
LDAA #50
STAA TIMEUR
LDAA #255
STAA TIMEUR+1
RTS
Dernière modification par 6502man le 12 juin 2013 23:12, modifié 1 fois.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Code : Tout sélectionner
CMPA #$FF ; fin de texte ?
BEQ FIN_Sprintf_ ;oui alors fin et sortie de la routine
JMP BOUCLE_Sprintf_ ; on continu affichage sans avoir incrementé 2 fois l'index ;)
FIN_Sprintf_
RTS
Code : Tout sélectionner
CMPA #$FF ; fin de texte ?
BNE BOUCLE_Sprintf_ ; non ? alors on continue la boucle
FIN_Sprintf_ ; voilà tu es sorti de ta boucle en économisant un JMP inutile.
RTS
Dernière modification par Eric_80 le 12 juin 2013 23:11, modifié 1 fois.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Oui ceffectivement j'ai mal nettoyé le code après adaptation pour le jeux
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
en plus, t'es plutôt asm 6502 que 6803 toi je pense à la base, donc bel effort.
Bonne continuation pour ce projet.
Bonne continuation pour ce projet.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
5) la gestion des "SPRITES" la spécial pour Dominique
Pour les sprites voici ce que j'ai fait :
pour chaque sprites j'ai redéfini des caractères, et pour pouvoir les afficher facilement pour le jeu, j'ai créé des 'map' de sprites un peu comme l'on fait avec des tiles pour certains jeux.
Exemple:
Ce qui me permet de définir des sprites de n'importe quels tailles pas nécessairement identique, très pratique pour ce jeu.
Maintenant pour l'affichage du au fait du manque de VRAM je ne pourrait pas faire de gestion de transparence (pas assez de caractères disponible). Donc désolé mais il pourras ce produire des chevauchement disgracieux entre sprites.
Ensuite pour l'affichage des "sprites" je n'aurais qu'a pointer ma routine avec l'adresse de la 'MAP' correspondante
Et voici ce que ca donne :
Pour les sprites voici ce que j'ai fait :
pour chaque sprites j'ai redéfini des caractères, et pour pouvoir les afficher facilement pour le jeu, j'ai créé des 'map' de sprites un peu comme l'on fait avec des tiles pour certains jeux.
Exemple:
Code : Tout sélectionner
* les 3 premiers octets définissent ligne, colonne, et couleur
* $00 = caractère vide.
* $EF = fin d'une ligne de sprites
* $FF = fin du sprites
;---------------
; KLINGONS
;---------------
MAP_PROIE1
.DB 24,11,16
.DB 60,61,62,63,$EF
.DB $FF
MAP_PROIE2
.DB 24,18,16
.DB 64,65,66,67,68,69,70,$EF
.DB 71,72,73,74,75,00,76,$EF
.DB $FF
MAP_PROIE3
.DB 24,10,16
.DB 000,077,078,079,080,081,082,083,000,$EF
.DB 084,085,086,087,088,089,090,091,092,$EF
.DB 093,000,000,000,094,000,000,000,095,$EF
.DB $FF
Maintenant pour l'affichage du au fait du manque de VRAM je ne pourrait pas faire de gestion de transparence (pas assez de caractères disponible). Donc désolé mais il pourras ce produire des chevauchement disgracieux entre sprites.
Ensuite pour l'affichage des "sprites" je n'aurais qu'a pointer ma routine avec l'adresse de la 'MAP' correspondante
Code : Tout sélectionner
;-----------------------------------------
; AFFICHE MAP
; X : adresse de la carte map
; 1-2 : position sur l'ecran (ligne colonne)
; 3 : couleur
;
; $00 : affiche un espace (32) du generateur normal
; $DD : affiche le premier caractère du generateur redefini
; $FF : fin affichage MAP
;-----------------------------------------
AFFICHE_MAP_
LDAA $0,X
STAA R6
INX
LDAA $0,X
STAA R7
STAA IDX_R7
INX
LDAA $0,X
STAA R3
INX
LDD #$3681 ;JEU G0
STD R1
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
JMP EXEC_VDP_
NOT_CLEAR_
CMPA #$FF
BEQ FIN_AFFICHEMAP_
CMPA #$EF
BNE NOT_ENDline
INC R6 ; changement de ligne
LDAA IDX_R7
STAA R7
INX
JMP BOUCLE_AFFIC_TITRE_
NOT_ENDline
CMPA #$DD
BNE NOTSTARTCHAR
LDAA #32
STAA R1
JMP ZZ1
NOTSTARTCHAR
ADDA #32
STAA R1
ZZ1
LDAA #$81
STAA R2
EXEC_VDP_
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
FIN_AFFICHEMAP_
RTS
;-------------------------------
IDX_R7 .DB 00
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Merci Phil,
Pour l'instant je me concentre sur tout ce que tu dis et écris. C'est beaucoup de truc à mettre en mémoire. Mais je crois que je vais tenir le bon bout.
Pour l'instant je me concentre sur tout ce que tu dis et écris. C'est beaucoup de truc à mettre en mémoire. Mais je crois que je vais tenir le bon bout.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Ci-dessous, tu fais un GOTO EXEC_VDP_ (JMP) , tu y exécutes quelques instructions,
puis tu reviens à BOUCLE_AFFIC_TITRE_ avec un autre GOTO (JMP).
Il suffit de faire :
ZZ1 n'est pas à la bonne place. Son appel est aussi un GOTO (JMP) suivi d'un autre GOTO... (prog. spaguetti)
Tu pourras supprimer pas mal de JMP dans ton code en le restructurant quand tu vas faire le nettoyage.
Tu peux faire plus court et plus rapide en supprimant ces déplacements inutiles qui coûtent des cycles et des octets.
puis tu reviens à BOUCLE_AFFIC_TITRE_ avec un autre GOTO (JMP).
Code : Tout sélectionner
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
JMP EXEC_VDP_
...
EXEC_VDP_
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
Code : Tout sélectionner
BOUCLE_AFFIC_TITRE_
LDAA $0,X
BNE NOT_CLEAR_
LDAA #32
STAA R1
LDAA #01
STAA R2
LDAA #$01
STAA R0+EXEC
BSR BUSY
INX
JMP BOUCLE_AFFIC_TITRE_
Tu pourras supprimer pas mal de JMP dans ton code en le restructurant quand tu vas faire le nettoyage.
Tu peux faire plus court et plus rapide en supprimant ces déplacements inutiles qui coûtent des cycles et des octets.
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Code : Tout sélectionner
BOUCLE_Sprintf_ ; debut boucle affichage
LDAA $0,X ; lit donnée suivante
STAA R1 ; caractère VDP
LDAA #$01
STAA R0+EXEC
JSR BUSY
INX
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing ; pas de timing
JSR Timing ; saut a la routine de timing
Not_Timing
Et ainsi supprimer la ligne JSR Timing devenue inutile.
De plus, employer un BEQ qui est un branchement relatif au lieu d'un JSR qui lui est un branchement absolu,
te fait encore gagner un octet, des cycles, et ton code devient déplaçable plus facilement. Privilégie toujours les sauts relatifs quand c'est possible.
Et SI tu n'appelles ta routine "Timing" qu'UNE seule fois (je ne ne sais pas, j'ai pas lu ton code entier), même pas besoin de BEQ/RTS :
tu la mets directement et tu remets bien sûr un BNE Not_Timing (Branch if Not Equal) comme ceci :
Code : Tout sélectionner
LDAA TIMEUR+2 ; Timeur ?
CMPA #01
BNE Not_Timing
Timing
DEC TIMEUR+1
BNE Timing
DEC TIMEUR
BNE Timing
LDAA #50
STAA TIMEUR
LDAA #255
STAA TIMEUR+1
Not_Timing
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Je viens de lire le code à tête reposée !
Surtout la définition des sprites - Bravo
Surtout la définition des sprites - Bravo
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Le résultat est sympa, ça ressemble bien à un vaisseau Klingon. Par contre, il me semble qu'ils sont normalement verts dans la série .
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Beau boulot, je suis tout ça avec beaucoup d'intérêt. C'est exactement ce qu'on aurait aimé voir quand on a mis un éditeur assembleur sur Alice, malheureusement assez peu utilisé (il faut avouer que cela demande des compétences qu'on ne trouve pas n'importe où).
- Patrice
- Messages : 1521
- Inscription : 14 janv. 2008 10:42
- Localisation : https://www.ville-saintes.fr/
- Contact :
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
Merci les gars
Hier soir sortie ciné pour aller voir STAR TREK en 3D, j'y suis allé avec mon fils
Bon reprise des activités programmo-vidéoluqique
J'ai gagné quelques caractères sur les plus gros sprites, et j'ai put rentrer tout ce qu'il me faut dans les 100 caractères dispo du générateur du VDP.
6) le RADAR :
Aujourd'hui mise en place de la gestion du radar, et il fonctionne bien.
Je me suis retrouvé a faire un choix dù encore une fois a la limitation des 8 Ko de VRAM, pour le radar j'ai limité la zone à 20X12, en sachant que je ne pourrais pas animé au pixel près vu le manque de VRAM.
La zone peut paraitre petite, soit j’agrandis le radar mais je garde la même zone visible (20x11) mais a mon avis ca n'est pas intéressant car on va se retrouvé a chercher des ennemies invisibles !!!
Soit j’agrandis le radar et la zone visible, mais du coup la partie représentant l'espace et les ennemies en 3D seras réduite ???
Par la même occasion j'ai intégré le POINT OF VIEW.
On commence par expliquer le fonctionnement du radar (comme je l'ai pensé, en voyant les versions existantes de ce jeu):
Quelques explications :
Pour générer le radar j'ai opté pour une solution très simple :
A l'entrée dans un secteur je met à zéro tout le "MapSecteur" et je le remplis en fonction des données "Sectors".
Je ne sait pas encore si je prépare une table précalculé de coordonnées aléatoire ou si j'utilise une routine système pour ca...
Ensuite concernant l'affichage:
je scrute le "MapSecteur" et a chaque octet lu je vérifie si il y a un objet et l'affiche à l'écran sinon j'affiche un espace pour la zone visible de 20X11
Pour les déplacements c'est très simple, la aussi il y avait plusieurs solution et j'ai choisi celle la :
Lorsque que l'on appuie sur la touche avance je n'ai qu'a modifier dans une boucle (très rapide) les coordonnées des différents objets, en faite j'applique selon la direction pointée dans l'espace par le joueur ( Rotation_J ) une modification des coordonnées x et y de chaque objets. et ensuite lors du "refresh" de l'écran le radar est mise a jour donc impression de déplacement
Pour les rotations gauche et droite il suffit de modifier la variable ( Rotation_J ) c'est très simple 8 positions possibles:
Bon place au code de déplacement:
ATTENTION je rappelle code en mode brouillon
Vous pouvez vous amuser a l'optimiser si vous voulez
Rotation :
Avance:
Voila le radar bouge selon nos désire et ça fonctionne comme je l'ai pensé
Peut être une autre solution aurait été plus performante (n'hésitez pas a proposer), mais c'est la solution que j'ai imaginé
Je sais pas si j'ai été très clair dans mes explications
Je n'ai pas eu le temps de commenter le code mais c'est relativement simple à comprendre !!!
Hier soir sortie ciné pour aller voir STAR TREK en 3D, j'y suis allé avec mon fils
Bon reprise des activités programmo-vidéoluqique
J'ai gagné quelques caractères sur les plus gros sprites, et j'ai put rentrer tout ce qu'il me faut dans les 100 caractères dispo du générateur du VDP.
6) le RADAR :
Aujourd'hui mise en place de la gestion du radar, et il fonctionne bien.
Je me suis retrouvé a faire un choix dù encore une fois a la limitation des 8 Ko de VRAM, pour le radar j'ai limité la zone à 20X12, en sachant que je ne pourrais pas animé au pixel près vu le manque de VRAM.
La zone peut paraitre petite, soit j’agrandis le radar mais je garde la même zone visible (20x11) mais a mon avis ca n'est pas intéressant car on va se retrouvé a chercher des ennemies invisibles !!!
Soit j’agrandis le radar et la zone visible, mais du coup la partie représentant l'espace et les ennemies en 3D seras réduite ???
Par la même occasion j'ai intégré le POINT OF VIEW.
On commence par expliquer le fonctionnement du radar (comme je l'ai pensé, en voyant les versions existantes de ce jeu):
- *L'enterprise est toujours centré au milieu du radar, donc l'univers tourne et ce déplace autour de lui (point très important pour le codage).
*L'espace défile en mode "rouleau" c'est à dire lorsque qu'un objet sort d'un côté de l'écran il réapparait
du côté opposé.
Code : Tout sélectionner
; Chaque secteur est délimité par un carré de 20,12
; construit a chaque changement de secteur
MapSecteur ; map du secteur en cours
.db 6,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1; 1
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 2,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2;
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 2,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0; 5
.db 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1;
.db 1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0;
.db 1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0;
.db 1,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2; 10
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 15
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
.db 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 20
JX .DB 10 ; coordonnés X joueur
JY .DB 6 ; coordonnés Y joueur
Rotation_J .DB 00 ; rotation du joueur 8 position à un 1/8 de tour
Klingons ; 2 octets par klingons pour les coordonnées
.db 01,01
.db 02,02
.db 03,03
.db 04,04
.db 05,05
.db 06,06
.db 07,07
.db 08,08
.db 09,09
.db 10,12 ; 10
.....
.....
....
Sectors
; chaque secteur détaillé comme suit :
; - 1 octet pour le nombre de klingons (max 10)
; - 1 octet pour le nombre de bases (max 5)
; - 1 octet pour le nombre de saucer (max 4)
; - 1 octet pour le nombre de météorite (max 10)
; - 1 octet pour le nombre de UNKNOW (max 5)
;Sector 01
.db 3,1,0,0,0
;Sector 02
.db 4,1,1,0,0
;Sector 03
.db 5,2,1,0,0
Pour générer le radar j'ai opté pour une solution très simple :
A l'entrée dans un secteur je met à zéro tout le "MapSecteur" et je le remplis en fonction des données "Sectors".
Je ne sait pas encore si je prépare une table précalculé de coordonnées aléatoire ou si j'utilise une routine système pour ca...
Ensuite concernant l'affichage:
je scrute le "MapSecteur" et a chaque octet lu je vérifie si il y a un objet et l'affiche à l'écran sinon j'affiche un espace pour la zone visible de 20X11
Pour les déplacements c'est très simple, la aussi il y avait plusieurs solution et j'ai choisi celle la :
Lorsque que l'on appuie sur la touche avance je n'ai qu'a modifier dans une boucle (très rapide) les coordonnées des différents objets, en faite j'applique selon la direction pointée dans l'espace par le joueur ( Rotation_J ) une modification des coordonnées x et y de chaque objets. et ensuite lors du "refresh" de l'écran le radar est mise a jour donc impression de déplacement
Pour les rotations gauche et droite il suffit de modifier la variable ( Rotation_J ) c'est très simple 8 positions possibles:
- 12H
1,5H
3H
4,5H
6H
7,5H
9H
10,5H
Bon place au code de déplacement:
ATTENTION je rappelle code en mode brouillon
Vous pouvez vous amuser a l'optimiser si vous voulez
Rotation :
Code : Tout sélectionner
GAUCHE
lDAA Rotation_J
SUBA #01
CMPA #$FF
BNE RETOURGauche
LDAA #07
RETOURGauche
STAA Rotation_J
JMP FIN_ScanKey
DROITE
lDAA Rotation_J
ADDA #01
CMPA #08
BNE RETOURDroite
CLRA
RETOURDroite
STAA Rotation_J
JMP FIN_ScanKey
Code : Tout sélectionner
AVANCE
CLR Depl_Center_XPlus ; initialise index de deplc.
CLR Depl_Center_XMoins ; " "
CLR Depl_Center_YPlus ; " "
CLR Depl_Center_YMoins ; " "
lDAA Rotation_J
CMPA #00 ; Avance à 12 H
BNE Not_12H
LDAA #01
STAA Depl_Center_YPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_12H
CMPA #01 ; Avance à 1,5 H
BNE Not_1H
LDAA #01
STAA Depl_Center_YPlus
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_1H
CMPA #02
BNE Not_3H ; Avance à 3 H
LDAA #01
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_3H
CMPA #03 ; Avance à 4,5 H
BNE Not_5H
LDAA #01
STAA Depl_Center_YMoins
STAA Depl_Center_XMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_5H
CMPA #04 ; Avance à 6 H
BNE Not_6H
LDAA #01
STAA Depl_Center_YMoins
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_6H
CMPA #05 ; Avance à 7,5 H
BNE Not_7H
LDAA #01
STAA Depl_Center_YMoins
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_7H
CMPA #06 ; Avance à 9 H
BNE Not_9H
LDAA #01
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
Not_9H
CMPA #07 ; Avance à 10,5 H
BNE FIN_Avanc
LDAA #01
STAA Depl_Center_YPlus
STAA Depl_Center_XPlus
JSR Deplac_Center_Radar
JMP FIN_Avanc
FIN_Avanc
JMP FIN_ScanKey
Deplac_Center_Radar
LDX #Klingons
LDAB #34
Bcl_Depl_Center_Radar
LDAA $0,X
ADDA Depl_Center_XPlus
SUBA Depl_Center_XMoins
CMPA #0
BNE Valid_Dplc_CentX
LDAA #20
JMP Ok_Dplc_CentX
Valid_Dplc_CentX
CMPA #21
BNE Ok_Dplc_CentX
LDAA #1
Ok_Dplc_CentX
STAA $0,X
INX
LDAA $0,X
ADDA Depl_Center_YPlus
SUBA Depl_Center_YMoins
CMPA #0
BNE Valid_Dplc_CentY
LDAA #12
JMP Ok_Dplc_CentY
Valid_Dplc_CentY
CMPA #13
BNE Ok_Dplc_CentY
LDAA #1
Ok_Dplc_CentY
STAA $0,X
INX
DECB
BNE Bcl_Depl_Center_Radar
RTS
Depl_Center_XPlus .db 00
Depl_Center_XMoins .db 00
Depl_Center_YPlus .db 00
Depl_Center_YMoins .db 00
Peut être une autre solution aurait été plus performante (n'hésitez pas a proposer), mais c'est la solution que j'ai imaginé
Je sais pas si j'ai été très clair dans mes explications
Je n'ai pas eu le temps de commenter le code mais c'est relativement simple à comprendre !!!
Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90
7) POINT OF VIEW :
Pour représenter l'espace vue de l'enterprise voici ce que j'ai pensé :
En fonction de l'orientation du joueur la vue de l'espace n'est pas la même (la palisse n'aurait pas mieux dit)
A savoir c'est qu'il n'y a que 3 profondeurs différentes des objets et j'ai choisi un cone de vision à peu près à 90° ce qui veux dire que je dois lire 3 cases devant puis 5 cases un peu plus loin et 7 cases encore plus loin au total 15 cases a lire, pour l'affichage évidement je commence par les plus loin en me rapprochant, ce qui donneras l'impression que les objets plus près sont devant nous
Pour représenter la vue 3D il faut donc en fonction de l'orientation du joueur aller lire les cases du "MapSecteur" pour vérifier si il y a un objet vu par l'enterprise.
On va pas commencer a faire des calculs de trigonométries sur ce pauvre Alice donc j'ai choisi d'utiliser une table précalculée de coordonnées de cases a lire en fonction de l'orientation
La table :
https://docs.google.com/spreadsheet/pub ... utput=html
Ce qui donne ca :
Donc je n'ai qu'a pointer l'adresse de cette table et la parcourir pour obtenir les cases a lires
maintenant pour afficher les différents objets visibles, ont a tout ce qu'il faut pour le faire.
Explications:
On commence par lire l'orientation du joueur ( Rotation_J ) en fonction de sa valeur on pointe la table précalculée et on va à la routine de rendue, cette routine va lire les 7 premières cases (les plus loin) et affiche les objets si besoin ensuite passe au 5 suivantes et pour finir les 3 dernieres (découpés en 3 parties pour l'instant, mais on pourras optimiser au besoin).
Pour l'instant je n'ai implementé que l'affichage des "STARBASE" et "KLINGONS" je rajouterais les autres objets plus tard (très facilement).
Pour chacune des 3 profondeurs le décalage d'affichage n'est pas le même ainsi que les pointeurs de MAP
Il reste quelques réglages a faire concernant les placements des objets à l'écran...
ATTENTION je rappelle code en mode brouillon
Vous pouvez vous amuser a l'optimiser si vous voulez
On vois de suite quelques optimisations possible comme appliquer un décalage du pointeur POV_idx de 15*orientation pour évider la grande partie de CMPA BEQ ... et ces dépendances ...
Ce n'est qu'une version ALPHA pour vérifier la faisabilité du moteur de jeu après on passeras a l'optimisation
C'est bon tout le monde suit
Voila à quel stade en est le projet :
Version ALPHA 0
Sur émulateur le VDP est un peu paraisseux
Que pensait vous qu'il faudrait améliorer a ce stade ?
Maintenant reste à faire :
- implémenter déplacements ennemies
- gestion des colissions
- gestion des tirs
- scoring
- leveling
...
Pour représenter l'espace vue de l'enterprise voici ce que j'ai pensé :
En fonction de l'orientation du joueur la vue de l'espace n'est pas la même (la palisse n'aurait pas mieux dit)
A savoir c'est qu'il n'y a que 3 profondeurs différentes des objets et j'ai choisi un cone de vision à peu près à 90° ce qui veux dire que je dois lire 3 cases devant puis 5 cases un peu plus loin et 7 cases encore plus loin au total 15 cases a lire, pour l'affichage évidement je commence par les plus loin en me rapprochant, ce qui donneras l'impression que les objets plus près sont devant nous
Pour représenter la vue 3D il faut donc en fonction de l'orientation du joueur aller lire les cases du "MapSecteur" pour vérifier si il y a un objet vu par l'enterprise.
On va pas commencer a faire des calculs de trigonométries sur ce pauvre Alice donc j'ai choisi d'utiliser une table précalculée de coordonnées de cases a lire en fonction de l'orientation
La table :
https://docs.google.com/spreadsheet/pub ... utput=html
Ce qui donne ca :
Code : Tout sélectionner
RADAR_POV_12H
.db 67,68,69,70,71,72,73 ; POV 12 H
.db 88,89,90,91,92
.db 109,110,111
RADAR_POV_1_5H ; POV 1,5 H
.db 70,71,72,73,93,113,133
.db 90,91,92,112,132
.db 110,111,131
....
....
....
maintenant pour afficher les différents objets visibles, ont a tout ce qu'il faut pour le faire.
Explications:
On commence par lire l'orientation du joueur ( Rotation_J ) en fonction de sa valeur on pointe la table précalculée et on va à la routine de rendue, cette routine va lire les 7 premières cases (les plus loin) et affiche les objets si besoin ensuite passe au 5 suivantes et pour finir les 3 dernieres (découpés en 3 parties pour l'instant, mais on pourras optimiser au besoin).
Pour l'instant je n'ai implementé que l'affichage des "STARBASE" et "KLINGONS" je rajouterais les autres objets plus tard (très facilement).
Pour chacune des 3 profondeurs le décalage d'affichage n'est pas le même ainsi que les pointeurs de MAP
Il reste quelques réglages a faire concernant les placements des objets à l'écran...
ATTENTION je rappelle code en mode brouillon
Vous pouvez vous amuser a l'optimiser si vous voulez
Code : Tout sélectionner
;-------------------------------------------------
; POINT OF VIEW
;
; routine d'affichage vue avant de l'enterprise
;
PointOfView
LDAA #03 ; prepare coordonnées ecran colonne
STAA POV_X ; stock dans variable temporaire
LDAA Rotation_J ; en fonction de l'orientation de la vue
CMPA #00 ;
BEQ POV_12H ;
CMPA #01 ;
BEQ POV_1_5H ;
CMPA #02 ;
BEQ POV_3H ;
CMPA #03 ;
BEQ POV_4_5H ;
CMPA #04 ;
BEQ POV_6H ;
CMPA #05 ;
BEQ POV_7_5H ;
CMPA #06 ;
BEQ POV_9H ;
CMPA #07 ;
BEQ POV_10_5H ;
POV_12H
LDX #RADAR_POV_12H ; stock adresse de la table...
STX POV_idx ; ...precalculée des cases visibles
JSR POV_Render ; on va à la routine RENDER.
RTS
POV_1_5H
LDX #RADAR_POV_1_5H ; stock adresse de la table ...
STX POV_idx ; ...precalculée des cases visibles
JSR POV_Render ; on va à la routine RENDER.
RTS
POV_3H
LDX #RADAR_POV_3H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_4_5H
LDX #RADAR_POV_4_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_6H
LDX #RADAR_POV_6H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_7_5H
LDX #RADAR_POV_7_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_9H
LDX #RADAR_POV_9H ; stock adresse de la table ..
STX POV_idx ; ..precalculée des cases visibles
JSR POV_Render
RTS
POV_10_5H
LDX #RADAR_POV_10_5H ; stock adresse de la table
STX POV_idx ; precalculée des cases visibles
JSR POV_Render
RTS
POV_Render
;-------------------------------------------------------------------
; POV +3
LDAB #07 ; 7 octets a lire
STAB POV_cpt ; compteur
Boucl_Pov_Enemy1
LDX POV_idx ; qu'un seul registre d'index donc on utilise une variable mémoire pour sauvegarder le pointeur de la table précalculée ..
LDAB $0,X ; lit en B la coordonnée de la case a lire
LDX #MapSecteur ; pointe le registre d'index sur la table "MAPSECTEUR"
ABX ; rajoute la coordonnée de la case à lire au registre d'index
LDAA $0,X ; lit la case concernée
CMPA #0 ; est elle vide ?
BEQ Pov_Not_Ennemy1 ; si oui on passe a la suite
CMPA #50 ; sinon est ce une starbase ?
BMI Pov_Not_Starbase ; si inférieur ce n'est pas une starbase
LDAA POV_X ; sinon on renseigne coordonnée horisontale a afficher
STAA MAP_STARBASE1+1
LDX #MAP_STARBASE1 ; on pointe l'adresse de la MAP du sprite à afficher
JSR AfficheObjet_POV ; on saute a la routine d'affichage des objets
JMP Pov_Not_Ennemy1 ; on a fini pour cette case et on continue
Pov_Not_Starbase
CMPA #20 ; est ce un Klingon ?
BHI Pov_Not_Ennemy1 ;si plus grand ce n'est pas un klingon
LDAA POV_X ; si oui on affiche un klingon
STAA MAP_PROIE1+1
LDX #MAP_PROIE1
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy1
Pov_Not_Ennemy1
LDX POV_idx ; on incremente l'index de la table précalculée
INX ; " " " "
STX POV_idx ; " " " "
LDAA POV_X ; on décale coordonnée d'affichage horizontale
ADDA #05 ; " " " "
STAA POV_X ; " " " "
DEC POV_cpt ; on décrémente le compteur
BNE Boucl_Pov_Enemy1 ; on est pas à zero ? alors on continue
;-------------------------------------------------------------------
; POV +2
LDAA #03 ; réinitialise coordonnées ecran colonne
STAA POV_X ;
LDAB #05
STAB POV_cpt
Boucl_Pov_Enemy2
LDX POV_idx
LDAB $0,X
LDX #MapSecteur
ABX
LDAA $0,X
CMPA #0
BEQ Pov_Not_Ennemy2
CMPA #50
BMI Pov_Not_Starbase2
LDAA POV_X
STAA MAP_STARBASE2+1
LDX #MAP_STARBASE2
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy2
Pov_Not_Starbase2
CMPA #20
BHI Pov_Not_Ennemy2
LDAA POV_X
STAA MAP_PROIE2+1
LDX #MAP_PROIE2
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy2
Pov_Not_Ennemy2
LDX POV_idx
INX
STX POV_idx
LDAA POV_X
ADDA #07
STAA POV_X
DEC POV_cpt
BNE Boucl_Pov_Enemy2
;-------------------------------------------------------------------
; POV +1
LDAA #03 ; réinitialise coordonnées ecran colonne
STAA POV_X ;
LDAB #03
STAB POV_cpt
Boucl_Pov_Enemy3
LDX POV_idx
LDAB $0,X
LDX #MapSecteur
ABX
LDAA $0,X
CMPA #0
BEQ Pov_Not_Ennemy3
CMPA #50
BMI Pov_Not_Starbase3
LDAA POV_X
STAA MAP_STARBASE3+1
LDX #MAP_STARBASE3
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy3
Pov_Not_Starbase3
CMPA #20
BHI Pov_Not_Ennemy3
LDAA POV_X
STAA MAP_PROIE3+1
LDX #MAP_PROIE3
JSR AfficheObjet_POV
JMP Pov_Not_Ennemy3
Pov_Not_Ennemy3
LDX POV_idx
INX
STX POV_idx
LDAA POV_X
ADDA #11
STAA POV_X
DEC POV_cpt
BNE Boucl_Pov_Enemy3
RTS
POV_X .db 00
POV_Y .db 00
POV_idx .db 00,00
POV_cpt .db 00
;-------------------------------------------------
AfficheObjet_POV
JSR AFFICHE_MAP_
RTS
Ce n'est qu'une version ALPHA pour vérifier la faisabilité du moteur de jeu après on passeras a l'optimisation
C'est bon tout le monde suit
Voila à quel stade en est le projet :
Version ALPHA 0
Sur émulateur le VDP est un peu paraisseux
Que pensait vous qu'il faudrait améliorer a ce stade ?
Maintenant reste à faire :
- implémenter déplacements ennemies
- gestion des colissions
- gestion des tirs
- scoring
- leveling
...