Je travaille sur un jeu d'aventure en Python en utilisant Pygame. Mon principal problème est de savoir comment je vais définir les limites de la pièce et faire en sorte que le personnage principal marche sans toucher une frontière à chaque fois. Malheureusement, je n'ai jamais étudié les algorithmes, donc je n'ai aucune idée sur la façon de calculer un chemin. Je sais que cette question est assez générale et difficile à répondre, mais un point dans la bonne direction serait très apprécié. Merci!Jeu d'aventure - se promener dans une pièce
Répondre
Je vous recommande de lire l'algorithme de recherche A* car il est couramment utilisé dans les jeux pour les problèmes de cheminement.
Si ce jeu est bidimensionnel (ou 2.5), je vous suggère d'utiliser un système de carreaux car la vérification des collisions sera plus facile. Theres beaucoup d'informations en ligne qui peuvent vous aider à démarrer avec ceux-ci.
Merci beaucoup. Je suis actuellement à la recherche dans ce http://www.pygame.org/project-AStar-195-.html – kallepersson
Malheureusement, je n'ai jamais étudié d'algorithmes, donc je n'ai aucune idée sur la façon de calculer un chemin.
Avant de commencer à écrire des jeux, vous devez vous renseigner sur ceux-ci. Cela prend un peu plus d'effort au début, mais vous permettra d'économiser beaucoup de temps plus tard.
Merci! Je suis actuellement en train de regarder dans l'algorithme A *. – kallepersson
Je ne suis pas familier avec pygame, mais de nombreuses applications utilisent généralement bounding volumes pour définir le bord de certaines régions. L'idée est que lorsque votre personnage marche, vous vérifiez si le volume des caractères croise le volume d'un mur. Vous pouvez alors ajuster la vélocité ou empêcher votre personnage de bouger. Utilisez des formes différentes pour obtenir un mur lisse afin que votre personnage ne reste pas coincé sur les bords pointus.
Ces concepts peuvent être utilisés pour toute application nécessitant une détection rapide des bords et des limites.
Il y a deux façons simples de définir vos limites qui sont appropriées pour un tel jeu.
La méthode la plus simple consiste à diviser votre zone en une grille et à utiliser un tableau 2D pour suivre quels carrés de la grille sont passables. Habituellement, ce tableau stocke aussi les informations de votre carte, donc dans chaque position, il y a un nombre qui indique si ce carré contient de l'herbe ou un mur ou une route ou une montagne etc. (et donc quelle image afficher). Pour vous donner une image approximative:
######
#.# #
# ## #
# #
######
Une méthode plus complexe qui est nécessaire si vous voulez une sorte de regard « labyrinthe », avec parois minces, est d'utiliser un tableau 2D qui indique s'il y a un mur vertical entre les carrés de la grille, et aussi s'il y a un mur horizontal entre les carrés de la grille. Une image brute (il semble un étiré en ASCII, mais nous espérons que vous aurez le point):
- - - -
| | |
- -
| |
- - - -
La prochaine chose à décider est ce que les directions de votre personnage peut se déplacer dans (haut/bas/gauche/droite est plus facile , mais les diagonales ne sont pas trop beaucoup plus difficile). Ensuite, le programme doit essentiellement «mentalement» explorer la zone, à partir de votre position actuelle, dans l'espoir de trouver la destination.
Une recherche simple qui est facile à implémenter pour le haut/bas/gauche/droite et vous trouverez le chemin le plus court, s'il y en a un, est appelée Breadth-First search. Voici quelques pseudo-code:
queue = new Queue #just a simple first-in-first-out
queue.push(startNode)
while not queue.empty():
exploreNode = queue.pop()
if isWalkable(exploreNode): #this doesn't work if you use
#"thin walls". The check must go
#where the pushes are instead
if isTarget(exploreNode):
#success!!!
else:
#push all neighbours
queue.push(exploreNode.up)
queue.push(exploreNode.down)
queue.push(exploreNode.left)
queue.push(exploreNode.right)
Cet algorithme est lent pour les grandes cartes, mais il vous habituer à des graphes recherche et les concepts pathfinding.Une fois que vous avez vérifié que cela fonctionne correctement, vous pouvez essayer de le remplacer par A * ou quelque chose de similaire, ce qui devrait donner les mêmes résultats en moins de temps!
A * et de nombreux autres algorithmes de recherche utilisent une file d'attente prioritaire au lieu d'une file d'attente FIFO. Cela leur permet d'envisager d'abord les chemins "plus probables", mais de contourner les chemins d'accès en sens inverse s'il s'avère que les chemins les plus directs sont bloqués.
Merci beaucoup pour cette description approfondie. Cela m'a aidé à mieux comprendre les algorithmes! Je suis probablement en train de me contenter de l'algorithme A * car il fait la plupart de la réflexion pour moi :) La taille de la carte pourrait être un problème avec A *, puisque l'implémentation actuelle que j'utilise (http: // www. pygame.org/project-AStar-195-.html) fonctionne assez lentement avec une carte 1024x768. Peut-être devrais-je agrandir chaque tuile de la carte et diminuer le nombre total de tuiles. – kallepersson
Pourquoi votre carte est-elle si grande? Les dalles de 1 pixel sont beaucoup trop petites. Si vous voulez que votre monde de jeu soit "dessiné à la main" plutôt que peint à partir de tuiles, une solution raisonnable est également de dessiner une carte (invisible) de zones passables/infranchissables, avec 4x4 pixels par carré dans cette carte. Vous pouvez également rendre A * "plus intelligent" de diverses manières, par exemple en faisant une distinction entre les voyages "locaux" et les voyages "mondiaux". Ou vous pouvez simplement limiter à quel point A * est prêt à regarder, et forcer l'utilisateur à cliquer quelque part plus facile d'accès. – Artelius
Oui, les dalles de 1 pixel sont définies trop petites. Pour clarifier, je rend ma carte adaptée à un monde avec une perspective 2.5D (comme Monkey Island 3 par exemple). Même ainsi, vous avez raison en ce que je n'ai pas besoin de tuiles 1px. 4 ou même 10 pixels seraient bien suffisant. Les tuiles seront invisibles. Merci pour vos conseils. – kallepersson
- 1. lien vers une pièce jointe
- 2. Créer une maison en 3D et s'y promener sur le web
- 3. ennemi de jeu se déplacer vers joueur
- 4. WinForm - Intégration WPF; Pièce par pièce
- 5. PHP mail() - HTML apparaît comme une pièce jointe une fois qu'une pièce jointe est ajoutée
- 6. Comment faire pour que MEF se recompose quand je change une pièce?
- 7. Télécharger une pièce jointe en utilisant java
- 8. Se bloquer dans une boucle de jeu et supprimer les sprites naturellement
- 9. pièce jointe Stream devrait ouvrir dans une nouvelle fenêtre
- 10. Comment annuler par programmation une pièce jointe dans InfoPath Forms
- 11. Pièce jointe d'envoi SMTPClient C# localisée dans une URL
- 12. Envoyer une pièce jointe avec php
- 13. Ajouter une pièce jointe avec UpdateListItems?
- 14. Ajouter une pièce jointe à l'email
- 15. ActionMailer - Comment ajouter une pièce jointe?
- 16. Publier une pièce jointe Facebook Graph API
- 17. que feriez-vous dans un échiquier? (Position de pièce)
- 18. Se nom du fichier copié dans le presse-papier pièce jointe à VB.NET
- 19. Comment android poids pièce
- 20. Aperçu InfoPath Pièce jointe
- 21. Comment lire pièce jointe
- 22. Conserver une table en une seule pièce MigraDoc/PDFsharp
- 23. HTML dans la pièce jointe iCal
- 24. Grande carte dans le jeu vidéo 2d
- 25. VIM Jeu de couleurs par défaut ne se charge pas
- 26. php pièce jointe
- 27. Ajax-pièce composite
- 28. Le jeu se bloque après avoir été stressé
- 29. Comment faire correspondre une chaîne avec une pièce optionnelle?
- 30. postale avec pièce jointe
Contrôlez-vous votre personnage principal vous-même? ou est-ce une sorte d'IA qui se déplace d'elle-même? –