JeuWeb - Crée ton jeu par navigateur
Temps Reel Java - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Temps Reel Java (/showthread.php?tid=5968)

Pages : 1 2 3 4


Temps Reel Java - Aleskweb - 08-02-2012

Bonjour,

Mon serveur socket étant partiellement fini, enfin partiellement puisque sa seule fonctionnalité est de distribuer tout ce qu'il reçoit a tous les joueurs connectés mais ça suffit amplement pour le moment.

Enfin bon, je m'attaque donc a la partie jeu en elle même, et la, même après m’être documenté je bloque: Le temps réel.
En effet meme si JavaFX propose de très bon compromis pour les animations, entre autre avec la TimeLine() et le système de Keyframe qui permet de choisir la position de tel objet a tel moment (que l'on configure en ms), ce système reste peu souple, notamment pour le calcul des collisions.

Je me retrouve confronté a deux choix:

-Le choix 1 : C'est du semi temps reel, a l'aide des keyframe de javaFX je lance des animations a chaque fois que le client reçoit des paquets qui demande des déplacements. Pour ce qui est des collisions, je parles bien entendu des déplacements ainsi que des skillshots (Pour savoir si le sort touche ou pas) il faut que je les calcule dans un thread a part.
Les inconvénients : Si le joueur veut changer de direction en plein milieu d'une autre direction, je n'ai aucun moyen de connaitre la position actuelle du joueur sur le plateau 2D Isométrique. De plus avec les keyframe je ne peu pas synchroniser le thread de collision avec l'affichage

-Le choix 2: Je lance un Thread de rendu qui tourne en boucle et qui ré-affiche les éléments du jeu avec les nouveaux changements a chaque tour de boucle . A ce moment la je me retrouve avec un système un peu plus dur a coder, mais plus souple.

Le problème principal est surtout de pouvoir controler le nombre de tour de boucle par seconde, c'est a dire le nombre d'image par seconde (ips ou fps). Et la, a part ralentir la boucle avec des pauses je ne vois pas trop de solution (Je tiens a préciser que je trouve cette solution stupide, puisque au final je n'aurais pas un nombre d'ips fixe mais qui dépendrais des capacités de calcul de l'ordinateur client)

Si vous avez des pistes a me conseiller, je vous en remercie d'avance


Cordialement,


RE: Temps Reel Java - Maks - 08-02-2012

Salut,

Niveau concept je ne vois que deux façons de faire :

- une boucle qui tourne en permanence pour raffraichir la map ce qui est le plus simple
- un rafraichissement au cas par cas, lorsqu'on se déplace, où que l'on reçoit une socket qui nous informe d'un déplacement d'un joueur

La deuxième solution est plus longue à coder, mais utilise moins de ressource. Quoique discutable lorsque tu as beaucoup de joueurs sur la carte.

Pour connaître les coordonnées de ton joueur, tu as les attributs de ton objet. Puis tu peux stocker tes objets de type Joueur dans un tableau contenant tes variables objets. Ensuite tu peux le parcourir pour vérifier à chaque fois les collisions avec d'autres joueurs.




RE: Temps Reel Java - Aleskweb - 08-02-2012

Hum merci pour ta réponse Big Grin
Je pense opter pour la première solution, et dans ce cas la, je rajoute des Events qui durent tant de tour de boucle. Le truc c'est qu'il faut que j'arrive a fixer un nombre de tour de boucle maxi par seconde, et ça, je vois vraiment pas comment faire.

Ensuite pour les collisions, j'ai en effet les coordonnées de tous les objets de la carte a chaque instant, mais il faut quand meme une boucle pour les comparer non? A moins que je fasse un thread a coté qui demande les positions de tous les objets et les compare en boucle ?


RE: Temps Reel Java - Maks - 08-02-2012

Il faut choisir un frame rate à respecter. La formule exacte est 1000/FPS, donc 1000/30 voire 1000/60 Smile

Dans ta méthode deplacer() pour le Joueur, tu calcules les nouvelles coordonnées. Puis tu vérifies genre :

if(map.checkCollisions(newY, newX) === true) return false;

et en dessous tu assignes les nouvelles coordonnées (qui ne seront pas assignées si tu passes dans le return false).

et dans checkCollisions() avec this le contexte de l'objet map et arrayPlayer une variable "Joueur[] arrayPlayer" à remplir.

boolean collision;

for(int i = 0, i < this.arrayPlayer; ++i) {
if(this.arrayPlayer[i].y == newY && this.arrayPlayer[i].x == newX) {
collision = true;
break;
}

return collision;

Après tu peux utiliser un while plutôt qu'un for + break ce qui pour les puristes sera peut être perçu comme plus propre lol.
Y'a moyen de faire une recherche dichotomique lorsque t'auras vraiment beaucoup de joueurs Smile


RE: Temps Reel Java - Aleskweb - 08-02-2012

Hum pour le frame rate c'est donc 1s/fps ce qui nous donne la periode d'un tour de boucle. Mais comment l’appliquer? J'ai cherché il y a des compteurs de frames par secondes mais rien qui me permette de fixer un nombre d'ips.

Merci pour les collisions, j'ai compris Big Grin


RE: Temps Reel Java - Maks - 08-02-2012

http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/Timer.html

Timer timer;
int fps = 60;

ActionListener todo = new ActionListener ()
{
public void actionPerformed (ActionEvent event)
{
/* traitement
* [...]
*/
}
};

timer = new Timer(1000/fps, todo);

?


RE: Temps Reel Java - Aleskweb - 08-02-2012

Merci ! Ah oui en effet, donc ca ne constitue pas vraiment une boucle mais plutôt une action qui se repete toutes les x secondes. Je comprends mieux.

Sinon ma solution "A moins que je fasse un thread a coté qui demande les positions de tous les objets proche et les compare en boucle ?" est-elle viable?


RE: Temps Reel Java - Maks - 08-02-2012

Oui je me suis mal exprimé en parlant de "boucle", j'ai utilisé un raccourci dans mon esprit pour dire un "timer qui tourne en boucle" ^^

La deuxième solution c'est pour les collisions ? Ca me parait compliqué, j'ai du mal à visualiser ^^


RE: Temps Reel Java - Aleskweb - 08-02-2012

Oui de toute façon faire un timer qui tourne en boucle sera plus efficace pour gérer les collisions, les plans (Quand un perso passe devant ou derrière un objet), les animations etc..

Cette syntaxe la n'est pas plus adaptée a une "boucle" de jeu? :

public class TimerExample
{
public static void main (String[] args)
{
Timer timer = new Timer();
timer.schedule (new TimerTask() {
public void run()
{
//traitement
}
}, 0, délai);
}
}


RE: Temps Reel Java - Maks - 08-02-2012

C'est d'autres méthodes visiblement pour Java SE 1.3, moi j'ai regardé sur l'API Timer de Java SE 1.5 ^^