Membre inscrit |
 |
Hors-ligne |
|
Inscription : 01 sept. 2008 19:07
|
| |
|
|
Avant de répondre à la question, je voudrais préciser que les lignes PUT sont à écrire avant de définir les nouvelles coordonnées puis après. On efface ainsi le dessin précédent à chaque nouveau tracé.
S'agissant de la gestion des touches, voilà un exemple qui utilise les flèches du clavier :
'On définit la vitesse de déplacement.
deplace% = 5
'on affiche un dessin
...
'on enregistre ce dessin en prenant deux coins diagonalement opposés du rectangle capable
GET (dessinx1, dessiny1) - (dessinx2, dessiny2), dessin
DO
touche$ = INKEY$ 'dernière touche frappée
'le déplacement débute
FOR i = 1 to deplace%
PUT (X, Y), dessin 'on efface le dessin précédent
SELECT CASE touche$
CASE CHR$(27) 'touche Echap
END 'quitter
CASE CHR$(0) + CHR$(72) 'touche Haut
Y = Y - 1
CASE CHR$(0) + CHR$(80) 'touche Bas
Y = Y + 1
CASE CHR$(0) + CHR$(75) 'touche Gauche
X = X - 1
CASE CHR$(0) + CHR$(77) 'touche Droite
X = X + 1
END SELECT
PUT (X, Y), dessin 'on affiche le dessin aux nouvelles coordonnées
NEXT i
'le déplacement est fini
LOOP
'Ici, il faut, bien sûr, veiller à ce que le dessin ne déborde pas de l'écran.
|
On déplace le dessin d'une ligne ou colonne à la fois, question de fluidité.
Malheureusement, cet exemple n'est pas optimisé, puisqu'on teste le cas autant de fois que ce que vaut la variable deplace%.
De plus, si celle-ci est grande, on remarquera facilement un problème de mouvement. En laissant appuyé son doigt plus d'une seconde avant de l'enlever, le dessin n'arrêtera pas de suite son mouvement.
P.S. : Pour avoir une image synchronisée avec l'écran, on peut ajouter cette ligne avant celle qui efface le dessin :
Si elle est très efficace, voire indispensable, l'attente qu'elle provoque peut aggraver le problème cité plus haut.
Le taux de répétition du clavier influe sur la vitesse d'animation. Par défaut, le BIOS la définit à 20 pour un clavier AT et à 21 pour un clavier PS2. Sous Windows, ce paramètre est diminué, ce qui est mieux pour un jeu de ce type, moins bien, par contre, pour naviguer dans un éditeur de texte. Le délai de répétition aussi est diminué, ce qui n'est pas un mal. Dans le cas d'un clavier pour PC/XT, ces deux valeurs sont fixes, tant pis pour le délai.
Pour paramétrer le clavier sous DOS, taper :
MODE CON: RATE=16 DELAY=1
|
________________
Ajout du 23/07
KEY résoud le problème du taux de répétion. Reste celui du délai de répétition. Voici un exemple légèrement inspiré de PC Warrior :
SCREEN 7
COLOR , 11
'pour un rendu fluide
deplace% = 4 'valeur minimale
'vitesse de l'animation
pas% = 2
'coordonnées d'origine
X = 1
Y = 1
'tableau où est stocké le dessin
DIM dessin(200) AS INTEGER
'Mise en place de l'interception des touches fléchées du clavier numérique
FOR n = 11 TO 14
KEY(n) ON
NEXT n
ON KEY(11) GOSUB haut
ON KEY(12) GOSUB gauche
ON KEY(13) GOSUB droite
ON KEY(14) GOSUB bas
FOR i = 1 TO 20
FOR j = 1 TO 20
READ couleur
PSET (j, i), couleur
NEXT j
NEXT i
GET (1, 1)-(20, 20), dessin
'dessiner: ne doit pas être une sous-routine sinon débordement de pile
dessiner:
FOR i = 1 TO deplace%
'Désactivons la fonction KEY pendant l'effacement et l'affichage
FOR n = 11 TO 14
KEY(n) STOP
NEXT n
WAIT &H3DA, 8
PUT (X, Y), dessin 'on efface le dessin précédent
X = X + changeX%: Y = Y + changeY%
PUT (X, Y), dessin 'on affiche le dessin aux nouvelles coordonnées
'Il faudrait, bien sûr, veiller à ce que le dessin ne déborde pas de l'écran.
FOR n = 11 TO 14
KEY(n) ON
NEXT n
NEXT i
DO: LOOP
haut:
changeX% = 0: changeY% = -pas%
RETURN dessiner
bas:
changeX% = 0: changeY% = pas%
RETURN dessiner
gauche:
changeX% = -pas%: changeY% = 0
RETURN dessiner
droite:
changeX% = pas%: changeY% = 0
RETURN dessiner
'dessin
DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,02,10,10,02,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,10,02,02,10,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,02,02,02,02,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,04,04,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,03,03,03,03,00,00,00,00,00,00,00,00
DATA 00,00,00,00,07,07,07,03,03,03,03,03,03,03,03,03,00,00,00,00
DATA 00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,03,03,03,00
DATA 15,15,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,13
DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
DATA 00,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,00
DATA 00,00,00,00,15,15,15,15,15,15,15,15,15,15,15,15,00,00,00,00
DATA 00,00,00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00,00,00 |
----
Publié : Samedi 25 Juillet 2009 16:02:02
Voilà une animation rapide d'un sprite sur fond étoilé.
Le fond est bleu foncé, les l'étoiles d'arrière plan sont toutes blanches.
L'action par défaut XOR de l'instruction PUT permet de créer très facilement des animations, il suffit de l'appeler pour tracer un dessin ou l'effacer.
Son inconvénient est qu'elle laisse voir « par transparence » des points tracés antérieurement sous le sprite.
Voyons comment on peut faire avec l'action OR. Les points d'arrière-plan ne retrouvent pas leur couleur d'origine lorsqu'on efface le sprite. Il faut donc sauver l'arrière-plan avant de dessiner, puis tout bonnement le restituer.
De plus, il faut utiliser des attributs de couleurs non modifiables par l'action OR. Ainsi, la couleur blanche des étoiles, notée 15, est affecté à l'attribut 1. En effet, x or 1 = x, si x est impair ; tandis que x or 15 = 15 avec x < 16. Il est donc conseillé d'utiliser des attributs impairs pour le sprite.
On aurait pu aussi effacer l'arrière-plan avant de dessiner le sprite.
Le problème est que ce dernier tient dans un rectangle plus grand que lui. Or, il n'est pas réaliste qu'une étoile s'éteigne simplement parce qu'elle se trouve dans ce rectangle.
Il existe une méthode qui résoudrait tous les problèmes précédents. On pourrait vérifier quand les étoiles d'arrière-plan se trouvent dans une zone vide du rectangle. Cependant, l'animation deviendrait trop lente.
'OVNI sur ciel étoilé avec animation de type PUT(x,y), tableau, OR
'== D E B U T ==
SCREEN 7
'on affecte le blanc brillant des étoiles à l'attribut 1...
PALETTE 1, 15 '...car 1 OR x = x avec x impair
'on affecte à l'attribut impair 15 la couleur 8
PALETTE 15, 8 'car 1 OR 8 = 9 alors que 1 OR 15 = 15
'****
'2(vert) OR 1 = 3(cyan) mais un point cyan sur un dessin vert ne se voit pas,
'idem pour les couleurs 4 et 10.
'Pas de réaffectation d'attributs pour ces trois couleurs
'****
COLOR , 1 'fond du ciel crépusculaire
RANDOMIZE TIMER
's'assurer un rendu fluide
deplace% = 4 'valeur minimale
'vitesse de l'animation
pas% = 2
'coordonnées d'origine
X = 1
Y = 1
'tableau où est stocké le dessin
DIM dessin(200) AS INTEGER
DIM sousdessin(200) AS INTEGER
'Mise en place de l'interception des touches fléchées du clavier numérique
FOR n = 11 TO 14
KEY(n) ON
NEXT n
ON KEY(11) GOSUB haut
ON KEY(12) GOSUB gauche
ON KEY(13) GOSUB droite
ON KEY(14) GOSUB bas
'== F O N D ==
'ciel étoilé
FOR i = 1 TO 200
PRESET (320 * RND, 200 * RND), 1
NEXT i
'sauvegarde de l'arrière-plan
GET (X, Y)-(X + 19, Y + 19), sousdessin
'on crée le dessin
FOR i = 1 TO 20
FOR j = 1 TO 20
READ couleur
PSET (j, i), couleur
NEXT j
NEXT i
'on enregistre le dessin
GET (1, 1)-(20, 20), dessin
'== B O U C L E ==
'"dessiner:" ne doit pas être une sous-routine sinon débordement de pile
dessiner:
FOR i = 1 TO deplace%
'Désactivons la fonction KEY pendant l'effacement et l'affichage
FOR n = 11 TO 14
KEY(n) STOP
NEXT n
'synchroniser l'effacement avec le balayage d'écran
WAIT &H3DA, 8
'puisque une opération OR ne permet pas une animation comme XOR,
'on restitue l'arrière-plan préalablement sauvé en guise d'effacement
PUT (X, Y), sousdessin, PSET
X = X + changeX%: Y = Y + changeY%
'on sauve l'arrière-plan avant d'afficher, à cause de l'opération OR
GET (X, Y)-(X + 19, Y + 19), sousdessin
'on affiche le dessin aux nouvelles coordonnées
PUT (X, Y), dessin, OR
'Il faudrait, bien sûr, veiller à ce que le dessin ne déborde pas de l'écran.
FOR n = 11 TO 14
KEY(n) ON
NEXT n
NEXT i
DO
IF INKEY$ = CHR$(27) THEN SCREEN 0: WIDTH 80: END
LOOP
'== R O U T I N E S ==
haut:
changeX% = 0: changeY% = -pas%
RETURN dessiner
bas:
changeX% = 0: changeY% = pas%
RETURN dessiner
gauche:
changeX% = -pas%: changeY% = 0
RETURN dessiner
droite:
changeX% = pas%: changeY% = 0
RETURN dessiner
'== D O N N E E S ==
'dessin avec des attributs impairs de préférence
DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,02,02,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,02,10,10,02,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,10,02,02,10,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,02,02,02,02,02,02,02,02,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,02,02,04,04,02,02,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,02,02,02,02,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,02,02,00,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,03,03,03,03,00,00,00,00,00,00,00,00
DATA 00,00,00,00,07,07,07,03,03,03,03,03,03,03,03,03,00,00,00,00
DATA 00,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,03,03,03,00
DATA 15,15,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,07,13
DATA 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
DATA 00,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,00
DATA 00,00,00,00,15,15,15,15,15,15,15,15,15,15,15,15,00,00,00,00
DATA 00,00,00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00,00,00
DATA 00,00,00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00,00,00
|
Il reste un problème à résoudre : la suppression du délai de répétition du clavier.
Un dernier conseil.
Pour revenir à PONG qui est un jeu en N & B, le mode 2 (CGA 640x200) suffit.
Dernière modification par gm86 le 06 sept. 2010 12:26, modifié 7 fois.
_________________ C:\ONGRTLNS.W95
|
|