Quelle serait la meilleure façon de trouver un espace ouvert dans un niveau?


7

Je travaille sur un jeu 2D où vous utilisez de la peinture pour ajouter des tuiles à un niveau et en ce moment je travaille pour ajouter des tuiles de chaîne. Je l'ai configuré pour que certaines peintures orientées direction utilisent deux points (un début et une fin) pour déterminer la direction dans laquelle les tuiles pointeront (gauche, droite, haut, bas.) Les tuiles Warp ont ces points, mais elles seront ajouté à deux autres listes (début et fin de chaîne). Le fonctionnement des distorsions est le suivant: si le joueur touche une tuile, il sera téléporté sur la tuile correspondante. Maintenant, si je veux que cela fonctionne correctement, je dois faire en sorte que le joueur ne puisse pas être téléporté dans un mur ou hors de la carte. Je dois donc déplacer le point sur une tuile ouverte exactement à un espace de tout mur.

Quelle serait la meilleure façon de faire cela?


Configurez-vous ces points de distorsion à l'avance ou sont-ils générés automatiquement d'une manière ou d'une autre?
Richard Marskell - Drackir

Voir ma réponse et la description du problème d'emballage à gamedev.stackexchange.com/questions/16054/…
Ingénieur

@Drackir La peinture n'est qu'une trace de particules qui ne disparaît pas ou ne bouge pas et chaque particule a son propre point pour cartographier sa position. J'ai donc créé une boucle for qui vérifie la position de chaque particule, voit si cette tuile est ouverte, modifie la carte de collision en conséquence, puis supprime la particule. Les graphiques de tuile sont dessinés selon la carte de collision.
IronGiraffe

Je suis incroyablement confus. Peut-être qu'une image aiderait les gens à voir ce que vous essayez de faire et vous donnerait des réponses solides.
Richard Marskell - Drackir

@Drackir Voici la vidéo du jeu jusqu'à présent. Chaque fois que vous posez des tuiles, vous changez les valeurs à cet endroit sur la carte de collision (un tableau int.) Avec les tuiles Warp, j'ai besoin de 9 tuiles d'espace ouvert (les 9 tuiles sont égales à 0) et les tuiles Warp sont créé aux extrémités de la ligne violette (où les drapeaux apparaissent à 1:32.) Ce dont j'ai besoin est un moyen d'utiliser un algorithme de recherche pour rechercher autour de l'ancien point un nouveau point qui correspond à mes directives (8 tuiles vides autour le nouveau point qui est également vide.) Exemple.
IronGiraffe

Réponses:


3

Si tout ce que vous voulez faire est de vous assurer que la tuile cliquée est entourée de tuiles ouvertes, je créerais simplement une fonction qui vérifie les tuiles autour d'elle. Et puis appelez cela sur la vignette cliquée.

Vous pouvez le configurer dans une boucle (imbriquée) ou simplement créer des instructions if pour lui. Donc, en pseudo-code:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Modifier en fonction du commentaire

Il existe deux façons de gérer la situation:

  1. (Le plus simple) Vous pouvez simplement jouer un son et indiquer que la position qu'ils ont choisie n'est pas valide et qu'ils doivent choisir une autre option.
  2. Utilisez un algorithme de recherche pour trouver une tuile ouverte. Cependant, je pense qu'il devrait y avoir des limites à la façon dont vous l'utilisez. Prenons, par exemple, une situation où ils cliquent sur le côté gauche de la carte et le seul endroit ouvert est loin sur le côté droit. Votre algorithme de recherche trouve cet endroit ouvert et y place l'autre chaîne. Cela ne semble pas très intuitif et peut être frustrant. Ma suggestion dans ce cas (en supposant que vous ne voulez pas faire # 1 qui est ma principale suggestion), est de rechercher uniquement les tuiles autour de la tuile actuelle (peut-être dans un rayon de n tuiles). De cette façon, la porte de distorsion n'apparaîtra pas trop loin de l'endroit où vous avez cliqué. Pour faire une recherche comme celle-ci (en supposant un rayon de 1 tuile), il vous suffit d'appeler la fonction ci-dessus sur les huit tuiles autour de la case actuelle (en supposant que la case actuelle n'était pas disponible). Vous pouvez le faire en boucle ou, encore une fois, avec des instructions if.

Je sais comment faire cela, mais je ne sais pas comment utiliser un algorithme de recherche pour trouver un nouveau point lorsque l'ancien point n'est pas ouvert. J'ai lu sur le pathfinding et il semble que je pourrais faire quelque chose de similaire, où j'utiliserais l'algorithme de Dijkstra ou l'algorithme A * pour trouver l'espace ouvert le plus proche. Je ne sais juste pas comment je pourrais faire ça, car je n'ai jamais programmé quelque chose comme ça avant. Désolé de vous déranger, je suis un peu novice en programmation, donc je ne sais pas encore grand-chose.
IronGiraffe

@IronGiraffe - Oh, je vois ce que tu veux dire. Ok, je mettrai à jour ma réponse.
Richard Marskell - Drackir

@IronGiraffe - Mis à jour.
Richard Marskell - Drackir

Mieux vaut faire "regarder si la tuile est ouverte" pendant le chargement de niveau ou la génération et stocker le résultat. Vous devez généralement passer par toutes les tuiles (au moins, toutes les tuiles chargées / visibles si vous faites une évaluation paresseuse) à ce stade de toute façon, ce peu de travail supplémentaire n'a pas d'importance, et les bits de mémoire supplémentaires ne devraient pas avoir d'importance sur la plupart des plates-formes Soit.
Martin Sojka

@Martin - D'après ce que je comprends, le niveau change au fur et à mesure que vous jouez. Regardez la vidéo. Et, je recommande toujours l' option 1 ci - dessus, mais si elles doivent faire la deuxième option, il est seulement un clic il est peu probable que cela causera une notable succès à la performance.
Richard Marskell - Drackir

0

Je pense que vous aurez besoin de trouver le rectangle "libre" le plus proche d'une tuile de chaîne, où le joueur peut s'adapter.

Il y a une question similaire sur stackoverflow. Cliquez pour voir .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.