Obligement - L'Amiga au maximum

Lundi 26 juin 2017 - 12:32  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Soutien

N'hésitez pas à soutenir le projet Obligement



Contact

David Brunet

Courriel

 


Programmation : AMOS - gestion des commandes clavier pour un jeu
(Article écrit par Jean Monos et extrait de off-soft.com - octobre 2016)


Voici un petit exemple de gestion de clavier pour un jeu vidéo. C'est une méthode que j'aime bien utiliser.

Le clavier

Il y a des choses à dire sur le sujet ! Le clavier sur un micro-ordinateur, c'est le bien ! Il permet d'interagir avec le matériel. Il existe aussi deux autres entrées (périphériques) utiles pour ce rôle-là. La manette de jeu (joystick, pad...) et la souris. Cet article va s'intéresser au clavier et comment mettre en place la gestion de ce périphérique pour un jeu vidéo.

Il y a une erreur de programmation que je peux voir chez beaucoup de débutants, voire des personnes qui savent programmer ou utiliser des logiciels pour créer des jeux vidéo (je m'écarte un peu de l'AMOS mais ce n'est pas grave). Quand ils mettent en place la gestion des entrées, par exemple pour déplacer un personnage, ils font en gros :
  • Si le joueur utilise la flèche de gauche du clavier, alors le personnage se dirige vers la gauche.
  • Si le joueur utilise la flèche de droite du clavier, alors le personnage se dirige vers la droite.
  • ...
Ensuite, ils font le même procédé pour une manette de jeu. Certains logiciels peuvent exporter sur Android/iOS, et rebelote, ils refont le même schéma pour la gestion du tactile et là, arrive ce qui doit arriver, le programmeur doit modifier un comportement, et il se retape toutes les modifications qui sont liées à l'entrée ! Pfffff c'est lourd !

Sur Amiga avec AMOS, nous n'avons pas ce problème. On a souvent le clavier + la manette de jeu et vous allez voir ce que je vais proposer, c'est quand même utile. La règle dort, euh non, d'or : utiliser le contenu d'une variable pour interagir avec votre personnage !

Exemple :
  • Si la variable "commande" est égale à 4, alors le personnage se déplace à gauche.
  • Si la variable "commande" est égale à 6, alors le personnage se déplace à droite.
  • ...
  • Si la flèche gauche du clavier est utilisée, alors la variable "commande" est égale à 4.
  • Si la flèche droite du clavier est utilisée, alors la variable "commande" est égale à 6.
  • Si aucune touche n'est utilisée, alors la variable "commande" est égale à 0.
C'est pareil avec la manette de jeu. Et voilà, s'il faut modifier un petit truc, c'est plus simple et plus rapide. Bien sûr, ce n'est qu'un petit exemple. Il se peut que vous deviez utiliser plusieurs variables : variables pour les touches directions, variables pour les touches actions... Et bien sûr, si c'est un jeu où il faut écrire, le système proposé n'est pas viable.

Objectifs

Voici notre premier objectif de programmation :
  • Récupérer l'entrée de l'utilisateur pour savoir s'il utilise une touche fléchée du clavier.
  • La mémoriser.
  • Et montrer à l'écran quelle touche fléchée l'utilisateur utilise.
Pour cela, il faut décomposer notre programme en trois parties :
  • La boucle principale.
  • La sous-routine pour récupérer la touche utilisée.
  • La sous-routine pour afficher la touche utilisée.
Dans notre exemple, nous allons utiliser la sous-routine "Gosub" et non les procédures. Cela évite de déclarer les variables ou de jouer avec les arguments, ainsi que les sorties de variables qui alourdissent l'exemple pour rien. Mais libre à vous de préférer les procédures au Gosub pour structurer votre programme.

La boucle du programme

Débutons avec ça. Un programme est un éternel recommencement dans ses actions. Dans notre exemple, on lit les informations du clavier, on traite l'information en l'affichant, et on revient au début pour de nouveau traiter l'information et enfin l'afficher, et on recommence. Dans beaucoup de jeux vidéo ou autres c'est souvent le même schéma de jeu :
  • On récupère les commandes du joueur.
  • On traite l'action du joueur.
  • On traite en conséquence les données envoyées à l'écran.
  • Et on recommence jusque à la fin du jeu !
Pour cela, on réalise une boucle. La boucle du programme, la boucle du jeu... peu importe comment on la nomme. Personnellement, je code ma boucle comme suit :
  • La boucle "Do loop".
  • A l'intérieur de celle-ci, une commande pour attendre la fin du balayage de l'écran ("Wait Vbl").
  • Et juste après la boucle, la commande "End" pour sortir du programme s'il y a une sortie de boucle.
Rem ===========
Rem Voici ma boucle
Do
Wait Vbl
Loop
End
Rem ==========

Maintenant, on va préparer le terrain avec deux sous-routines :
  • "ENTRER", qui est la routine qui va permettre de récupérer les touches voulues du clavier.
  • "AFFICHAGE", qui est la routine pour permettre d'afficher l'information à l'écran.
A la suite du "DO", un "Gosub ENTRER" et un "Gosub AFFICHAGE" sera présent.

Rem ===========
Rem Voici ma boucle
Do
Gosub ENTRER
Gosub AFFICHAGE
Wait Vbl
Loop
End
Rem ==========

Comment se construit une sous-routine avec Gosub ? "Gosub ENTRER" veut dire "va à l'étiquette ENTRER, et quand tu vas trouver le mot clef "Return", tu reviens ici pour continuer le programme où tu l'as quitté." C'est aussi simple que ça. Donc :

ENTRER:
.....
....
Return
AFFICHAGE:
.....
....
Return

Ce qui fait :

Rem ===========
Rem Voici ma boucle
Do
Gosub ENTRER
Gosub AFFICHAGE
Wait Vbl
Loop
End

Rem Voici ma sous-routine ENTRER
ENTRER:
Return

Rem Voici ma sous-routine AFFICHAGE
AFFICHAGE:
Return
Rem ==========

N'oubliez pas les deux points (:) après le nom de l'étiquette. Les deux points doivent être collés au nom de l'étiquette. Pas d'espace sinon cela veut dire que la ligne attend une autre instruction et transforme l'étiquette en appelle de procédure sans argument.

La sous-routine "ENTRER"

Occupons-nous de la sous-routine "ENTRER". On va récupérer la touche du clavier travaillée. Pour cela, la fonction "Key State" est sympathique. La formule est :

If Key State(Numéros de touche)=true then...

Les numéros de touches que nous voulons sont :
  • 76 pour la flèche du haut.
  • 77 pour la flèche du bas.
  • 78 pour la flèche de droite.
  • 79 pour la flèche de gauche.
Attention, ce ne sont pas les flèches du pavé numérique.

Nous allons mémoriser une valeur dans une variable en fonction de la touche utilisée, et 0 si aucune de ses quatre touches sont enfoncées par le joueur. Les valeurs assignées sont pour notre exemple :
  • 8 pour le haut.
  • 2 pour le bas.
  • 4 pour la gauche.
  • 6 pour la droite.
  • 0 pour rien.
Vous allez me dire pourquoi des chiffres comme ceux-là et pas 0, 1, 2, 3 et 4 ? Je vais vous répondre : regardez votre pavé numérique avec les flèches et les chiffres. Au-dessus de la flèche gauche, c'est le chiffre "4". Celle de la droite, c'est le "6", etc. Mais vous utilisez ce que vous voulez. Vous pouvez même utiliser une variable de type chaîne avec un nom comme "droite"/"gauche"... Je vous propose ma méthode, à vous de la modifier suivant vos besoins et ce que vous aimez faire.

On va maintenant faire des conditions. Il y a également plusieurs moyens de faire cela. Une condition par touche et une multi-condition négative pour placer la variable à 0.

Exemple sur deux touches :
  • Si la flèche gauche est utilisée, alors la variable est égale à 4.
  • Si la flèche droite est utilisée, alors la variable est égale à 6.
  • Si ni la flèche droite ni la flèche gauche ne sont utilisées, alors la variable est égale 0.
Je pense qu'il y a mieux à faire. AMOS n'a pas la fonction "Case" mais les "Else If" existent. Donc, on peut faire un truc du genre :
  • Si la flèche gauche est utilisée, alors la variable est égale à 4
  • Sinon, si la flèche droite est utilisée, alors la variable est égale à 6.
  • Sinon, la variable est égale à 0.
Le programme teste une ligne, si la condition est vérifiée, les autres lignes rattachées à la condition ne sont pas analysées et on poursuit le programme. Si elle n'est pas valide, on passe au test suivant du groupe. Et le "sinon" sans condition, c'est ce qui se passe à la fin si rien n'est valide. Ce qui nous fait :

If Key State(76) =True
VDIRECTION=8
Else If Key State(77) =True
VDIRECTION =2
Else If Key State(78) =True
VDIRECTION =6
Else If Key State(79) =True
VDIRECTION =4
Else VDIRECTION=0
End If

Le "End If" ferme le groupe de conditions sur plusieurs lignes.

Nous allons rajouter un nouveau test de touche pour fermer le programme. La touche "69" correspond à la touche "Échap" du clavier. Donc si la touche est utilisée, on ferme le programme. Pour cela, sur une seule ligne :

If key State(69) =True Then End

Cette fois-ci, c'est une condition sur une seule ligne. On utilise un "If/Then" et il n'y a pas besoin d'ajouter le "End If" avec cette méthode. Attention, on ne peut pas placer une condition d'une seule ligne dans une condition à plusieurs lignes. Mais une condition de plusieurs lignes peut avoir une condition de plusieurs lignes.

Exemple :

If X=5
If Y=7
   Print "ok"
End If
End If

Bon, l'exemple est con car je peux combiner les deux sur une seule ligne, mais si X=5, alors on peut traiter les instructions et un nouveau test pour Y pour traiter dans cet exemple l'affichage du "ok". Et attention à bien refermer les tests de condition avec les "End If". Fin de l'aparté.

La sous-routine "AFFICHAGE"

Maintenant, nous avons fini avec la partie "ENTRER", nous allons attaquer la partie "AFFICHAGE". Cela va être simple. On place le curseur, on efface la ligne et on affiche une nouvelle ligne avec la valeur de notre variable.

Locate 0,4
Cline
Print "Valeur de la variable : "+Str$(VDIRECTION)

Une routine simple, vu que j'affiche du texte, la variable qui est ajoutée au texte doit être une chaîne. La fonction "Str$(Variable_Numérique)" permet de transformer une variable numérique en chaîne. Voici le programme en entier au format ASCII.

Ma méthode est sympa mais comment récupérer la valeur d'une touche ? La routine est donnée à la page 10,01,02 du manuel de l'AMOS (tout en haut) mais voici le morceau de code :

Do
While K$=""
K$=Inkey$
Wend
If Asc(K$)=0 Then Print " no ascii code"
Print "the scan code is ";Scancode
K$=""
Loop

Bien sûr, appuyez sur "Contrôle+C" pour quitter le programme. Vous avez maintenant les touches au clavier. Mais voici les codes qui peuvent être utiles :
  • 45 : 4/la touche "Gauche" du pavé numérique.
  • 47 : 6/la touche "Droite" du pavé numérique.
  • 62 : 8/la touche "Haut" du pavé numérique
  • 30 : 2/la touche "Bas" du pavé numérique.
  • 64 : la touche "Espace".
  • 67 : la touche "Entrée" du pavé numérique.
  • 68 : la touche "Entrée".
  • 69 : la touche "Échap".
  • 76 : la flèche haut.
  • 77 : la flèche bas.
  • 78 : la flèche droite.
  • 79 : la flèche gauche.
...il y a de quoi faire avec ça.

Pour finir sur ce petit tutoriel, voici un code source en AMOS avec un exemple simple de déplacement : off-soft.com/source/tuto/dep.amos. J'espère que cet article peut vous être utile.

Je vous dis bon codage et à la prochaine.


[Retour en haut] / [Retour aux articles]