MSX Village forum

La Place des Développeurs [En COURS] Moteur de Sprites Moteur de Sprites

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 01/03/2015 à 13h15

Reprise du message précédent

Citation :
Ma question est donc la suivante:

Savez vous si l'on peut Distinguer les SPRITES en les identifiant par leurs MASQUE?




En lisant ton descriptif je pensais justement à cette question, de la distinction des sprites.

Et, pour moi la réponse est non, depuis le Basic il est impossible de savoir quel sprite rentre en colission avec tel autre.

Dans les registres du VDP pourtant, cette information existe bel est bien.

Mais son accès depuis le Basic n'est pas possible. IL faut utiliser de l'assembleur.



La seul possibilité d'identifier qui entre en collision avec qui en Basic, est de le calculer en identifiant les positions X et Y de chaque sprites et d'interpoler le resultat. :(

Ce qui veut dire, beaucoup de ressource utilisée pour pas grandchose ! :(


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 01/03/2015 à 14h29
@Eric: pour tout te dire, j'ai déjà ma petite idée, mais je voulais voir si il existe autre chose plus simple que ce qui suit.

Supposons que l'on ai besoin de distinguer 4 groupes distincts.
4 peut sembler faible mais en réalité, si l'on multiplie 4 groupes par les 9 positions du stick qui sont autant de "collisions variée" on obtient 9×4=36 sous groupes et donc autant de "collisions différentes/ caractéristiques différentes".

Pour y arriver, il suffit de "modifier l'état du sprite hero" 4 fois dans sa boucle principale.

Concrètement le héro se nomme dans la boucle.
PUTSPRITE0, (X,Y),1,1
PUTSPRITE0, (X,Y),1,2
PUTSPRITE0, (X,Y),1,3
PUTSPRITE0, (X,Y),1,4

En passant par ces 4 états, on peut entrer en collision avec des Sprites posés sur 4 masques différents et dont chaque masque entrant en collision aurait une caractéristique choisie.

voilà. A quoi j'ai pensé. Ça devrait marcher mais je voulais entendre vos idées :) Edité par igal Le 01/03/2015 à 14h41


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 01/03/2015 à 15h04
ca fonctionnera seulment si tu as 5 sprites maxi à l'ecran.
Ton sprites joueur, et quatre sprites de "detections" qui ne doivent pas dejà se supperposer.
Si tu mets plus de sprites de "detections" tu sera forcement obligé d'en passer par les coordonnées x, pour savoir qui collisione avec qui.


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 01/03/2015 à 19h20
En fait, mon besoin est peut être différent du tiens selon l'approche que l'on a de la physique du jeu.

[-Attention => Pour le moment, j'ai pas abordé la question avec différentes couches de Sprites]

J'ai passé 15 jours a tourner ça dans tous les sens et voila comment j'ai abordé la chose.

Avant tout, il faut savoir que sauf indication contraire, tous les déplacements se font par tranche de 16 pixels.

Phase Un
1) La pesanteur est active par défaut.la chute se perpétue jusqu'à ce que le héros entre en collision avec un sprite. La pesanteur se désactive le sprite remonte d'un pixel Y=Y-1 pour faire cesser la collision.


Phase 2
2a) La pesanteur est activé après chaque action qui fait sauter le héros.(saut, saut droite, saut gauche)
2b) Pour les déplacements horizontaux, un SPRITE est positionné en début et fin de chaque plateforme. Ces sprites aux deux extrémités servent de balise de déclenchement de pesanteur.

Phase 3
3a) La pesanteur étant active, le héros chute jusqu'à rencontrer un SPRITE.
3b) Le héros se déplace jusqu'à ce qu'il rencontre "horizontalement" un sprite.

Phase 4
4a) La collision du Héro avec un sprite provoque la désactivation de la pesanteur puis Y=Y+1 pour faire cesser la collision en découlant le héros du sprite.
4b Droite) La collision du héros avec le sprite provoque X=X+16 pour décoller le héros du sprite puis active la pesanteur.
4b Gauche) La collision du Héros avec le sprite provoque X=X-16+1 pour décoller le héros du sprite puis active la pesanteur.

Je dois ajouter une étape 5b indiquantant que si l'étape [4b gauche] a été usité, je dois ajouter 1 a X tel que X=X+1. Cette incrément devra se faire "seulement" après que la chute ait commence au moins une fois.
Sans cette opération, le sprite se déplacera dorénavant exactement entre les sprites sans jamais les toucher verticalement.

La suite logique de (4a) est la [Phase 1]
La suite logique de (4b Droite) est la [Phase 1]
La suite logique de (4b Gauche) est la [Phase 1]

Voila ce qui est déja fait avec une problème à résoudre concernant la [Phase 4b Gauche].

Suivez bien ce qui suit, il s'agit des impératifs du moteurs.
Je suis en train de rédiger ça et je poste! ;) Edité par igal Le 02/03/2015 à 08h03


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 02/03/2015 à 19h19
Voici une petite vidéo pour avoir une meilleur idée de la chose.

Il reste pas mal de détails a régler mais ca me semble bien posé pour aboutir à quelque chose de jouable :top



Je me rend compte qu'il faut absolument "sortir" de la collision avant même de pouvoir reprendre le contrôle sur le Sprite sans quoi, je me retrouve avec le Héro qui traverse le SOL.

Quelques petits détails à voir avant de passer aux Masques multiples :top


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 04/03/2015 à 13h34
Intéressant. Mais tu vas devoir gérer autant de coordonnées de sprites que d'obstacles dans ton décor. Assez rapidement, tu vas donc devoir créer une table avec toutes les coordonnées des obstacles dans ton décor pour générer les sprites correspondants.

Et au final, ce sera aussi compliqué (voire même plus) que la méthode classique qui consiste à créer une table de coordonnées des obstacles et de vérifier la position du sprite du héros par rapport à cette table pour déterminer l'action.

Et je n'ai même pas parlé du nombre limité de sprite par ligne et/ou par écran, qui va forcément introduire une contrainte importante dans ton moteur.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 04/03/2015 à 14h09
Salut Metalion.

J'ai pensé attribuer une caractéristique différente par masque.

Par exemple:
une [collision à droite masque 1] = chute libre.
Une [collision à droite masque 2] = obstacle infranchissable
Le nombre de masques différents devrait diviser d'autant le.nombre de données à déterminées.

Il me semble qu'on peut utiliser 32 masques.
9 inputs différents par stick.

Hypothétiquement, 288 sous programmes peuvent être appelés par la combinaison:

ON STICK GOSUB
ON SPRITE GOSUB

A cela on peut ajouter l'utilisation simultanée de:

ON STRIG GOSUB

Pour un total de 576 combinaisons différentes lol

Bon.... j extrapole mais j'aime ça lol


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 04/03/2015 à 15h15
Qu'est-ce que tu appelles un "masque" ?


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5484

Le 05/03/2015 à 13h31
j'ai un peut de mal à te suivre Igal... Mais j'attends la suite :)


banniere-ericb59e
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 06/03/2015 à 14h31
J'étais persuadé que:

PUTSPRITE a, (x,y),b,C

J'ai cru que C permet de déterminer sur quel plan on pouvait placer le sprite :(

Je pensai donc pouvoir faire cohabiter deux à savoir le hero + un autre sprite.

Ce qui aurait permis de déterminer de facto avec quel sprite le hero entre en collision.

J'ai chercher longuement des infos détaillées sur C mais je suis pas arriver à déterminer clairement son rôle.

Si vous pouvez m'éclairer la dessus :)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 06/03/2015 à 15h29
PUT SPRITE <sprite plane number>[, {(X,Y) | STEP(X,Y)}[, <colour>[, <sprite pattern number>]]]
PUT SPRITE a,(x,y),b,c


"a" est le numéro de plan du sprite (de 0 à 31, 1 plan = 1 sprite)
"b" est la couleur du sprite
"c" est le numéro de la forme du sprite dans la table des formes en VRAM. Tu peux stocker jusqu'à 64 formes de sprites différentes.

Pense à la gestion des sprites de la manière suivante : le VDP gère 32 "feuilles plastiques transparentes" (ce sont les plans) qu'il peut faire bouger à volonté devant l'écran graphique de base. Sur chacune de ces feuilles transparentes, il peut insérer une (et une seule) forme de papier de couleur découpée, à choisir parmi un stock de 64.

C'est un peu simplet comme explication, mais au moins ça a le mérite d'être clair. Edité par Metalion Le 06/03/2015 à 16h05


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 07/03/2015 à 12h12
Merci pour ces éclaircissements Metalion.


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 08/03/2015 à 21h47
Concernant C le numéro de forme du sprite:

Un livre explique simplement comment on exploite cette possibilité?

Autrement si vous avez une explication de base qui me permettrait de comprendre comment on fait?

Je pense qu'en donnant une forme (un remlissage) différent au Sprites, on peut "provoquer" ou "empêcher" une collision.

Par exemple:
Le hero en chute libre aurait un remplissage rendant possible la collision avec un sol.
Le hero en déplacement horizontale aurait un remplissage rendant impossible la collision.

Les extrémités des sols auraient un remplissage entrant en collision avec le hero et provocant ai si la chute libre.

Je voudrais tester cette piste.:)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1486

Le 09/03/2015 à 09h36
Tout est expliqué dans les livres qui sont en téléchargement au village, "Pratique du MSX2", notamment.

Mais je ne comprends pas ce que tu veux faire ... La collision est détectée par le VDP dès qu'il y a recouvrement d'au moins un pixel entre 2 sprites. Concrètement, le seul "remplissage" qui ne provoque pas de collision est un "remplissage" vide ! Mais alors, il n'y a évidemment pas de sprite à l'écran.

La seule piste que je vois dans cette direction est peut-être l'exploitation de la couleur 0. Il faudrait vérifier si cette couleur joue un rôle dans le cas d'une collision. Personnellement, je ne pense pas, car comme les pixels et les couleurs d'un sprite sont définis séparément en VRAM, c'est probablement la partie pixel seule qui est utilisée comme référentiel pour la collision.

Je ne sais pas pourquoi tu tiens absolument à cette solution qui utilise la collision entre sprites. La solution quasi universelle dans les jeux est celle qui consiste à comparer les coordonnées du sprite avec une table qui contient les coordonnées du décor.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 09/03/2015 à 13h28
Merci Metalion mais tu connais la bête, tant que je suis pas allé au bout, je tâte lol

J suis comme un ado à qui une jolie fille a fait un sourir.
Ou un chien fou qui a vu un nonos lol

Je pense avoir enfin compris ce que je veux faire.
C'est dire si je sais où je vais ^^)

Tu verras, ça va te plaire :)


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 23/03/2015 à 11h15
@Métalion: J'ai bien compris la nécessité de créer un tableau ou chaque Tile est qualifié de "Neutre", "Obstacle", "Poison" tout comme on peut le voir dans le moteur Zelda de MsxOsaure.

Puisque dans le cas présent, il s'agit de "SCROLL", j'ai donc réalisé la solution suivante.

Voici quelques explications:
Les "Sols" deviennent "réalité que parce qu'ils sont matérialisés par des Sprites.
Les Sprites immobiles sont donc de la Matière inerte et se limitent donc à n'être que des obstacles.
Les Sprites réagissent simplement par [ON SPRITE GOSUB].
Selon la commande des touches (selon l'état de (S)=Stick), un sous programme est appelé.

En gros le tableau qui prédéfini les TILES dans le Moteur de MsxOsaure se traduit par le placement judicieux des "Sprites" à mesure du déroulement du Scroll ;)

Le tableau se présente provisoirement sous cette forme:
Code TEXT :
 
48 'variables Latitudes et Longitudes des sprites fixes
49 '
50 A1=24:A2=56:A3=88:A4=120:A5=152:A6=184:A7=216
51 AA=183:AB=183:AC=183:AD=183:AE=183:AF=183:AG=183
52 B1=24:B2=56:B3=73:B4=120:B5=137:B6=200:B7=216
53 BA=95:BB=95:BC=95:BD=63:BE=63:BF=111:BG=111
54 C1=24:C2=41:C3=57:C4=136:C5=168:C6=184:C7=216
55 CA=15:CB=15:CC=15:CD=-1:CE=-1:CF=31:CG=31
56 D1=24:D2=56:D3=88:D4=120:D5=152:D6=184:D7=216  
57 DA=15:DB=15:DC=15:DD=15:DE=15:DF=16:DG=15
65 'Projection des Sprites Fixes
70 '
100 PUTSPRITE1,(A1,AA),1,D:PUTSPRITE2,(A2,AB),1,D:PUTSPRITE3,(A3,AC),1,D:PUTSPRITE4,(A4,AD),1,D:PUTSPRITE5,(A5,AE),1,D:PUTSPRITE6,(A6,AF),1,D:PUTSPRITE7,(A7,AG),1,D
105 PUTSPRITE8,(B1,BA),1,D:PUTSPRITE9,(B2,BB),1,D:PUTSPRITE10,(B3,BC),15,D:PUTSPRITE11,(B4,BD),15,D:PUTSPRITE12,(B5,BE),15,D:PUTSPRITE13,(B6,BF),15,D:PUTSPRITE14,(B7,BG),1,D
110 PUTSPRITE15,(C1,CA),15,D:PUTSPRITE16,(C2,CB),1,D:PUTSPRITE17,(C3,CC),15,D:PUTSPRITE18,(C4,CD),15,D:PUTSPRITE19,(C5,CE),15,D:PUTSPRITE20,(C6,CF),15,D:PUTSPRITE21,(C7,CG),1,D
115 'PUTSPRITE22,(D1,DA),1,D:PUTSPRITE23,(D2,DB),1,D:PUTSPRITE24,(D3,DC),1,D:PUTSPRITE25,(D4,DD),1,D:PUTSPRITE26,(D5,DE),1,D:PUTSPRITE27,(D6,DF),1,D:PUTSPRITE28,(D7,DG),1,D
 


En définitive, une fois que le moteur de Sprite et le Scroll VDP(24) seront fusionnés, le tableau "s'égrainera" à mesure du déroulement du scroll.

ce devrait donner un truc du genre:

Code TEXT :
 
900 BLOAD"BRIBE001.SCC",S
901 A1=24:A2=56:A3=88:A4=120:A5=152:A6=184:A7=216
902 AA=183:AB=183:AC=183:AD=183:AE=183:AF=183:AG=183
903 PUTSPRITE1,(A1,AA),1,D:PUTSPRITE2,(A2,AB),1,D:PUTSPRITE3,(A3,AC),1,D:PUTSPRITE4,(A4,AD),1,D:PUTSPRITE5,(A5,AE),1,D:PUTSPRITE6,(A6,AF),1,D:PUTSPRITE7,(A7,AG),1,D
904 GOSUB 1000
 
910 BLOAD"BRIBE002.SCC",S:GOSUB 1000
911 BLOAD"BRIBE003.SCC",S:GOSUB 1000
912 BLOAD"BRIBE004.SCC",S:GOSUB 1000
913 BLOAD"BRIBE005.SCC",S:GOSUB 1000
913 BLOAD"BRIBE006.SCC",S:GOSUB 1000
913 BLOAD"BRIBE007.SCC",S:GOSUB 1000
913 BLOAD"BRIBE008.SCC",S:GOSUB 1000
 
915 BLOAD"BRIBE009.SCC",S
916 B1=24:B2=56:B3=73:B4=120:B5=137:B6=200:B7=216
917 BA=95:BB=95:BC=95:BD=63:BE=63:BF=111:BG=111
918 PUTSPRITE8,(B1,BA),1,D:PUTSPRITE9,(B2,BB),1,D:PUTSPRITE10,(B3,BC),15,D:PUTSPRITE11,(B4,BD),15,D:PUTSPRITE12,(B5,BE),15,D:PUTSPRITE13,(B6,BF),15,D:PUTSPRITE14,(B7,BG),1,D
919 GOSUB 1000
 
1000S=STICK(0):ONS+1GOSUB160,170,180,190,160,160,160,230,240:VDP(24)=VDP(24)+2AND255:RETURN
 


De la sorte, la "création" et "l'emplacement" des SPRITE se fait progressivement.
Une fois affichés, ces sprites ne consomment pas de ressources puisque en réalité, c'est VDP(24) qui déplace l'ensemble de l'image sans avoir à modifier les coordonnées des sprites :top



Il est possible d'intégrer des Sprites animés comme des "Ascenceurs".
Pour se faire, il faut intégrer les Sprites dans "Le Noyau Dur" de la boucle.
ici il suffit d'intégrer les commandes suivantes pour qu'un "ascenseur" se déplace latéralement dans l'écran.
Lorsque le "Hero" saute sur l'ascenceur, les Variables du Héros prennent la valeur des variables de l'asceur ce qui a pour effet de déplacer le personnage comme si il est chargé dessus.

140 XB=XB+1AND255:IFAS=1THENX=XB:'MOTEUR ASCENCEUR
141 PUTSPRITE31,(XB,YB),7,A:'ASCENCEUR
142 IFY=YB-16THENAS=1
150 'Moteur Principal
155 S=STICK(0):ONS+1GOSUB 1600,1700,1800,190,160,160,160,230,240:'Renvoie selon Stick ZERO
156 GOTO140


Voici le listing:
Code TEXT :
 
0                     'Sauvegarde Travail en cours*****
10        'save"SPRITE23.asc",a
15 'Mode ecran*********************
20 SCREEN5,2:BLOAD"alpha.sc5",S:COLOR=RESTORE
25 '
27 'Variables Sprites Mobiles******
28 '
30 X=1+96+8:Y=0+7:'Position initiale du HERO
31 XB=32+1:YB=127-64:' Position initiale ASCENCEUR
32 VM=16:VC=8:VS=16:VH=8:'Vitesses Monte, Chute, Saute, Horizontale
33 SH=1:SD=1:SG=1:'Empeche les sauts.
34 P=1:UP=0:' Active la pesanteur
35 RI=0:LE=0:' Desactive le passe muraille Droite et Gauche
36 AS=0
40 'DATAS des Patterns des Sprites***************
42 GOTO 1250
44 'Variables des Pattern des sprites*************
46 A=0:B=1:C=2:D=3:E=4
48 'variables Latitudes et Longitudes des sprites fixes
49 '
50 A1=24:A2=56:A3=88:A4=120:A5=152:A6=184:A7=216
51 AA=183:AB=183:AC=183:AD=183:AE=183:AF=183:AG=183
52 B1=24:B2=56:B3=73:B4=120:B5=137:B6=200:B7=216
53 BA=95:BB=95:BC=95:BD=63:BE=63:BF=111:BG=111
54 C1=24:C2=41:C3=57:C4=136:C5=168:C6=184:C7=216
55 CA=15:CB=15:CC=15:CD=-1:CE=-1:CF=31:CG=31
56 D1=24:D2=56:D3=88:D4=120:D5=152:D6=184:D7=216  
57 DA=15:DB=15:DC=15:DD=15:DE=15:DF=16:DG=15
65 'Projection des Sprites Fixes
70 '
100 PUTSPRITE1,(A1,AA),1,D:PUTSPRITE2,(A2,AB),1,D:PUTSPRITE3,(A3,AC),1,D:PUTSPRITE4,(A4,AD),1,D:PUTSPRITE5,(A5,AE),1,D:PUTSPRITE6,(A6,AF),1,D:PUTSPRITE7,(A7,AG),1,D
105 PUTSPRITE8,(B1,BA),1,D:PUTSPRITE9,(B2,BB),1,D:PUTSPRITE10,(B3,BC),15,D:PUTSPRITE11,(B4,BD),15,D:PUTSPRITE12,(B5,BE),15,D:PUTSPRITE13,(B6,BF),15,D:PUTSPRITE14,(B7,BG),1,D
110 PUTSPRITE15,(C1,CA),15,D:PUTSPRITE16,(C2,CB),1,D:PUTSPRITE17,(C3,CC),15,D:PUTSPRITE18,(C4,CD),15,D:PUTSPRITE19,(C5,CE),15,D:PUTSPRITE20,(C6,CF),15,D:PUTSPRITE21,(C7,CG),1,D
115 'PUTSPRITE22,(D1,DA),1,D:PUTSPRITE23,(D2,DB),1,D:PUTSPRITE24,(D3,DC),1,D:PUTSPRITE25,(D4,DD),1,D:PUTSPRITE26,(D5,DE),1,D:PUTSPRITE27,(D6,DF),1,D:PUTSPRITE28,(D7,DG),1,D
125 '
138 'Projection des Sprites Mobiles***************
139 '
140 'XB=XB+1AND255:IFAS=1THENX=XB:'MOTEUR ASCENCEUR
141 'PUTSPRITE31,(XB,YB),7,A:'ASCENCEUR
142 'IFY=YB-16THENAS=1
150 'Moteur Principal
153 S=STICK(0):ONS+1GOSUB 160,170,180,190,160,160,160,230,240:'Renvoie selon Stick ZERO
154 GOTO150
155 '
156 'Gestion des Mouvements
157 '
158 'STATIQUE
160 PUTSPRITE0,(X,Y),8,D:ONSPRITE GOSUB1000:SPRITEON:'Si colision aller a 1000
161 'IFRI=1THENP=1
162 'IFLE=1THENP=1
163 IFP=1THEN210:'Si pesanteur alors Chute de 8 Pixels
164 RETURN
167 '
168 'SAUT HAUT
170 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1010:SPRITEON:'Si colision aller a 1010
172 IFSH=5THEN210:'Si Saut deja utilise alors aller a 210
173 IFUP=1THENY=Y+1:UP=0:AS=0
174 Y=Y-VS:SH=SH+1:P=1:'Saut Haut utilisé! Pesanteur active
176 RETURN
177 '
178 'SAUT DROITE
180 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1020:SPRITEON:'Si colision aller a 1020
182 IFSD=2THEN210:'Si Saut Droite deja utilise alors aller a 210
183 IFUP=1THENY=Y+1:UP=0:AS=0
184 X=X+VS:Y=Y-VS:SD=SD+1:P=1:'Saut Droite utilisé! Pesanteur active
186 RETURN
187 '
188 'DROITE
190 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1030:SPRITEON:'Si colision aller a 1030
192 X=X+VH:'Deplacement a droite
193 '
194 IFP=1THEN210:'Si pesanteur alors chute de 8 Pixels
196 RETURN 
197 '
198 'CHUTE A DROITE
200 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1040:SPRITEON:SI COLISION ALLER A 1040
202 X=X+VC:'Deplacement a Droite
203 IFUP=1THENY=Y+1:UP=0
204 IFP=1THENY=Y+VC:'Si pesanteur alors chute de 8 pixels
206 RETURN
207 '
208 'CHUTE
210 PUTSPRITE0,(X,Y),8,D:ONSPRITE GOSUB1050:SPRITEON:'Si colision alors 1050
211 IFLE=1THENEL=EL+1:P=1:'Si RI actif alors Pesanteur Actif
212 IFEL=2THENX=X+1:LE=0:EL=0
213 IFRI=1THENRI=0:P=1:'Si RI actif alors Pesanteur Actif
214 IFUP=1THENY=Y+1:UP=0:'SI UP SURLEV ALORS UP RABAISS
215 IFP=1THENY=Y+VC:'Si pesanteur alors chute de 8 pixels
216 RETURN
217 '
218 'CHUTE A GAUCHE
220 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1060:SPRITEON:SI COLISION ALLER A 1060
222 X=X-16:'Deplacement a Gauche
223 IFUP=1THENY=Y+1:UP=0:SI UP SURLEV ALORS UP RABAISS
224 IFP=1THENY=Y+VC:'Si pesanteur alors chute de 8 pixels
226 RETURN
227 '
228 'GAUCHE
230 PUTSPRITE0,(X,Y),8,D:ONSPRITE GOSUB1070:'SPRITEON:Si colision aller a 1070
232 X=X-VH:'Deplacement a Gauche
233 '
234 IFP=1THEN210:'Si pesanteur alors chute de 8 Pixels
236 RETURN
237 '
238 'SAUT GAUCHE
240 PUTSPRITE0,(X,Y),8,D:ONSPRITEGOSUB1080:SPRITEON:'Si colision aller a 1020
242 IFSG=2THEN210:'Si Saut Droite deja utilise alors aller a 210
243 IFUP=1THENY=Y+1:UP=0:AS=0
244 X=X-VS:Y=Y-VS:SG=SG+1:P=1:'Saut Gauche utilisé! Pesanteur active
246 RETURN
998 '
999 'COLISION STATIQUE
1000 P=0:SH=0:SD=0:SG=0
1001 SPRITEOFF
1002 IFRI=1THENP=1
1003 IFLE=1THENP=1
1004 IFUP=0THENY=Y-1:UP=1
1005 RETURN
1008 '
1009 'COLISION SAUT HAUT
1010 P=0:SH=0:SD=0:SG=0
1011 SPRITEOFF
1013 IFUP=0THENY=Y-1:UP=1
1014 RETURN
1018 '
1019 'COLISION SAUT DROITE
1020 P=0:SH=0:SD=0:SG=0
1021 SPRITEOFF
1023 IFUP=0THENY=Y-1:UP=1
1024 RETURN
1028 '
1029 'COLISION DROITE
1030 P=1:SH=0:SD=0:SG=0:RI=1
1031 SPRITEOFF
1033 IFUP=0THENY=Y-1:UP=1
1034 RETURN
1038 '
1039 'COLISION CHUTE A DROITE
1040 P=0:SH=0:SD=0:SG=0
1041 SPRITEOFF
1043 IFUP=0THENY=Y-1:UP=1
1044 RETURN
1048 '
1049 'COLISION BAS
1050 P=0:SH=0:SD=0:SG=0
1051 'SPRITEOFF
1053 IFUP=0THENY=Y-1:UP=1
1054 RETURN
1058 '
1059 'COLISION CHUTE A GAUCHE
1060 P=0:SH=1:SD=0:SG=0
1061 SPRITEOFF
1063 IFUP=0THENY=Y-1:UP=1
1064 RETURN
1068 '
1069 'COLISION GAUCHE
1070 P=1:SH=0:SD=0:SG=0:LE=1
1071 X=X-16-1:SPRITEOFF
1073 IFUP=0THENY=Y-1:UP=1
1074 RETURN
1078 '
1079 'COLISION SAUT GAUCHE
1080 P=0:SH=0:SD=0:SG=0
1081 SPRITEOFF
1083 IFUP=0THENY=Y-1:UP=1
1084 RETURN
1088 '
1200 DESSIN DES SPRITES
1201 '
1250 FOR I=1TO16:READA$:S$=S$+CHR$(VAL("&B"+LEFT$(A$,8))):NEXTI
1252 ' DESSIN DES SPRITES
1260 RESTORE 1301
1270 FORI=1TO16:READA$:S$=S$+CHR$(VAL("&B"+RIGHT$(A$,8))):NEXTI
1280 SPRITE$(0)=S$
1290 GOTO 1350
1301 DATA 0101010101010101
1302 DATA 0101010101010101
1303 DATA 0101010101010101
1304 DATA 0101010101010101
1305 DATA 0101010101010101
1306 DATA 0101010101010101
1307 DATA 0101010101010101
1308 DATA 0101010101010101
1309 DATA 0101010101010101
1310 DATA 0101010101010101
1311 DATA 0101010101010101
1312 DATA 0101010101010101
1313 DATA 0101010101010101
1314 DATA 0101010101010101
1315 DATA 0101010101010101
1316 DATA 0101010101010101
1350 FORJ=1TO16:READA$:T$=T$+CHR$(VAL("&B"+LEFT$(A$,8))):NEXTJ
1360 RESTORE 1401
1370 FORJ=1TO16:READA$:T$=T$+CHR$(VAL("&B"+RIGHT$(A$,8))):NEXTJ
1380 SPRITE$(1)=T$
1390 GOTO 1450
1401 DATA 0000000000000000
1402 DATA 0000000000000000
1403 DATA 0000000000000000
1404 DATA 0000000000000000
1405 DATA 0000000000000000
1406 DATA 0000000000000000
1407 DATA 0000000000000000
1408 DATA 0000000000000000
1409 DATA 1010101010101010
1410 DATA 1010101010101010
1411 DATA 1010101010101010
1412 DATA 1010101010101010
1413 DATA 1010101010101010
1414 DATA 1010101010101010
1415 DATA 1010101010101010
1416 DATA 1010101010101010
1450 FORK=1TO16:READA$:U$=U$+CHR$(VAL("&B"+LEFT$(A$,8))):NEXTK
1460 RESTORE 1501
1470 FORK=1TO16:READA$:U$=U$+CHR$(VAL("&B"+RIGHT$(A$,8))):NEXTK
1480 SPRITE$(2)=U$
1490 GOTO 1550
1501 DATA 1010101010101010
1502 DATA 1010101010101010
1503 DATA 1010101010101010
1504 DATA 1010101010101010
1505 DATA 1010101010101010
1506 DATA 1010101010101010
1507 DATA 1010101010101010
1508 DATA 1010101010101010
1509 DATA 0000000000000000
1510 DATA 0000000000000000
1511 DATA 0000000000000000
1512 DATA 0000000000000000
1513 DATA 0000000000000000
1514 DATA 0000000000000000
1515 DATA 0000000000000000
1516 DATA 0000000000000000
1550 FORL=1TO16:READA$:V$=V$+CHR$(VAL("&B"+LEFT$(A$,8))):NEXTL
1560 RESTORE 1601
1570 FORL=1TO16:READA$:V$=V$+CHR$(VAL("&B"+RIGHT$(A$,8))):NEXTL
1580 SPRITE$(3)=V$
1590 GOTO 44
1601 DATA 0000000000000000
1602 DATA 0000000000000000
1603 DATA 0000000000000000
1604 DATA 0000000000000000
1605 DATA 0000000000000000
1606 DATA 0000000000000000
1607 DATA 0000000000000000
1608 DATA 0000000000000000
1609 DATA 1111111111111111
1610 DATA 0000000000000000
1611 DATA 0000000000000000
1612 DATA 0000000000000000
1613 DATA 0000000000000000
1614 DATA 0000000000000000
1615 DATA 0000000000000000
1616 DATA 0000000000000000
 


A suivre :fou


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie