CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Mon 1er jeu: un Pong en java

EmeraldWeapon
EmeraldWeapon
Niveau 10
05 mai 2008 à 22:56:51

Bonjour,
Voilà, mon premier jeu. Loin d'être parfait mais ça marche à peu près...
C'est donc un pong en java, un joueur, quand on contrôle un pad, l'autre bouge la même façons. ça se joue à la souris (mouvement) et il faut appuyer sur Q ou q pour quitter le jeu. J'ai désactivé la fenêtre car sinon la bordure ( avec les boutons quitter, réduire etc), etc masque le graphique, dans le sens ou (0,0) est le coin supérieur gauche de la fenêtre et avec la bordure, les quelques premiers pixels du graphiques sont masqués par cette bordure au lieu que le graphique commence à l'intérieur de la fenêtre..

http://dl.free.fr/cq5BVhhqa/Pong.jar

Il faut bien évidemment le JRE pour lancer le jar.

Pour le graphisme, c'est un déssin, réalisé avec Graphics2D (drawRect(..) etc) et rafraichit continuellement dans un Thread. J'ai utilisé la classe BufferStrategy pour le double buffering. Sinon je sais qu'il y a encore quelques bugs, et que la direction de la balle est toujours la même et c'est à ce niveau que j'aimerai quelques conseils pour rendre ça moins scripté. Je fais bouger la balle en variant x et y(c'est ballDx et ballDy dans le code).

Si aussi vous pouviez donner votre avis sur le code globalement, je n'ai pas cherché à optimiser. J'ai essayé d'appliquer un algorithme de "jeu" qui est update, render, sleep.

Je ne vois pas comment rendre une physique réaliste et implanter une IA. Merci pour votre attention. Et je ne suis pas un pro soyez indulgent :).

EmeraldWeapon
EmeraldWeapon
Niveau 10
05 mai 2008 à 23:06:19

J'ai oublié de demandé, est ce que graphiquement il y avait un meilleur moyen de faire ça? Merci

adn59
adn59
Niveau 7
06 mai 2008 à 07:11:17

Bien joué, il reste pas mal de choses a modifier, mais c'est un bon début.
Je ne suis pas un pro en Java, mais il doit y avoir moyen de gérée le déplacement au clavier, non?
et pour la "physique", tu pourrais essayé de codé:
-plus la balle est proche d'un coin plus elle est dévié

"Si aussi vous pouviez donner votre avis sur le code globalement, je n'ai pas cherché à optimiser. J'ai essayé d'appliquer un algorithme de "jeu" qui est update, render, sleep."
Il est ou le code?

Bonne continuation

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 09:47:51

Bonjour et merci :)
Le code est dans le jar, c'est le fichier Pong.java. Le jar n'est qu'une archive qu'on peut extraire avec Winrar, 7-Zip ou autre logiciel du même type.

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 09:51:45

Voici le lien direct si jamais il y a des problèmes.

http://dl.free.fr/eQ3JQ0rYU/Pong.java

Bon c'est sur que c'est pas très propre tout dans un seul fichier et une seule classe, mais c'est plus facile à exhiber.

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 11:55:02

Pour le clavier je viens d'essayer mais c'est pas tres reactif. Soit je varie davantage l'ordonnée de la raquette pour que ca bouge rapidement mais ca donne l'impression de saccade et si je laisse une variation de l'ordre de 1 ou 2 pixel c'est lent mais fluide. Ca fait pas tres reactif. on ne peut pas augmenter cette vitesse de répétition du clavier ?

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 12:38:16

Bon pour le clavier c'est reglé j'ai utilisé des booléens pour ne plus dépendre de la vitesse du clavier. :)
Une solution que j'ai trouvé ici :
http://www.gamedev.net/community/forums/topic.asp?topic_id=348728

godrik
godrik
Niveau 30
06 mai 2008 à 13:38:49

Tiens, ca me fait plaisir de voir ca.
C'est pas si mal ecrit que ca pour un premier programme.

J'avais écrit quasiment le meme programme il y a longtemps.
Je n'ai pas pu le tester sur ma machine parceque ma JRE ne marche pas bien, mais je vois ce que ca doit donner.

Quelques remarques:

-Dans ta fonction run(), tu attends 12 millisecondes pour avoir de l'ordre de 80 fps. C'est pas mal parceque ca ne sur utilise pas le processeur. Cependant, fixer cette valeur n'est pas forcement une bonne idée. Si jamais les fonctions gameUpdate et gameRender prennent 10 millisecondes, alors ton tour de boucle durera 22 millisecondes et ton fps va chutter a 45 millisecondes.

Une solution pour regler ce problème la est de calculer le temps qu'il faut attendre en fonction du temps pris par les deux fonctions.

Il n'y a pas vraiment de raison que ca arrive et ce n'est pas tres grave. Mais c'est un point d'amélioration.

-Il pourrait aussi etre interessant de gerer les joueurs sans leur numéros. Ici, tu ecris comme faire pour le joueur 1 et comment faire pour le joueur 2. Fondamentalement, ce n'est pas tres differents. Tu devrais peut etre factoriser le code pour n'avoir besoin d'ecrire le code qu'une seule fois.

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 14:18:27

D'accord, merci!

Pour les thread, le fps, je ne connais pas vraiment tout ça. Le sleep(12) je l'ai mit pour que la vitesse globale de jeu soit jouable et non pas trop rapide. Mais je ne comprends pas vraiment cette partie sur le temps d'exécution,le frame rate et tout ça. Vous pourriez m'expliquer de manière plus précise ou me donner un lien? Merci!

ngc_power
ngc_power
Niveau 2
06 mai 2008 à 14:23:03

J'essaie d'aider ce cher monsieur à avancer dans son pong.
Après un temps d'adaptation, je l'aide à fixer les ptits probs et à aller de l'avant!
Bon ce ne sera pas un jeu révolutionnaire ( ah bon?) mais au moins ca aura eut le mérite de nous faire un bon premier essai de codage de jeu.

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 14:30:15

Pour mettre le jeu en pause (idée de ngc_power) on a un boolean pause de valeur initiale false et positionné à !pause dans keyPressed(KeyEvent e)lorsque l'utilisateur appuie sur P et on fait un while(pause) {Thread.sleep(1);} dans run() mais ce n'est pas très propre. Ceci dit ça marche. Comment faire quelque chose de propre ? je sais qu'il y a wait() et notify mais il n'y a qu'un seul thread.

ngc_power
ngc_power
Niveau 2
06 mai 2008 à 14:48:41

Oui je sais que ce n'est pas propre du tout, mais c'est la première chose qui m'est venue en tête!
Je fais avec les moyens du bords, mais je suis ouvert à toutes les propositions (constructives)

gizmosup
gizmosup
Niveau 3
06 mai 2008 à 16:42:09

Rapidement, je vait répondre à 2 de tes questions (plutôt des améliorations).
La première est sur l'histoire du sleep(12), plutôt que de faire un sleep avec une valeur fixe, tu peux utiliser la valeur de la date courante, c'est à dire mettre comme variable de classe la dernière date à laquelle tu as fais un update et vérifier à chaque update combien de temps tu as passé entre les 2, ensuite, si le temps n'est pas correct, tu ne fais rien (plutôt que de faire un sleep).
En gros, cela te donne un algo de ce style au début de l'update :

Date currentDate = new Date();
if (currentDate.getTime() >= (oldDate.getTime() + 12))
{
oldDate = currentDate;
// TON TRAITEMENT
}
Cette méthode (pas encore parfaitement optimisée te permet de ne pas bloquer ton application (via un sleep) mais juste ton traitement d'update (tes handlers par exemple ou ton affichage fonctionneront toujours, c'est juste que tes déplacements seront constants).

Sur le système de pause, tu peux utiliser la même méthode, c'est à dire de faire un test sur le boolean de pause, cela te donneras un algo de ce style :
if ( (currentDate.getTime() >= (oldDate.getTime() + 12)) || !pause )

Bon, bien sûr mes algos sont écrit en Java (pas en algo pur) et mes solutions ne sont pas spécialement optimale mais devrait te permettre de nouvelles choses.

Un dernier petit point, peut être augmenter la vitesse si cela fait un moment que ta raquette bouge (comme la souris par exemple qui va plus vite au fur et à mesure du déplacement), pour ça, tu peux penser à garder la position de départ de ta raquette et en fonction de cette position de départ et de la position actuelle, faire des déplacements plus ou moins importants, ca devrait rendre assez moche dans le code mais assez fonctionnel si tu veux ajouter cette fonctionnalité

EmeraldWeapon
EmeraldWeapon
Niveau 10
06 mai 2008 à 16:48:49

Ok, un grand merci pour ton aide gizmosup :)

ngc_power
ngc_power
Niveau 2
06 mai 2008 à 20:27:02

Hmm oui j'aime bien ta proposition sur l'adaptation de la pause.
Je vais essayer de la coder en dur!
En ce qui concerne la vitesse des échanges, j'ai updaté la version d'Emerald pour accelerer le jeu au bout d'un certain nombre d'échange!
Bon c'est grossièrement fait, mais j'ajouterai un paramètre aléatoire par la suite!

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment