Pad vinden in een Java 2D Game?

stemmen
6

In wezen is het een pacman kloon spel dat ik mee bezig ben. Ik heb een vijand klasse, en 4 instanties van deze klasse gemaakt die alle vertegenwoordigen 4 spoken van het spel.

Alle geesten opstarten in willekeurige delen van het scherm en dan hebben ze hun weg te werken aan de pacman karakter. Als de speler de pacman bestuurt, rond te bewegen, ze moeten volgen en neem de dichtstbijzijnde mogelijke manier naar hem toe.

Er is geen doolhof / obstakels (nog) niet, zodat de hele kaart (400x400 pixels) is open grond aan hen.

Voor de speler en elke Ghost kan ik de X, Y, beeldbreedte ophalen en hoogtekenmerken. Ook, ik heb al een collision detection-algoritme, dus geen zorgen over dat, net over de geesten vinden hun weg naar pacman.

De vraag is gesteld op 08/03/2009 om 06:14
bron van user
In andere talen...                            


7 antwoorden

stemmen
0

Je zou kunnen beginnen te kijken naar A * (A ster)

En hier is een pagina die links naar andere pad vinden algoritmen heeft.

[bewerken] gah ... hersenen is te traag ... vergat over dit boek, het is C of C ++ (ik vergeet welke), maar je kunt nog steeds de concepten voor Java. Het is misschien niet de makkelijkste voor u om te lezen, maar het is niet slecht in het algemeen. AI voor Game Developers door David M. Bourg, Glenn Seemann .

antwoordde op 08/03/2009 om 06:17
bron van user

stemmen
12

Voor een goede pathfinding algoritme, met behulp van A * zou waarschijnlijk een goed idee zijn, maar voor een eenvoudig spel dat niet verfijnd, efficiënt noch effectief pad zoeken vereist, gewoon met de personages bewegen in de richting van een doel door het vinden van de richting van de het doel moet voldoende zijn.

Bijvoorbeeld, het besluit om het personage te verplaatsen, in pseudocode maken:

if (target is to the left of me):
    move(left);
else
    move(right);

if (target is above me):
    move(up);
else
    move(down);

Ja, het karakter is niet van plan om de meest efficiënte beweging te maken, maar het zal dichter en dichter bij het doel op elke iteratie van het spel lus te krijgen.

Het is ook mijn vermoeden dat een arcadespel uit de vroege jaren '80 waarschijnlijk niet zou worden met behulp van geavanceerde pathfinding algoritmen.

antwoordde op 08/03/2009 om 06:25
bron van user

stemmen
6

Als je gewoon een raster van pixels - een "big field" waarop pacman en ghost kunnen zich vrij bewegen - dan is de kortste weg gemakkelijk - een rechte lijn tussen de geest en de pacman.

Maar "de kortste weg" betekent steevast we proberen om een ​​grafiek-theorie probleem op te lossen. (Ik neem aan dat de kennis van grafieken, sommige grafentheorie, adj. Matrices, etc!)

In het geval hierboven, overwegen elke pixel naar een knooppunt op een grafiek komen. Elk knooppunt is verbonden met zijn buren door een rand, en elke rand heeft gelijk "weight" (overgang naar het knooppunt "boven" niet langzamer beweegt dan het knooppunt "onder").

Dus je hebt dit: ( "*" = knooppunt, "-, /, \, |" = rand)

*-*-*
|\|/|
*-*-*  ... (etc)
|/|\|
*-*-* 

Als pacman ligt in het centrum, kan het heel gemakkelijk naar een ander knooppunt.

Iets dichter bij de werkelijkheid dan kan dit worden:

*-*-*
| | |
*-*-*  ... (etc)
| | |
*-*-* 

Nu, pacman kan niet diagonaal bewegen. Om van het midden naar de rechterbenedenhoek vereist 2 "hop" in plaats van één.

Om de progressie voort te zetten:

*-*-*-*
| | | |
| | | |
| | | |
*-*-*-*
| | | |
*-*-*-*

Nu, om te gaan van een knooppunt in het midden om een ​​knooppunt aan de top, moet je 3 hop. Echter, om te bewegen in de richting van de bodem duurt slechts 1 hop.

Het zou gemakkelijk zijn om een ​​game-board setup te zetten in een grafiek. Elke "kruising" is een knooppunt. Het pad tussen twee snijpunten is een rand en de lengte van die baan is het gewicht van die rand.

Voer A *. Door de aanleg van een grafiek (gebruik een adjency matrix of een lijst van nodes), kunt u de A * algoritme gebruiken om de kortste weg te vinden. Andere algoritmes Dijkstra. En vele anderen! Maar eerst moet u uw probleem in termen van een grafiek, en vervolgens speelgoed omlijsten met hoe je zou gaan van knooppunt A (pacman) naar knooppunt B (spook).

Hoop dat het helpt!

antwoordde op 08/03/2009 om 06:55
bron van user

stemmen
0

Ik denk dat gaan voor de kortste pad algoritme bij elke beweging gemaakt door pacman. Een zeer goede implementatie is Dijkstra's algoritme .

Gewoon om samen te vatten: Visualiseer het doolhof als een grafiek met hoekpunten en randen. Elke rand heeft een wachttijd (in uw geval alle randen hebben hetzelfde gewicht). Het algoritme vindt de kortste pad van bron tot vertice vertice doel door het bewegen een stap naar beneden elk direct bereikbaar rand. Dan op de volgende vertice je hetzelfde doen en blijven doen totdat om u naar het doel. De eerste pad bereikt is de kortste weg. Er kunnen vele optimalisaties gedaan om dit algoritme te versnellen van de dingen als rekening wordt gehouden waar de pacman was in zijn vorige positie en in welke richting het verplaatst, zodat je wat heiristics kunt krijgen in het algoritme. Ik stel voor het vinden van de kortste weg uit elke ghost pacman op elke beweging en beweeg de geest in die richting. Uiteindelijk zal de afstand te verminderen en je in staat om pacman te vangen zal zijn.

Een andere heuristische dat het kan worden gebruikt om alle directe randen bereikbaar vanaf pacman vinden en proberen om zoveel mogelijk van deze hoekpunten mogelijk door geesten te dekken. Dus in plaats van het instellen van pacman als het doel vertice we de hoekpunten immediatetly bereikbaar met pacman als doel, zal het resultaat zijn dat de beschikbare geesten zal proberen te verdoezelen themajor vluchtwegen van pacman en hem te vangen.

antwoordde op 08/03/2009 om 08:26
bron van user

stemmen
3

Het is al een zeer lange tijd, maar het geheugen van de spoken in Pac-Man deed niet veel in de weg van pathfinding. Ze zouden een vrij standaard gerandomiseerde doolhof traversal doen totdat ze "gespot" u, die betrokken het vinden van een vrij pad langs de as van een gang naar u toe, en dan zouden ze direct naar u toe te bewegen totdat u verdwenen uit hun lijn van het zicht, waarna zij zou een willekeurig patroon te hervatten. Op een hoger niveau zou Pac-Man onzichtbare paden achter zich te laten voor een tijdje dat de geesten zou "ruiken" en soms volgen.

Als Pac-Man kreeg een power-up, het enige verschil in het algoritme is dat, als ze je zag, zou de geesten u vlieden plaats van het verplaatsen naar u toe.

Dus, voor een authentieke ervaring, heb je waarschijnlijk niet een zeer geavanceerd pathfinding algoritme nodig hebben. Als je zin hebt om te zijn, natuurlijk, kunt u A * implementeren.

antwoordde op 10/03/2009 om 09:11
bron van user

stemmen
2

Wandelen direct naar je vijanden is een begin, maar als je een doolhof toevoegen je wilt een beetje slimmer pathfinding toevoegen, zodat je spoken niet vast komen te zitten in bochten of doodlopende wegen.

De volgende tutorial is een geweldige lichtgewicht gids aan de slag met A *, met downloadbare voorbeelden.

Maps pad vinden op Tile gebaseerd

antwoordde op 12/03/2009 om 13:42
bron van user

stemmen
1

in Pacman alle van de geest had een ander jagen algoritme

  • Blinky -> chases. Zal meestal de kortste weg naar u, en heeft de neiging om te volgen.
  • Pinky -> hinderlagen. Heeft de neiging om een ​​meer rotonde manier om pac-man te nemen. Dodelijk. (Pink en Blinky hebben de neiging om verschillende keuze te maken bij het kiezen van een richting, vaak kooien de speler in een hoek)
  • Inky -> Freak. Deze kerel gedraagt ​​zich vreemd. Hij beweegt zich over het bestuur vrij willekeurig, maar soms jaagt als hij in de buurt komt.
  • Clyde -> Idiot. Beweegt willekeurig. Niet veel van een bedreiging.

De geesten hebben een interessant patroon geprogrammeerd in hun bewegingen: zo nu en dan, zullen ze tegelijkertijd staken en hun streven naar Pac-Man en terug te keren naar hun respectievelijke hoeken van het doolhof, het invoeren van "scatter mode".

Er is een volledige beschrijving van de algo in de pacman dossier

vriendelijke groeten

Guillaume

antwoordde op 10/04/2009 om 15:59
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more