Hallo,
ich muss mal wieder um eure Hilfe bitten bei einem Problem, das wies aussieht aber eher mathematisch bedingt ist als java-technisch. Ich habe dazu nun schon sehr viel Recherche betrieben
aber konnte nirgends was zu meinem Problem finden.
Ich habe eine völlig normale Tilemap, die anhand einer Map-Matrix gezeichnet wird, also:
map[breite][höhe][ebene]
Diese zeichne ich also in einer verschachtelten for-schleife, klappt auch alles prima,
aber die Probleme treten dann bei der Kollision auf.
Vereinfacht beschreibe ich das ganze mal mit einer einzelnen nicht-begehbaren Grafik:
Ich überprüfe also, ob diese Grafik sich über den Spieler befindet, links von ihm, rechts von ihm
oder unter ihm, was Dank der Map-Matrix ja eigentlich kein Problem darstellen sollte:
Beim ersten mal traten dabei schon einmal Probleme mit der Abfrage nach links und oben auf;
die Spielerfigur hat viel zu früh aufgehört sich zu bewegen, was höchstwahrscheinlich mit
Ungenauigkeiten bei der Teilung zu tun hat. Ich habe mir die Werte ausgeben lassen und musste
dann feststellen, dass die Nachkommastellen wegen des Datentyps int abgetrennt werden und
somit schon viel früher davon ausgegangen wird, dass sich die Spielfigur in einem Feld weiter oben
bzw. links befindet.
Um den zu entgehen habe ich links bei der X-Koordinate und oben bei der Y-Koordinate den Wert
32-4 hinzuaddiert, der sich scheinbar aus der Größe eines Tiles - dem Bewegungstempo ergibt.
Das behebt die Kollisionsprobleme links und über der Spielfigur, aber unabhängig davon tereten noch
an anderen Stellen Probleme mit der Kollision auf für die ich nun schon seit mehreren Stunden keine
Lösung finde... hierzu dieses Bild
ImageShack® - Online Photo and Video Hosting
Sagen wir die Lücke befindet sich an Stelle 6/1 in der Matrix.
Die Spielfigur bewegt sich geradlinig nach rechts (Kollision nach unten und oben funktioniert, wie gesagt). Jetzt kann sich die Spielfigur erst nach unten bewegen, wenn für den Wert SpielerX/32
genau 6.0 rauskommt. Leider aber auch für alles darüber - bewegen soll sie sich aber nun mal nur
bei 6.0.
In diesem Beispiel stoppt die Figur bei allem über 6.0, es scheint also schon fast richtig zu sein,
aber irgendwo ist noch ein Fehler. Was mich am meisten verwundert ist, dass ich hier nun
in der Tastaturabfrage nicht den Wert 32-4 addiere. Tu ich es verschiebt sich diese 'Kollisionslücke'
auf die linke Seite - es klappt dann rechts, aber links nicht.
Vielen Dank schon einmal an die, die sich die Mühe gemacht haben bis hierhin zu lesen. Sollte
irgendetwas unklar sein möchte ich mich entschuldigen - aber ich finde einfach nicht den Fehler
in meiner Logik.
Grüße, JTryn
ich muss mal wieder um eure Hilfe bitten bei einem Problem, das wies aussieht aber eher mathematisch bedingt ist als java-technisch. Ich habe dazu nun schon sehr viel Recherche betrieben
aber konnte nirgends was zu meinem Problem finden.
Ich habe eine völlig normale Tilemap, die anhand einer Map-Matrix gezeichnet wird, also:
map[breite][höhe][ebene]
Diese zeichne ich also in einer verschachtelten for-schleife, klappt auch alles prima,
aber die Probleme treten dann bei der Kollision auf.
Vereinfacht beschreibe ich das ganze mal mit einer einzelnen nicht-begehbaren Grafik:
Ich überprüfe also, ob diese Grafik sich über den Spieler befindet, links von ihm, rechts von ihm
oder unter ihm, was Dank der Map-Matrix ja eigentlich kein Problem darstellen sollte:
Java:
if (map_mov[map[(px+32-movspeed)/32-1][py/32][0]] == false){
move_left = false;
}
if(map_mov[map[px/32+1][py/32][0]] == false){
move_right = false;
}
if(map_mov[map[px/32][py/32+1][0]] == false){
move_down = false;
}
if(map_mov[map[px/32][(py+32-movspeed)/32-1][0]] == false){
move_up = false;
}
//Bewegung
if (move_right){
px+=movspeed;
}else if(move_left){
px-=movspeed;
}else if(move_down){
py+=movspeed;
}else if(move_up){
py-=movspeed;
}
//Tastaturabfrage
switch (ke.getKeyCode()) {
case KeyEvent.VK_RIGHT: {
move_right = true;
if (move_up != true && move_down != true || map_mov[map[px/32+1][py/32][0]] != false ){
move_left = false;
move_up = false;
move_down = false;
}
}
break;
case KeyEvent.VK_LEFT: {
move_left = true;
if (move_up != true && move_down != true || map_mov[map[px/32-1][py/32][0]] != false){
move_right = false;
move_down = false;
move_up = false;
}
}
break;
case KeyEvent.VK_DOWN: {
move_down = true;
if (move_left != true && move_right != true || map_mov[map[px/32][py/32+1][0]] != false){
move_left = false;
move_right = false;
move_up = false;
}
}
break;
case KeyEvent.VK_UP: {
move_up = true;
if (move_left != true && move_right != true || map_mov[map[px/32][py/32-1][0]] != false){
move_down = false;
move_left = false;
move_right = false;
}
}
break;
}
}
Beim ersten mal traten dabei schon einmal Probleme mit der Abfrage nach links und oben auf;
die Spielerfigur hat viel zu früh aufgehört sich zu bewegen, was höchstwahrscheinlich mit
Ungenauigkeiten bei der Teilung zu tun hat. Ich habe mir die Werte ausgeben lassen und musste
dann feststellen, dass die Nachkommastellen wegen des Datentyps int abgetrennt werden und
somit schon viel früher davon ausgegangen wird, dass sich die Spielfigur in einem Feld weiter oben
bzw. links befindet.
Um den zu entgehen habe ich links bei der X-Koordinate und oben bei der Y-Koordinate den Wert
32-4 hinzuaddiert, der sich scheinbar aus der Größe eines Tiles - dem Bewegungstempo ergibt.
Das behebt die Kollisionsprobleme links und über der Spielfigur, aber unabhängig davon tereten noch
an anderen Stellen Probleme mit der Kollision auf für die ich nun schon seit mehreren Stunden keine
Lösung finde... hierzu dieses Bild
ImageShack® - Online Photo and Video Hosting
Sagen wir die Lücke befindet sich an Stelle 6/1 in der Matrix.
Die Spielfigur bewegt sich geradlinig nach rechts (Kollision nach unten und oben funktioniert, wie gesagt). Jetzt kann sich die Spielfigur erst nach unten bewegen, wenn für den Wert SpielerX/32
genau 6.0 rauskommt. Leider aber auch für alles darüber - bewegen soll sie sich aber nun mal nur
bei 6.0.
In diesem Beispiel stoppt die Figur bei allem über 6.0, es scheint also schon fast richtig zu sein,
aber irgendwo ist noch ein Fehler. Was mich am meisten verwundert ist, dass ich hier nun
in der Tastaturabfrage nicht den Wert 32-4 addiere. Tu ich es verschiebt sich diese 'Kollisionslücke'
auf die linke Seite - es klappt dann rechts, aber links nicht.
Vielen Dank schon einmal an die, die sich die Mühe gemacht haben bis hierhin zu lesen. Sollte
irgendetwas unklar sein möchte ich mich entschuldigen - aber ich finde einfach nicht den Fehler
in meiner Logik.
Grüße, JTryn