Comment représenter une fenêtre 400x400 sous forme de carte dans un jeu Java?

StackOverflow https://stackoverflow.com/questions/622517

  •  05-07-2019
  •  | 
  •  

Question

Je construis un jeu pacman. Fondamentalement, je veux avoir une représentation cartographique de cette fenêtre composée de blocs / tuiles. Puis, lorsque le personnage / fantôme de Pacman se déplace, je modifie sa position sur la carte pour représenter ce qui est à l'écran, et je l'utilise pour la détection de collision, etc.

Comment puis-je construire cette carte, d'autant plus que l'écran est composé de coordonnées x, y, alors comment puis-je les représenter correctement dans des tuiles / sur cette carte?

Était-ce utile?

La solution

Je sais que c’est tentant de penser à des objets et à des interfaces, mais avez-vous pensé à un tableau à 2 dimensions, chaque élément représentant 40 pixels ou quelque chose? Je ne me souviens pas que pacman ait été précis au pixel près en cas de collision, mais plutôt que la direction dans laquelle chaque pièce se déplaçait.

Autres conseils

En général, vous avez une représentation abstraite qui ne fait pas référence aux pixels en tant que tels (par exemple, le labyrinthe de Pac-Man a simplement une largeur de w unités), puis vous obtenez une transformation linéaire (vous savez, y = mx + b ) pour porter la représentation abstraite aux pixels réels.

Pour que cela soit concret, supposons que vous vouliez que votre représentation abstraite ait une largeur de 100 unités et que vous vouliez l'afficher en 400 pixels. La transformation est alors simplement scrn_x = 4 * x.

C'est un peu difficile de trouver ça sans l'écrire moi-même mais.

Vous devez d’abord créer des définitions d’entité qui implémentent ICollidable. Les entités incluent fantômes, pacman, points et bonus. Chaque élément de la carte contiendrait, avec d’autres informations, une liste de toutes les entités présentes avec une sorte de "position". valeur pour plus de précision. L'interface ICollidable comprendrait non seulement une logique permettant de déterminer les entités qui entrent en collision les unes avec les autres (les fantômes ne se heurtent pas avec des points par exemple), mais également de déterminer si elles sont en position de se heurter les unes aux autres. En d'autres termes, si pacman pénètre dans un espace à droite et qu'un fantôme quitte cet espace à gauche, il n'y a pas de collision. Cela vous aidera également à déterminer le moment exact où pacman a mangé un point, de sorte que, graphiquement, il semble correct. Par exemple, si vous détruisez un point dès que pacman entre dans un espace, il disparaîtra avant même de le toucher graphiquement.

Vos images-objets telles que pacman et le fantôme sont représentées par des positions (x, y). Pour déterminer s’ils se rencontrent, utilisez le code de sécurité suivant:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

Notez que cela n’implique pas du tout la carte. Nous pouvons vérifier les collisions entre pacman et la carte séparément. L'astuce ici consiste à diviser la coordonnée en pixels de chacun des côtés de pacman (haut, bas, gauche, droite) et à rechercher d'éventuelles collisions. Par exemple, si pacman va à droite, nous devons vérifier le bord droit en cas de collision:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

Maintenant, si vous avez un grand nombre d'images-objets à l'écran, vous pouvez optimiser la détection de collision image-objet en stockant les images-objets qui existent sur une tuile particulière de la carte. en tuiles adjacentes. Mais pour un premier passage et pour ce jeu pacman, ce n’est probablement pas une optimisation nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top