Pacman labyrinthe en Java
Donc je suis en train de construire le jeu de pacman en Java pour m'enseigner la programmation de jeux vidéo.
J'ai le jeu de base de la fenêtre avec le pacman sprite et le fantôme sprites dessinés, le pacman se déplace avec les touches fléchées, ne bouge pas au-delà des murs de la fenêtre, etc. Maintenant, je suis en train de construire le labyrinthe, comme dans cette photo:
Sans me donner la direct/solution complète pour cela, quelqu'un peut-il me guider quant à la façon dont cela peut être construit? Je parle seulement sur les limites et les tuyaux('T' marques) ici, vous ne pouvez pas aller de travers et vous devez aller autour. Pas les points qui le pacman mange encore.
Voici mes questions:
1) Quel est le plus efficace algorithme de méthode pour la création de ce labyrinthe? Aura-t-elle à tirer à chaque fois la peinture() la méthode est appelée, ou est-il un moyen de le dessiner seulement au début du jeu et ne plus jamais?
2) Comment ce fait être dessiné à l'écran? Je suppose que le fillRect()
sera utilisé?
3) Tous les conseils sur la détection de collision (de sorte que le pacman/les fantômes ne peuvent pas passer à travers les murs) serait utile.
4) Tous les conseils sur la façon dont l'espace vacant entre les tuyaux seront calculées de façon à ce que les points peuvent être remplis d'entre eux vous seront également très utiles.
Grâce
OriginalL'auteur Click Upvote | 2009-03-07
Vous devez vous connecter pour publier un commentaire.
Je ne voudrais pas le faire de cette façon.
J'avais dessiner la carte graphique, puis de créer un 2D tableau de données qui représente la carte. Les données de la carte serait responsable de la détermination de collisions, de manger des points, où les bonbons et où les fantômes sont. Une fois que toute la logique pour tout ce qui est manipulé suffit d'utiliser le tableau 2D à l'écran tout en pixel de coordonnées sur la carte graphique.
Par exemple, l'utilisateur appuie sur la touche de gauche. D'abord, vous déterminez que pacman est à l'élément 3, 3. L'élément 3, 2 contient des informations indiquant un mur de sorte que vous pouvez mettre en œuvre le code pour lui faire ignorer la commande.
EDIT:
Chaque élément représente environ où un point qui pourrait être. Par exemple:
Pas, en regardant la carte je dirais que le tableau devrait ressembler à quelque chose comme ça.
Et ainsi de suite. Vous pouvez choisir l'un plus souple de la structure de données que juste caractères toutefois, étant donné que certains domaines ont besoin de contenir un tas de différentes informations. C'est à dire même si le fantôme de la frayère est vide, pacman n'est pas autorisé. Le mouvement des fantômes et pacman est différente pour le côté échappe, les bonbons point de spawn est un endroit vide mais si vous voulez rester flexible vous aurez envie de désigner où il se trouve sur un par la carte de base.
Une autre chose que vous voulez à retenir est que pacman et les fantômes sont souvent entre les deux points, donc contenant de l'information qui représente un pourcentage de l'espace qu'ils prennent entre 1,2 et 1,3 est important pour la détection de collision, ainsi que de déterminer si vous voulez supprimer des points, des bonus et des bonbons de la commission.
Édité. Voir ci-dessus.
Merci. Donc, si j'ai voulu déplacer le pacman de 100 x 50 y de la position, comment pourrais-je définir que dans la carte pour montrer que cette position est occupée? le code pour cela?
changement de la structure de données-à-dire quelque chose comme carte[100,50].OccupiedBy = Caractères.PacMan. Les caractères pouvaient être un enum avec des Personnages.Ghost1, Les Personnages.Ghost2 etc.
Qui collection utiliseriez-vous pour que la table de hachage ou linkedlist? je ne savais pas qu'on pouvait avoir un indice comme 100,50, j'ai pensé qu'il devait être 100/50 ou "100,50" comme une chaîne de caractères.
OriginalL'auteur Spencer Ruport
Voici une astuce pour vous:
le texte d'alt http://www.freeimagehosting.net/uploads/66e4131f59.jpg
Cet indicateur, utilisé correctement, vous permettra de gérer le rendu et la détection de collision, et vous permettra également de représenter le labyrinthe de façon compacte.
Il y a différentes façons de le faire. Ma première approche serait fondée sur le fait que le Pac-Man labyrinthe ne change jamais. Avec cette hypothèse, vous pouvez simplement représenter le labyrinthe comme un 28 x 31 grille de 0 et de 1. Ensuite, il suffit d'utiliser un bitmap pour la véritable labyrinthe au lieu de générer de la grille.
...les valeurs 0 et 1) représenter la présence ou l'absence d'un mur par le chemin. L'intérêt de cette représentation est de soutenir la détection de collision avec les murs. Le point de l'image bitmap est juste le rendu. Cette approche nécessite de garder la grille et bitmap dans la synchronisation manuellement.
Si vous voulez le labyrinthe de mettre à jour dynamiquement lui-même basé sur le contenu de la grille, puis il n'y a plus de complexité (soit pour représenter les différents types de coin/mur dans la grille ou autre calculer dynamiquement lors de l'exécution de la cellule d'un quartier). Je voudrais commencer tout simplement si.
OriginalL'auteur Willie Wheeler
Vous pouvez peindre la carte dans un BufferedImage et juste drawImage que, sur chaque paint(). Vous aurez tout à fait raisonnable de la performance de cette façon.
Si vous êtes heureux avec les murs solides, vous pouvez dessiner chaque carré de mur de bloc avec fillRect. Si vous souhaitez obtenir le même rendu que sur la photo, vous avez besoin de comprendre comment dessiner des lignes dans le droit chemin et l'utilisation des arcs pour les coins.
Le Pacman jeu de carte est fait de carrés et de Pacman et les fantômes toujours passer d'un carré à la place voisine dans une étape de l'animation (c'est à dire que vous appuyez sur la touche droite, le pacman se déplace d'une case vers la droite). Cela signifie que la détection de collision est simple: il suffit de ne pas permettre à des places qui ne sont pas vides.
Je ne comprends pas ce que vous essayez de demander ici.
Je veux dire un bloc de pixels. Spencer Ruport parle de la même chose.
OriginalL'auteur TrayMan
1) Juste pour donner mon avis sur la redessiner. Quelque chose que vous pouvez faire si vous trouvez redessiner la totalité de l'image est lent, est de déterminer les éléments qui ont changé sur l'écran et de les redessiner. Une approche pour ce seraient les suivants: Déterminer les sprites qui ont déménagé. Déterminer (approximatif) d'un rectangle autour de ces sprites. Redessiner ces rectangles. De cette façon, vous êtes seulement rafraîchissant parties de l'écran et pas la totalité de l'écran. Il devrait en résulter une augmentation de la performance par rapport retraçant l'ensemble de l'écran.
Les autres réponses ont été raisonnables pour les autres questions que vous avez posées.
OriginalL'auteur kgrad