Obligement - L'Amiga au maximum

Vendredi 29 mars 2024 - 09:15  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


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 d'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. Nous avons 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, nous lisons les informations du clavier, nous traitons l'information en l'affichant, et nous revenons au début pour de nouveau traiter l'information et enfin l'afficher, et nous recommençons. Dans beaucoup de jeux vidéo ou autres c'est souvent le même schéma de jeu :
  • Nous récupérons les commandes du joueur.
  • Nous traitons l'action du joueur.
  • Nous traitons en conséquence les données envoyées à l'écran.
  • Et nous recommençons jusque à la fin du jeu !
Pour cela, nous réalisons une boucle. La boucle du programme, la boucle du jeu... peu importe comment nous la nommons. 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, nous allons 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". Nous allons 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.

Nous allons 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, nous pouvons 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 nous poursuivons le programme. Si elle n'est pas valide, nous passons 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, nous fermons 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. Nous utilisons un "If/Then" et il n'y a pas besoin d'ajouter le "End If" avec cette méthode. Attention, nous ne pouvons 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 nous pouvons 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. Nous plaçons le curseur, nous effaçons la ligne et nous affichons 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 d'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]


Soutenez le travail de l'auteur