9
votes

Plusieurs écrans dans Pygame

Je fais un petit jeu et je veux faire une autre fenêtre séparément de mon principal.

J'ai le jeu principal dans une fenêtre principale et je veux ouvrir une nouvelle fenêtre et faire une petite animation Lorsque l'utilisateur fait quelque chose.

dans mon code d'exemple ci-dessous, lorsque l'utilisateur appuie sur "A", je souhaite qu'il ouvre une nouvelle fenêtre et blit à là.

Ici, j'ai mis en place Les deux fenêtres: (Je sais que cela ne fonctionne pas, c'est ce que je demande comment faire) xxx

puis le programme: xxx < / Pré>

Jusqu'à présent, ce que cela fait, c'est dessine l'écran principal, puis lorsqu'il est enfoncé, il arrête de dessiner les animations de l'écran principal, mais dessine toujours les autres animations de l'écran principal et dessine dans le coin supérieur gauche. < / p>

Je suis sûr que cela fait cela parce que je suis défini Battle_scene pour être plus petit que l'écran principal, donc lors de la blâgeur Battle_scene zone que j'ai créée (240x160) dans le coin supérieur de l'écran principal.

Cependant, je veux bataille_scene être un séper Mangé la fenêtre, de sorte que lorsque j'appuie «A», il apparaîtra, faites-le, puis fermez-vous ou au moins aller derrière l'écran principal.

Comment faire cela? Est-ce même possible?


3 commentaires

Cela signifie-t-il qu'il y a une façon de le faire? Un peu plus expliquer serait bien :)


Faites une zone dans la fenêtre existante pour les animations.


Donc, fondamentalement, ce que j'ai déjà? Il n'y a pas d'aller plus loin que cela, que vous sachiez?


3 Réponses :


10
votes

Avez-vous vraiment besoin de plusieurs fenêtres? Je veux dire, avez-vous vraiment besoin d'eux?

Si oui, vous devriez probablement utiliser pyglet / cocos2d à la place.

Pour avoir plusieurs fenêtres dans PYGAME, vous avez besoin de plusieurs processus (un pour chaque fenêtre). Bien que cela soit faisable, cela ne vaut pas la peine d'Efford. Vous aurez besoin IPC pour échanger des données entre les fenêtres et je suppose que votre code deviendra Erreur-ornée et laid.

aller avec pyglet lorsque vous avez besoin de plus d'une fenêtre.

La meilleure solution est probablement de diviser votre jeu en scènes. Créer plusieurs scènes de manière à ce que chacun représente une étape de la partie, quelque chose comme Menuscene, Mainscene, Battlescene, Gameoverscène, OptionScene, etc.

Laissez chacune de ces scènes gérer l'entrée / le dessin de cette partie de la Jeu.

  • Menuscene gère des poignées et une entrée, etc. du menu du jeu
  • Mainscene gère le dessin et l'entrée, etc. du jeu en cours
  • BattlesCene gère le dessin et l'entrée, etc. de tout ce que vous faites dans run_ani

    Dans votre Mainloop, passez simplement le contrôle sur la scène actuelle en implémentant les méthodes Draw () , manipul_event () , et mise à jour () .

    Quelque code d'exemple pour obtenir l'idée: xxx

    C'est un moyen facile de séparer de manière proprement la logique de jeu et de permettre commutation de contexte.


2 commentaires

Oh je vois, utilisez des classes. Je n'ai jamais aimé les cours parce qu'ils avaient l'air si déroutant, mais je comprends ce que vous avez écrit là-bas. Je pense que je vais même regarder dans des cours de plus et apprendre plus de choses. Pour l'instant, je vous prends de réponse, cela semble être un moyen simple et efficace de faire ce que je veux, merci beaucoup! :)


C'est une idée intelligente, partageant votre connaissance de telles choses. J'aime apprendre tout ce genre de choses, son intéressant et le plaisir en même temps.



3
votes

====================================== Modifier ======== =================================

En fait, il ne fonctionnera pas. Apperantly pygame ne supporte qu'un seul écran d'affichage, et lorsque vous initialisez une autre, il fermera le premier. Vous séjournerez avec deux varibles, qui sont en fait la même surface. Vous pouvez avoir le jeu à la place de plus en plus la taille de la fenêtre et de jouer la scène de bataille sur le côté de celui-ci, pour ce faire, vous pouvez appeler à nouveau la pygame.display.set_mode () avec des valeurs différentes. Le varible qui fait référence à l'écran d'affichage sera toujours utilisable, car il changer sa référence à la nouvelle. Après la scène est terminée, vous pouvez réduire la fenêtre arrière de la même manière.

=============================================== ===================================

Qu'est-ce qui se passe essentiellement est que vous exécutez une boucle, et chaque itération de celui-ci est rendu et l'affichage d'un nouveau cadre. Lorsque vous appelez une fonction dans une boucle, il ne continue pas à courir jusqu'à ce que vous avez fini d'exécuter la fonction.

Une façon de résoudre ce problen est juste garder d'appeler la fonction qui met à jour la scène de bataille dans la boucle principale. Une autre façon est à l'aide d'un filetage. Threading est essentiellement exécute plusieurs scripts ( "threads") dans le même temps.

Heureusement, python déjà mis en oeuvre pour nous avec le module de filetage. Il est trop long pour moi d'expliquer le module, mais vous pouvez l'apprendre . Il est peut-être un peu complexe si vous ne l'avez pas utiliser les threads avant, mais après un certain temps, il sera plus facile. Et si vous voulez en savoir plus sur vous enfiler pouvez aller .

Specificly ici, vous pouvez avoir deux fils, un pour chaque boucle / fenêtre, et de les exécuter en même temps.

Hope je vous ai aidé!


0 commentaires

0
votes

Oui, c'est possible. SDL2 est capable d'ouvrir plusieurs fenêtres. Dans le dossier d'exemple, vous pouvez regarder "Video.py".

https://github.com/pygame/pygame/blob /main/examples/video.py

"Cet exemple nécessite PYGAME 2 et SDL2. _SDL2 est expérimental et changera."


0 commentaires