# Männchen sagen, wo es nicht hineinlaufen darf



## thomas.g (30. Mrz 2005)

Hi,

ich hätte da mal eine kurze Frage:







Hier könnt ihr vl ein Bildsehen, welches eine kleine Welt darstellt, und ein Männchen.

*Wie bringe ich jetzt das Männchen am leichtesten dazu, nicht in das Rechteck(dass ein Haus darstellen soll) reinzulaufen?*

Danke, Thomas G


----------



## thomas.g (30. Mrz 2005)

ich habe auf ein schöner gezeichnetes Männchen einen KeyListener gelegt, welcher erlaubt, das Männchen mit den Pfeiltasten zu steuern, doch er müsste bei Berührung des Hauses stehen bleiben!

Doch wie?


----------



## DP (30. Mrz 2005)

da gibt es fertige algorithmen um den kürzesten weg inkl. kollision etc. zu finden. mir fällt das schlagwort für die suche nicht ein...


----------



## thomas.g (30. Mrz 2005)

mhm.......


----------



## DP (30. Mrz 2005)

hier z.b.: http://www.infosun.fmi.uni-passau.de/br/lehrstuhl/Kurse/ea_0102/Kapitel-0+1.pdf

oder such mal nach der heuristischen suche etc...


----------



## Illuvatar (30. Mrz 2005)

das männchen als polygon speichern, das rechteck auch, und mit Polygon#contains(Polygon) prüfen, ob es sich überschneidet.


----------



## 0xdeadbeef (30. Mrz 2005)

Hier gibt's doch gerade in mindestens zwei anderen Threads Diskussionen zu Kollisionsabfragen...


----------



## DarKestSun (31. Mrz 2005)

als autor des kollisions threads kann ich dir schon mal antwort geben.
mein kollision-system funktioniert perfekt, (Netzwerk und schusswaffen mal nicht beachtet   )

erstmal die frage:willst du dieses haus (oder andere maps) selber zeichnen und als bild laden
oder nur in , bsp einem array, speichern?

grundsätzlich gilt folgendes:


```
if (x_männchen > x_haus     &&     x_männchen <x_haus + width_haus){
 //männchen knallt von rechts in das haus

if (x_männchen+width_männchen > x_haus     &&     x_männchen+width_männchen <x_haus + width_haus){
//männchen knallt von links in das haus
```

mit y gilt dasselbe


----------



## thomas.g (31. Mrz 2005)

Danke für die Antwort, ich probiere gerade deine Antwort aus und ein selbst entwickeltes System:

Bei jedem Klick auf die Pfeiltaste geht das Männchen eine Bestimmte Länge weiter, dh man kann ein Netz der Map erstellen, da der Abstand zwischen den X und Y Achsen (Schritten) immer gleich ist!

Dieses Imagienere Netz ist in einem Array String gespeichert:

String[] x;
String[] y;


x sieht dann nach dem Netzsystem so aus:

x[1] = ". . . . . . . . . . . . . . . . . . . . . .";
x[2] = ". . . . . . . . - - - - - - - - . . . . .";

Hierbei symboliesiert der . die Stellen, wo das Männchen gehen darf und der - wo es nicht gehen darf.

je nachdem, in welcher y achse er sich befindet, ruft er eben auf x[y].charAt(schritt);

Ist der Schritt der Punkt, darf er gehen, ansonsten darf er nicht gehen!


..................................


Naja, so habe ich mir das gedacht, und, was sagt ihr dazu?

Außerdem, das Spiel was ich machen will ist ein 2D Spiel, also ähnelt vom aufbau GBA Spiele!


----------



## DarKestSun (3. Apr 2005)

jep so kanns funktionieren, du kannst, wenn du gestattest, auch folgendes probieren:

folgende karte:

.....................----------............
.....................----------............
.....................----------............
.....................----------............


wie auf deiner skizze sind die "-"  stellen die man nicht berühren darf, oben sieht man ein rechteck das nicht berürhrt werden darf.

an deiner stelle würde ich ein array erstellen, und darin die x - u. y- korrdinaten einspeichern, wo ein - ist, d. h.


```
int [] X_Array = {100, 101, 102, 103, 104}
int [] Y_Array = {1, 1, 1, 1, 1}
```

du speicherst praktisch nur die "-" ab, und nicht die ".", obiges heißt, dass "-" an den positionen [100][1], [101][1]... sind 

das erlaubt dann das:


```
for (int i=0; i<X_Array.length; i++){
  if (Männchen.x  ==  X_Array[i]){
    //jetz müsstest du die y - koordinate genau so prüfen, und wenn  Männchen.y == Y_Array[i], dann berührst du    eine stelle
  }
}


so kannst du auch große karten mit 1000 pixeln länge verwenden und hältst die größe der arrays niedrig!!!
```


----------

