[NEW] STAR TREK pour ALICE 32/90

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Carl, Papy.G, fneck

jester
Messages : 2222
Enregistré le : 01 janv. 2009 23:16
Localisation : Grenoble

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par jester » 12 juin 2013 15:20

Bon courage dans cette aventure (tu multiplies les projets en ce moment). Je vais suivre l'avancée de ce jeu.

Avatar du membre
6502man
Messages : 9122
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par 6502man » 12 juin 2013 22:48

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

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
Le BUSY du VDP

Code : Tout sélectionner

BUSY
	TST R0
	BMI BUSY
	RTS		
Redéfinition d'un caractère

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	
un petit SPRINTF bien pratique ;)

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
Modifié en dernier par 6502man le 12 juin 2013 23:12, modifié 1 fois.
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Avatar du membre
Eric_80
Messages : 184
Enregistré le : 31 mars 2011 16:52

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Eric_80 » 12 juin 2013 23:06

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
Fais plutôt comme ça :

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
BEQ/BNE étant des instructions de branchement, tu n'as pas besoin d'un JMP dans une boucle.
Modifié en dernier par Eric_80 le 12 juin 2013 23:11, modifié 1 fois.

Avatar du membre
6502man
Messages : 9122
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par 6502man » 12 juin 2013 23:08

Oui ceffectivement j'ai mal nettoyé le code après adaptation pour le jeux :roll:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Avatar du membre
Eric_80
Messages : 184
Enregistré le : 31 mars 2011 16:52

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Eric_80 » 12 juin 2013 23:14

en plus, t'es plutôt asm 6502 que 6803 toi je pense à la base, donc bel effort. ;)
Bonne continuation pour ce projet.

Avatar du membre
6502man
Messages : 9122
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par 6502man » 12 juin 2013 23:35

5) la gestion des "SPRITES" la spécial pour Dominique :wink:
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
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 :wink:

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
Et voici ce que ca donne :
dcalice.png
dcalice.png (1.12 Kio) Vu 1334 fois
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Avatar du membre
Dominique
Messages : 482
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Dominique » 12 juin 2013 23:48

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.

Avatar du membre
Eric_80
Messages : 184
Enregistré le : 31 mars 2011 16:52

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Eric_80 » 13 juin 2013 02:43

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).

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_
Il suffit de faire :

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_
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.

Avatar du membre
Eric_80
Messages : 184
Enregistré le : 31 mars 2011 16:52

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Eric_80 » 13 juin 2013 03:28

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
Tu peux remplacer "BNE Not_Timing" par "BEQ 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

Avatar du membre
Dominique
Messages : 482
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Dominique » 13 juin 2013 09:38

Je viens de lire le code à tête reposée !
Surtout la définition des sprites - Bravo :!:

Markerror
Messages : 1350
Enregistré le : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Markerror » 13 juin 2013 22:24

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 :-).

Avatar du membre
jfg
Messages : 245
Enregistré le : 22 mars 2011 16:28
Localisation : Région parisienne

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par jfg » 14 juin 2013 15:53

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ù).

Avatar du membre
Patrice
Messages : 1197
Enregistré le : 14 janv. 2008 10:42
Localisation : Charente maritime
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par Patrice » 14 juin 2013 18:27

Super boulot Philippe :!:
Alice la passion ;-)

Avatar du membre
6502man
Messages : 9122
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par 6502man » 14 juin 2013 23:40

Merci les gars :wink:

Hier soir sortie ciné pour aller voir STAR TREK en 3D, j'y suis allé avec mon fils :D

Bon reprise des activités programmo-vidéoluqique :roll:

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é.
Maintenant mise en place des données et variables :

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
 
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:
  • 12H
    1,5H
    3H
    4,5H
    6H
    7,5H
    9H
    10,5H
Donc 8 valeurs possibles 0 à 8 :wink:

Bon place au code de déplacement:
ATTENTION je rappelle code en mode brouillon :wink:
Vous pouvez vous amuser a l'optimiser si vous voulez :wink:
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
Avance:

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
Voila le radar bouge selon nos désire et ça fonctionne comme je l'ai pensé :D

Peut être une autre solution aurait été plus performante (n'hésitez pas a proposer), mais c'est la solution que j'ai imaginé :roll:

Je sais pas si j'ai été très clair dans mes explications :roll:
Je n'ai pas eu le temps de commenter le code mais c'est relativement simple à comprendre !!!
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Avatar du membre
6502man
Messages : 9122
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [NEW] un superbe jeu d'action spatial pour ALICE 32/90

Message par 6502man » 15 juin 2013 11:44

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 :roll: :roll:
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
....
....
....
Donc je n'ai qu'a pointer l'adresse de cette table et la parcourir pour obtenir les cases a lires :wink:

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 :wink:
Vous pouvez vous amuser a l'optimiser si vous voulez :wink:

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	
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 ... :wink:

Ce n'est qu'une version ALPHA pour vérifier la faisabilité du moteur de jeu après on passeras a l'optimisation :D

C'est bon tout le monde suit :wink:


Voila à quel stade en est le projet :
Version ALPHA 0
Sur émulateur le VDP est un peu paraisseux :roll:


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
...
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Répondre