La Place des Développeurs [En COURS] Moteur de Sprites Moteur de Sprites
ericb59
Membre non connecté
Conseiller Municipal
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?
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 !
igal
Membre non connecté
Conseiller Municipal
@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
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
ericb59
Membre non connecté
Conseiller Municipal
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.
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.
igal
Membre non connecté
Conseiller Municipal
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
[-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
igal
Membre non connecté
Conseiller Municipal
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
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
Il reste pas mal de détails a régler mais ca me semble bien posé pour aboutir à quelque chose de jouable
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
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.
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
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
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
igal
Membre non connecté
Conseiller Municipal
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
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
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
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
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.
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.
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.
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
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
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
igal
Membre non connecté
Conseiller Municipal
@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:
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:
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
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:
A suivre
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
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
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie