Programmation événementielle

Signaler
Messages postés
242
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
17 janvier 2018
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour !

Je suis actuellement en train de développer un petit jeu fonctionnant via socket en mode asynchrone, et afin de gagner en automatisme tout en gardant une classe de moteur de connexion réutilisable je m'intéresse à la création d'événements.

Quelques petites questions me sont venues alors à l'esprit :

- le application.doevents agit-il aussi pour les événements personnalisés?

- une fonction/sub qui envoie un événement via raiseEvent attend-elle la fin de la sub de gestion de l'événement pour se terminer/continuer?

Le dernier point est celui qui m'intéresse le plus : en effet, la sub que je cherche à démarrer par événement est la boucle globale du jeu, lorsque le client se connecte au joueur serveur, et cela serait génant si l'application se mettait a freezer ...

Voilà, en attente de vos réponses, merci d'avance !

Cordialement, KiTe

ps : je posterais par la suite sur ce post les problèmes rencontrés, afin d'éviter de créer 50 sujets .. on ne sait jamais ^ ^
A voir également:

5 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
salut,

- le application.doevents(...)
oui

- une fonction/sub qui envoie un événement(...)
oui. plus précisément c'est pas qu'elle "attend", c'est que ce n'est juste plus son tour ^^

- la sub que je cherche à démarrer (...)
oh çà sent mauvais çà ^^
tu ne devras pas démarrer une sub qui va tourner en boucle
une sub va déclencher la connexion, tu va traiter une suite logique (identification, validation etc..) jusqu'à arriver au traitement dans le _DataArrival (ou équivalent en dotnet...)
surtout pas de boucle qui ne s'interrompt que par la fermeture!!

par contre tu dis au départ jeu fonctionnant via socket en mode asynchrone, ummm çà veut dire que le joueur 2 peu jouer avant la réponse qu'il attend? plusieurs threads? pour un jeu à mon avis il faut que çà soit une connexion synchrone...

++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
242
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
17 janvier 2018

Merci pour tes réponses =)

Le jeu est synchrone, seul le mode de connexion et de réception des données ne l'est pas.

Et bien oui, une boucle ça pue, je l'ai remarqué il y a bien longtemps déjà, mais je n'arrive pas a m'en séparer..

En effet, voici le fonctionnement globale de mon jeu, un jeu de carte type tetra master,  (version J vs IA) :

Lorsqu'un des joueurs joue, passe son tour ou se défausse de sa main, j'appelle une fonction de vérification globale, qui gère les informations affichées dans l'interface de jeu (points de vie, points d'action pour jouer des cartes, cartes sur le plateau, etc) et qui fait jouer l'IA si besoin.
Ici est de problème.

En effet, si l'IA joue, alors la fonction de vérification est de nouveau appelée, sans qu'elle ne se soit terminée précédement...
La fonction de vérification peut alors etre appelée 2,3 de manière récurrente.

De même, si je fais une fonction de vérification de l'IA séparée de la vrification globale.

Ce problème était réglé dans le fait de faire une boucle globale, ne s'achévant qu'à la fin de la partie (et non fermeture du programme) :

Public Shared Sub BoucleGlobale()








While _gameOver = False

 If Not _gameType TypeGame.Remote And _playerTour PlayerType.Adversaire Then






 IAVerif()






 End If


Application.DoEvents()




 verif()






 Application.DoEvents()






 End While






ClearGame()






End Sub 'BoucleGlobale

Dans ce cas ci, vérfi et IAverif sont totalement indépendantes, donc plus de récurrences, plus de problèmes ...
Je pense que si j'arrive a régler ça, alors les problèmes liés au socket se régleront aisément.

J'ai bien réussi a régler le problème version bidouille, mais je n'aime pas ça ... (un jeu de variable booléenne, c'est bof =/ )

Voilà, si il y a des idées..
Cordialement, KiTe
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
des idées, peut-être sur le principe oui
(attention, à traduire mentalement de vb6 vers dotnet ^^)

J vs IA, ou J vs J, exactement pareil
le principe réside dans "où j'en suis", à savoir "à quelle étape du jeu"

en gros on a quoi....
[***]
*ouverture appli
*connexion (vers serveur, ou écoute pour attente client, ou appel de l'IA)
*début de partie, init tout à 0 + "qui est le premier à jouer"
et à partir de ce premier coup, il n'y a plus d'étape. donc tu n'as rien à attendre
**jusqu'à -> victoire/défaite/null

çà s'arrêtera comment alors?
[---]
*je (serveur) déconnecte (je fais 'quitter', ou 'recommencer', déco adsl naturelle, ou je prends un tournevis pour démonter mon modem sans raison ^^)
*idem pour mon adversaire (client) si J vs J
*coupure de courant chez l'un ou l'autre (çà reste toujours du même ordre = erreur à gérer)
*je perds la partie
*je gagne la partie
*selon le jeu on est dans une impasse, bloqués qui impliquera un match NULL

un peu plus concrêtement çà PEUT donner une sorte d'enum selon ce qu'on vient de dire, et arrivé à l'avant dernière étape, tu reçois juste les data à analser, et donc fais tes calculs (score, bouger des pièces, etc...) uniquement là (donc si mStep = GameRunning dans le _DataArrival)
+ gestion déco etc...., + perdant gagnant

qu'en dis-tu?
(pas super facile à expliquer à l'écrit....)
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
242
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
17 janvier 2018

J'ai exactement ça :
en gros on a quoi....  [...] **jusqu'à -> victoire/défaite/null

Et tout les cas d'arrêt de jeu que tu énonces sont gérés (plantage de la connexion entre client et serveur, ou fin de partie)

Pour ce qui est du traitement des données je fais comme ça :

-cas JvJ remote :
on reçoit les datas par socket, on les analyse dans une fonction prévues pour, et en fonction de ce qu'on reçoit on agit (pose de carte, perte de PV, etc), mais le tout en MEMOIRE
Puis une fonction de vérification est appelée, et transcrit tout ce qui est en mémloire (Pv, etc) dans l'interface visuelle. Seules les cartes sont posées directement a l'analyse des datas.

coté J v IA, c'est en gros la même chose, sauf que ya pas de socket.

Donc a lire tes conseil, la structure globale du jeu est bien respectée, reste juste a virer cest sub de vérification et a inclure les modification visuelle directement dans les fonction d'analyse...
Cependant le problème de récurrence reste le même, il faut bien faire jouer l'IA, qui ré-appelle ces sub d'analyse avant leur fin =S

Où que je regarde, ce pb de récurrence reste, je vais essayer de faire avec, en bidouillant un peu et en réfléchissant a comment limiter cela.. Ca restera tjrs plus économique qu'une boucle barbare..
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
du peu que j'ai lu en dotnet et de "comment je ferais en vb6", tu ne peux pas plutôt gérer dans ton appli un objet USER (donc forcément 2) régit soit par une data venant d'une IA, soit de certaines touches d'un clavier, soit d'un socket?

c'est dans ce sens que j'entendais "J vs IA, ou J vs J, exactement pareil"

tu as tes 2 SEULS users, avec leurs évènements "identiques" mais respectifs, qui renvoient leurs actions à ton appli.
actions elles régient soit par ton fonctionnement IA, soit par pression clavier, soit par réception de data

enfin çà me semble le plus propre...,  je ne vois pas quel intérêt ton appli peut avoir à différencier "de quoi ou comment ou d'où" les data arrivent...
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp