ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
1034
1034
EMPFEHLEN
-
Hallo,
habe vor einiger Zeit ein kleines Jump'n'Run bzw. Think'n'Run Spiel geschrieben. Ein Eichhörnchen läuft durch den Wald, kann auf Bäume klettern und wie ein Maulwurf in Tunneln laufen. Über meine Map aus tiles habe ich eine durchsichtige Kollisionsmap aus unterschiedlichen Farben gelegt. Vor jeder Bewegung prüfe ich, auf welches Farbfeld das Eichhörnchen tritt und je nach Ergebnis entscheidet sich was passiert.
Die Kodierung:
- schwarz: Bewegung vertikal nach unten (Schwerkraft)
- weiß: Massiv, kann nicht auf weiße Felder laufen
- grün: Kann horizontal und vertikal nach oben und unten laufen
- rot: Tot, beendet level
- pink: Nur passierbar mit Schlüssel (verschlossene Tür)
Dabei messe ich insgesamt 6 Kollionspunkte: links und rechts, je oben, mitte, unten
Meine Kollisionsmethode:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
public void move(long delta) { // Berücksichtigung der Durchlaufzeit (Framerate) garantiert gleichmäßige Bewegung int newX = (int) (x + dx*(delta/1e9)); int newY = (int) (y + dy*(delta/1e9)); int offsetX = (int) (getWidth() * 0.3); int offsetY = 20; // Wenn Koordinaten außerhalb der Map, nimm alten Wert if(newX<0 || newX+getWidth()>parent.getWidth() || newY<0 || newY+getHeight()>parent.getHeight()) return; Color colLT = parent.getMap().getColorForPoint(new Point(newX+offsetX,newY+offsetY)); Color colRT = parent.getMap().getColorForPoint(new Point((int)(newX+getWidth()-offsetX),newY+offsetY)); Color colLM = parent.getMap().getColorForPoint(new Point(newX+offsetX,(int) (newY+(getHeight()/2)))); Color colRM = parent.getMap().getColorForPoint(new Point((int)(newX+getWidth()-offsetX),(int) (newY+(getHeight()/2)))); Color colLB = parent.getMap().getColorForPoint(new Point(newX+offsetX,(int)(newY+getHeight()-10))); Color colRB = parent.getMap().getColorForPoint(new Point((int)(newX+getWidth()-offsetX),(int)(newY+getHeight()-10))); Color colLB2 = parent.getMap().getColorForPoint(new Point(newX+offsetX,(int)(newY+getHeight()-5))); Color colRB2 = parent.getMap().getColorForPoint(new Point((int)(newX+getWidth()-offsetX),(int)(newY+getHeight()-5))); // Wenn Luft unter den Füßen und kein Boden unter den Füßen und oben nichts zum festhalten (hängen bleiben) if(colLB.equals(Color.black) && colRB.equals(Color.black) && !(colLB2.equals(Color.white) || colRB2.equals(Color.white)) /*&& !(colLT.equals(Color.green) && colRT.equals(Color.green))*/) { controlable = false; setPics(bImgNorm); } else { controlable = true; } // Wenn Player sich nicht bewegt if(dx==0 && dy ==0) { setPics(bImgNorm); } if(dy>0) { // Kollisionskontrolle vertikal nach unten // Wenn neue Koordinate über unterem Rand und nicht über weißen Pixeln if(newY+getHeight()<parent.getHeight() && !(colLB.equals(Color.white) || colRB.equals(Color.white))) { y = newY; if(bImgUpDown!=null) setPics(bImgUpDown); } } else if (dy<0) { // Kollisionskontrolle vertikal nach oben // TODO: Bug, Player springt nach oben if(newY>0 && !(colLT.equals(Color.white) || colRT.equals(Color.white)) && !(colLB.equals(Color.black) || colRB.equals(Color.black)) && (colLB.equals(Color.green) && colRB.equals(Color.green) || colLT.equals(Color.blue) || colRT.equals(Color.blue))) { y = newY; if(bImgUpDown!=null) setPics(bImgUpDown); } } // Wenn X nicht über horizontale Ränder geht if(dx>0 && !(colRB.equals(Color.white) || colRM.equals(Color.white)) && (key || !colRB.equals(Color.magenta))) { x = newX; if(bImgRight!=null) setPics(bImgRight); // Geschlossene Tür öffenen if(colLB.equals(Color.magenta)&&key) parent.changeTile(new Point((int) x, (int)y+offsetY), TILE_OPEN_WOODDOOR); // Wenn Kopf rechts oben anstößt, setze automatisch nach unten if(colRT.equals(Color.white)) y += offsetY*0.3; } else if (dx<0 && !(colLB.equals(Color.white) || colLM.equals(Color.white)) && (key || !colLB.equals(Color.magenta))) { x = newX; if (bImgLeft!=null) setPics(bImgLeft); // Geschlossene Tür öffenen if(colLB.equals(Color.magenta)&&key) parent.changeTile(new Point((int) x, (int)y+offsetY), TILE_OPEN_WOODDOOR); // Wenn Kopf links oben anstößt, setze automatisch nach unten if(colLT.equals(Color.white)) y += offsetY*0.3; } // Wenn Player auf Rot tritt, GameOver if(colLB.equals(Color.red) || colRB.equals(Color.red)) { // && !colLT.equals(Color.green) && !colRT.equals(Color.green)) { parent.endGame(false, "Aua******"); } }
Finde die Kollisionskontrolle insgesamt sehr hackelig. Meine Betatester hatten schon bemängelt, das es schwierig ist in horizontale Tunnels zu gehen. Deshalb habe ich nachträglich ein Funktionalität eingebaut, wenn der Kopf oben anstößt, das Eichhörnchen nach unten zu versetzen.
Aber wie kann ich die Funktion insgesamt optimieren?Gründe, warum man seinen Quelltext dokumentieren sollte:
1. Menschen sind unglaublich vergesslich.
2. Menschen sind nicht unsterblich.
3. Programmierer sind auch nur Menschen.
__________________
Die auftretenden Rechtschreib- und/oder Grammatikfehler sind Ausdruck meiner Kreativität im Umgang mit der deutschen Sprache, und werden sogar von Einigen als Markenzeichen angesehen. Dies gilt auch für Verwendung fremdsprachlicher Wörter.
Ähnliche Themen
-
Szene optimieren
Von Marilex im Forum Cinema 4DAntworten: 8Letzter Beitrag: 20.10.10, 08:11 -
«Spline optimieren»
Von Matthias im Forum Cinema 4DAntworten: 6Letzter Beitrag: 02.06.09, 17:23 -
Kollisionskontrolle von gleichen MCs
Von mani00 im Forum Flash PlattformAntworten: 1Letzter Beitrag: 08.09.07, 14:54 -
TCP in der Reg. Optimieren?
Von Devourer im Forum Microsoft WindowsAntworten: 2Letzter Beitrag: 25.04.05, 10:39 -
optimieren
Von webhoster im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 10.03.02, 14:05





Zitieren
Login





