Par contre, on ne peut pas utiliser de Sprites dans un canvas, c'est bien ça ?
Effectivement, les Sprites utilisent tout un système graphique différent ("OpenGL" ou "DirectX11") qui n'a pas de lien avec le système graphique des objet Windows.
Cependant une même fenêtre Windows peut aussi avoir une (et une seule) fenêtre sous-système insérée, donc gérer des sprites dans cette zone. Voir aide et exemple sur OpenWindowedScreen()
PS. Le nom Canvas peut sembler étrange, mais c'est la traduction anglais de Canevas, Tableau, Toile.
Merci, je connais OpenWindowedScreen(), j'ai posté plusieurs jeux qui l'utilise mais cette fois, comme j'écris un jeu avec une vidéo, je dois utiliser une fenêtre Windows pour y mettre la vidéo et par conséquent intégrer texte, touches, etc. dans cette fenêtre Windows. Dans le jeu top chrono (qui utilise une vidéo) que j'ai pubilé le 10 avril dernier dans la section "Jeux", j'ai mis une petite fenêtre OpenWindowedScreen() en haut mais c'est pas le top (pour moi).
je vais rajouter mon grain de sel
pour tes jeux la voie normal serait l'utilisation de screen (indispensable si tu veux faire des animations propres)
la façon classique de gestion du clavier pour l'animation d'un personnage est KeyboardPushed
cependant la gestion de l'interface utilisateur en mode screen est plutot foireuse
il faut passer par l'interface (male nomée) window3d
mais on peut pas (ou plus) choisir ces skin
Bonjour Guillot,
J'ai déjà programmé avec des Screen ou WindowedScreen. Concernant KeyboardPushed(), ça bloque le déroulement tant qu'on n'a pas relâché la touche et j'aime pas, je préfère la récupération des données à la volée comme KeyboardInkey().
Mon problème est que j'utilise une vidéo qui est à la base de mon jeu et une vidéo ne peut être lue que dans une fenêtre Windows. Si j'ajoute une fenêtre screen, ça ne peut être qu'à l'extérieur de la vidéo (j'ai essayé, ça scintille because FlipBuffers()). Je ne peux donc mettre une fenêtre screen que soit au-dessus de la vidéo, soit en-dessous, soit à droite, soit à gauche.
D'autre part, une boucle avec FlipBuffers() ne se déroule que toutes les 20 millisecondes (avec un framerate de 50, par exemple), ce qui signifie que l'appui sur une touche n'est testé que toutes les 20 millisecondes.
Ca peut paraître dérisoire mais comme j'utilise le temps de réaction d'appui sur une touche pour évaluer la performance du joueur, ça a une incidence.
Dans une boucle avec une fenêtre Windows, ce n'est pas le cas (j'ai testé en tapotant continuellement sur une touche et en mesurant le délai), on arrive à avoir des résultats plus précis.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Salut à tous
j 'avais écris un clone d' inkey$() ou pause clavier avec la touche de son choix
tant que l'on ne re-presse pas la touche définie on reste en pause
Marc,
Si j'ai bien compris, je pourrais utiliser un thread qui me permettrait de tester l'appui sur des touches de manière asynchrone, un peu comme un évènement ? dommage qu'il n'y a pas un exemple plus détaillé dans la doc.
jak64 a écrit : mer. 28/avr./2021 16:05
Si j'ai bien compris, je pourrais utiliser un thread qui me permettrait de tester l'appui sur des touches de manière asynchrone, un peu comme un évènement ? dommage qu'il n'y a pas un exemple plus détaillé dans la doc.
Oui, enfin non,
Un thread est utilisé pour faire une partie du boulot qui ne nécessite pas d'interactivité mais qui prend du temps et donc peut bloquer l'interface (ex: zipper des fichiers, recevoir ou envoyer des fichiers etc).
Les touches clavier sont une fonction qui prend peu de CPU et peut donc être géré dans la boucle principale.
Bonjour falsam,
Dans le jeu que j'écris, je pense que non. Voici le principe de mon jeu :
Il y a une dizaine d'années, j'avais enregistré sur ma télé une épreuve d'athlétisme. J'ai alors récupéré toutes les séquences du lancement du poids. Ensuite, j'ai fait un montage vidéo en mettant bout à bout plusieurs séquences de même type :
1) Le lanceur se prépare à lancer le poids (plusieurs séquences différentes)
2) Le lanceur lance le poids (plusieurs séquences différentes)
3) Trajet du poids (plusieurs séquences différentes)
4) Ralenti du lancer du poids (plusieurs séquences différentes)
5) La lanceur a mordu, c'est à dire qu'il est sorti de la piste de lancement (plusieurs séquences différentes)
6) Le poids atterrit hors zone (plusieurs séquences différentes)
6) Réaction négative du lanceur car son jet n'est pas terrible (plusieurs séquences différentes)
7) Réaction positive du lanceur car son jet est bien (plusieurs séquences différentes)
8- Le joueur est éliminé (plusieurs séquences différentes)
Ensuite, dans un fichier paramètres, j'ai mis la frame de début et la frame de fin de chaque séquence.
Déroulement du jeu, pour chaque essai (il y a 5 essais):
1) tirage aléatoire de la première séquence 1) et lecture de cette séquence
2) tirage aléatoire de la deuxième séquence 2) et lecture de cette séquence à la suite de la séquence précédente.
Pendant l'affichage de cette séquence, apparaissait aléatoirement un carré de couleur, avec démarrage d'un chrono. Dès lors, le joueur devait
appuyer le plus rapidement possible sur une touche et je récupérais le temps mis par la joueur pour appuyer sur cette touche. En fonction du
temps mis, je calculais une distance parcourue par le poids et je choisissais la séquence vidéo du trajet qui correspondait le mieux (la vidéo
contient 41 trajets différents du poids).
3) Lecture de la séquence précédemment calculée après la lecture précédente
4) Tirage aléatoire d'une séquence vidéo (content ou pas content) toujours en fonction du temps mis par le joueur pour appuyer sur la touche et lecture de cette séquence après la lecture de la séquence différente.
5) tirage aléatoire d'un ralenti du lancer et lecture de cette séquence à la suite.
6) Si le temps mis était vraiment pas bon, alors lecture d'une séquence vidéo montrant un mordu ou un hors zone.
7) Bien sûr, affichage des résultats et classement (j'avais enregistré dans un autre fichier le nom et la distance des meilleurs lanceurs du monde) et le joueur était classé ou pas dedans.
Pour les séquences ou l'on voit le lanceur, je n'avais récupéré que les séquences du lanceur Français, qui représentait le joueur.
Voilà le principe, j'avais écrit ça en VBA (hé oui) et ça fonctionnait parfaitement, c'était pas mal car les séquences lues à la suite avaient un certain réalisme par rapport au temps mis pour appuyer sur la touche.
Comme j'ai toujours ce fichier vidéo, je réécris le programme avec Purebaic (que j'aime beaucoup). Je suis bien avancé et dès que ce sera terminé, bien sûr je posterai le programme sur le forum.
Voilà toute l'histoire qui m'a fait poser des questions sur le forum
Ben ta/tes vidéo(s) tu les mets où tu veux : dans une fenêtre, dans un screen, dans un sprite, ou bien dans une texture 3D.
Et pour KeyboardPushed(), je ne comprends pas ton problème : c'est quand une touche est appuyée... (Pas "relâchée"). Ça marche bien, comme dit le grand Tagoul Guillot.