# Unpassable Stellen in Karten



## Shiro (23. Okt 2011)

Hallo,

ich beschäftige mich nun seit 1-2 Wochen speziell mit dem Thema Spieleprogrammierung auf 2D Basis.
Jetzt habe ich einfach mal angefangen auf Basis von Quaxlis Tutorial so eine Art von Spiel zu entwickeln, das man vom Kartenprinzip wie viele Gameboy Spiele (z.B. Pokemon) funktionieren soll.
Nun hab ich da eine bereits fertige Karte, wo ich manuell angeben muss wo man hingehen kann oder nicht. Bei mehreren Karten wäre das jetzt sehr aufwendig zu programmieren, vor allem wenn die Karte einmal größer oder kleiner ist, man das Fenster aber nicht vergrößern oder verkleiner möchte, sodass sich die Karte dann verschieben muss und somit die Positionen wieder nicht so richtig stimmen.

Jetzt hätte ich deswegen ein paar Fragen:

1. Welche gängigen Algorithmen gibt es dazu? 
2. Es wäre natürlich auch möglich ein Raster aus der Karte zu machen, wo man dann gehen kann, eben wie z.B. bei Pokemon, sodass man z.B. auf Block xx nicht passierbar ist, oder dass eine Bilddatei mit Pixeln eingelesen wird, bei denen dann proportional zur Karte überprüft wird, wenn das Pixelfeld weiß ist, nicht passierbar, wenn braun dann schneller laufen, schwarz normal passierbar etc.
Hier habe ich jedoch keinen Plan wie ich das programmieren könnte, gibt es zu diesen Algorithmen irgendwo Tutorials/Tipps, bzw. mit was werden die gemacht, irgendein Ansatz würde mir schon reichen^^
3. Im profesionellen Bereich wird das vermutlich dann ein bisschen anders programmiert, hier könnte ich mir vorstellen, dass nur das Grundgerüst der Karte als Hintergrundbild dient, und dann das Bild eines Hauses, wo man nur von vorne reingehen kann oder eines Zaunes, der natürlich nicht passierbar ist dann im Programmcode eingefügt wird. Liege ich da richtig?

Wäre nett, wenn mir ein erfahrener Java-Programmierer die 3 Fragen beantworten könnte


----------



## yyannekk (23. Okt 2011)

1. Ich glaube der Algorithmus von Dijkstra ist der bekannteste, und wird glaube ich auch oft verwendet.

2. Ich weiß nicht ob es dafür typische Lösungen gibt, aber ich zB habe es in einem Spiel in etwa so gemacht wie du dir das denkst... Dabei ist das Spielfeld ein BufferedImage, und immer wenn eine Figur bewegt wird, wird auf dem Zielfeld die Farbe überprüft (mit img.getRGB(x,y) und dem entsprechend bewegt, oder eben nicht...
In einem anderen Spiel habe ich es im Prinziep mit zwei "Ebenen" realisiert: Das Spielfeld wird zufällig generiert, wobei jeder Feld-Typ gespeichert wird. Wenn dann eine Figur bewegt wird, wird nicht "oben" in der Grafik selber geschaut, sondern "unten" wo alle Feldtypen in einem 2 dimensionalen Array liegen (hierfür muss halt deine Karte eine Art Rasterform haben, wie bei Schach).
Ich denke dass das ein guter Ansatz ist, da hier Spielmechanik und Grafik besser getrennt sind.
Ansonsten würde ich mir einfach auch selber (mehr) Gedanken machen. Das ist ja das eigntlich spaßige am Programmieren..

3. Ja denke schon. Kuckstuhier: Model View Controller. Man sollte eben Grafik, Spielmechanik, und Steuerung trennen. Dann kannst du Grafiksachen verändern ohne dein Spiel zu ändern. D.h. wenn dein Spiel schon funktioniert, kann es plötzlich nicht aufhöhren zu funktionieren, nur weil du im Grafik Modul rumwerkst...


----------



## Marcinek (23. Okt 2011)

> 1. Ich glaube der Algorithmus von Dijkstra ist der bekannteste, und wird glaube ich auch oft verwendet.



Da ich keine Spiele programmiere und auch noch nie was damit zu tun hatte, kann ich die übrigen Fragen nicht perfekt beantworten. Aber wie bitte passt hier Dijkstra zu der Erkennung von Flächen, die passierbar sind und welche nicht? - Das ist ein Algo um kürzeste Pfade in einem Graphen zu berechnen -.-

--

MVC kann man auch überall als Antwort nennen, aber hier denke ich ist das Problem ein anderes.

Du hast eine Fläche, auf der bestimmte Felder unpassierbar sind. Ein naiver Ansatz wäre es nun ein Array zu bauen mit 1 und 0. Dann wäre 1 passierbar und 0 nicht.

Deine Figur hat nun koordinaten x und y. Wenn ich nun pfeil nach oben Drücke, dann ändert sich die y koordinate +1. Vorher prüfe ich, ob das Feld bei x, y+1 eine 1 oder 0 hat. Bei 1 führe ich die Aktion aus, sonst nicht.

Gruß,

Martin


----------

