IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Thread, horloges et IA


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Thread, horloges et IA
    Bonsoir,

    Dans le cadre du développement d'un petit jeu, je souhaite faire d'abord faire changer constamment dans le temps l'attribut d'un objet. (genre à chaque 1 seconde, l'attribut augmente de 2)
    En fait ça j'ai déja réussi à faire en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import java.util.Timer; 
    import java.util.TimerTask;
    Pour celà, j'ai créé une classe Timers dans laquelle j'ai défini le Timertask() et le start() avec la méthode scheduleAtFixedRate(), et là pour faire apparaître mon chrono, je vais dans mon main, je créé un objet de la classe Timers à laquelle j'applique la méthode start(). En fait, le seul soucis c'est que l'attribut qui augmente de 2 chaque seconde, ben c'est un attribut que j'ai défini dans ma classe Timers, et moi ce que je voudrais c'est pouvoir modifier les attributs de toutes les autres classes au travers de la classe Timers...

    Concrétement :
    J'ai une classe Guerrier qui a pour attribut private int position; et j'ai une classe Timers qui est telle que je l'ai dit ci-dessus, et je veux instancier un guerrier dont l'attribut position augmente de 2 chaque seconde. Aditionnellement je voudrai instancier un 2ème guerrier dont l'attribut position augmente de 3 chaque seconde.

    Une autre question, threads et interfaces vont-il de pair ?

    Merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ce qui est gênant quand tu as un timer pour chaque objet/particules/sprite/entité c'est que tu va rapidement noyer ton programme car tu vas avoir masse de timer / thread. Rien en programmation ne t’empêche de le faire mais ni Java ni l'OS sur lequel il tourne ne gérer un nombre infini ni même un grand nombre.

    Ce qui se passe en général dans un jeu c'est que tu as un timer unique qui fait "vivre" le monde : a intervalles régulier le timer invoque des méthodes qui vont évaluer les mouvements et les choix du joueur et faire réagir le jeu en conséquence, faire faire se déplacer les entités contrôlées par l'IA, bouger le joueur en fonction des touches / contrôles actives, changer les positions des particules, retirer du monde ce qui est désormais mort ou invisible / hors-écran, etc.

    Après il peut y avoir aussi un timer pour une boucle dédiée au rendu (si on veut la separer de la boucle principale), et une dédiée au serveur sonore et quelques annexes mais en general on evite d'en avoir trop compte tenu de la limitation mentionnée plus haut aussi parce que la programmation multi-thread peut être casse-gueule quand il s'agit de debogger les problèmes.

    Voir : Comprendre la programmation d'un jeu vidéo - La boucle de jeu
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre réponse, c'est justement ce qui m'est arrivé, mon programme a crashé alors j'ai mis un seul thread pour tous mes objets !

    En fait je suis confronté à un autre problème. J'ai une méthode qui prend en paramètre un KeyEvent afin de faire bouger un personnage avec les flèches, et ce que je voudrai concrétement, c'est définir la vitesse du personnage. Pour celà, dans la méthode qui fait bouger le personnage, j'ai mis un Timer et tant que t<1, le personnage ne peut pas bouger. En fait ça marche très bien, tant qu'on appelle pas la fonction 36 fois ou sinon il créera 36 timers qui feront bouger le personnage 36 fois lorqu'ils arriveront chacun à t=1 (a savoir que le timer se ferme après mouvement du personnage)

    Y'a t-il moyen d'y remédier ? Pour qu'un seul timer soit actif à la foix ? Merci !

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Ah c'est réglé finalement ! En fait j'ai mis comme attribut de la classe une liste de timers, et à chaque fois que je veux créer un timer via la méthode qui fait bouger le personnage, il vérifie d'abord si la liste est vide, puis il créer le timer et l'ajoute dans la liste (et l'enlève de la liste à la fin de la TimerTask).

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    En fait maintenant, je voudrai faire en sorte que les monstres suivent mon Player. Le problème c'est que je ne sais pas du tout comment m'y prendre... J'ai une fonction gameObject.move(x,y)
    et chaque objet du jeu à une position (x,y). Pour l'instant les mobs ont une trajectoire aléatoire (mais ne s'entrechoquent pas), mais je ne vois pas trop comment créer un méthode pour que les mobs suivent le personnage sachant qu'il y a des obstacles. Voilà merci

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    C'est la justement que tu dois coder ta logique/ton IA qui va intervenir a chaque pas de la boucle de jeu pour évaluer les actions que doivent faire les montres : aller dans la direction* du joueur en fonction de leur vitesse de déplacement et/ou de son accélération** et des obstacle en face d'eux*** et des modificateur de terrain (que pour le moment tu ignores) et des autres montres pour éviter les collisions (que pour le moment tu ignores également).

    * calculer donc un vecteur de direction initial.

    ** un attribut du monstre ?

    *** il va falloir donc procéder au calcul du plus court chemin entre le monstre et le joueur. Et faire changer le monstre de direction quand il rencontre un obstacle.

    En gros la boucle de jeu devrait faire un truc dans le style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tant que vrai
       calculer les nouvelles positions des entités et estimer les réactions de l'IA
       dessiner
    fin tant que
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/09/2011, 18h39
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. [Thread][Horloge système]Réveiller un thread selon l'horloge
    Par Magicmax dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 23/05/2006, 12h48
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo