📄 platformgamebasicsdeu.html
字号:
public static final String row25 = "ggggggggggggggggggggggggggggggggggggggggggg";<br>
</code>
<p align="justify">Es ist also wie man sieht sehr einfach ein neues Level zu definieren. Wie wird nun diese einfache Repräsentation in die interne Datenstruktur übersetzt? Diese Methode findet sich in der Klasse Level und zwar dort in der Methode initializeLevel(String [] definitions). Sie parst die Definitionsstrings und erzeugt zunächst ein zweidimensionales Array, in dem die Levelelemente an den gleichen Positionen wie in den Strings gespeichert werden. Dieses 2D - Array wird hauptsächlich für die Kollisionskontrolle verwendet. Anschließend werden die Refferenzen aller Levelelemente im 2D - Array auch noch in ein 1D - Array kopiert. Dies geschieht ausschließlich aus Effizienzgründen beim Zeichen und Scrollen des Levels.</p>
// Leveldefinitionsstrings parsen und in erzeugten Levelelemente in 2D - Array bzw.<br>
// auch in Kopie 1D - Array speichern<br>
public void initializeLevel(String [] definitions)<br>
{<br>
<ul>
// Kollisionsarray initialisieren<br>
collision_array = new LevelElement [C_Jump.number_of_level_lines] [definitions[0].length()];<br><br>
// Einige Leveldaten initialisieren: Länge des Levels, rechte und linke Grenze<br>
level_length = definitions[0].length() * C_Jump.level_element_width;<br>
left_level_border = 0;<br>
right_level_border = C_Jump.applet_width;<br><br>
// Zähler für die Anzahl der verwendeten Levelelemente (wichtig für<br> // Initialisierung des 1D - Arrays<br>
int elements_counter = 0;<br><br>
// Iteriere über alle Strings im Definitionsarray<br>
for(int i=0; i<definitions.length; i++)<br>
{<br>
<ul>
// Erzeugen eines Char - Arrays aus dem String<br>
char [] definition_line = definitions[i].toCharArray();<br><br>
for(int j=0; j<definition_line.length; j++)<br>
{<br>
<ul>
// Übersetzen der einzelnen Buchstaben in LevelElemente<br>
if(definition_line[j] == ':')<br>
{<br>
<ul>collision_array[i][j] = null;</ul>
}<br>
// Erzeugung eines Gound - Elements<br>
else if(definition_line[j] == 'g')<br>
{<br>
<ul>
// Wichtig: die Position im Array (i, j) wird in eine<br>
// konkrete Position übersetzt (die erste zwei Konstruktorvariablen)<br>
Ground element = new Ground(j*C_Jump.level_element_width,<br>
<ul>i*C_Jump.level_element_height, ground, parent, C_Jump.ground_id);</ul><br>
// Element in Kollisionsarray speichern<br>
collision_array[i][j] = element;<br><br>
// Elementcounter erhöhen<br>
elements_counter ++;</ul>
}<br>
</ul>
}<br>
</ul>
}<br><br>
// Übertrage die Leveldefinitionen in ein eindimensionales Array<br>
// Code weggelassen, da hier außer dem Kopieren nichts besonderes passiert
</ul>
}
<h4>Die Kollisionskontrolle zwischen Player und LevelElementen</h4>
<p align="justify">Kommen wir nun zum letzten Punkt in diesem Kapitel und gleichzeitig auch dem umfassensten Punkt. Denn alle bisher besprochenen Dinge sind bei der Kollisionskontrolle relevant, vor allem die Bewegungskontrolle des Spielers und die interne Repräsentation des Levels. <br>
Die Idee zur Kollisionskontrolle ist nun folgende: Da das Level intern als zweidimensionales Array repräsentiert wird müssen wir "nur" die Position des Spielers im Array bestimmen (also die x - und y - Koordinaten des Spielers in Arrayzeile und -spalte umrechnen) und sehen, ob sich über, unter, links und rechts des Spielers ein Levelelement befindet. Ist dies der Fall, so müssen wir die Bewegung des Spielers in diese Richtung stoppen, also die Bewegungsflags des Spielers entsprechend verändern. Dazu habe ich mehrere Methoden implementiert. Die Methode <b>testForPlayerCollisions()</b> ist für die Hauptkontrolle der Kollisionskontrolle zuständig, testet also für alle möglichen Fälle (oben, unten, ...) ob eine Kollision stattgefunden hat und entscheidet gegebenenfalls, was in dieser Situation zu tun ist. Denn je nach Element, mit dem unsere Spielfigur da kollidiert ist, muss sich ja etwas tun (Punkte hinzuzählen, Bewegung stoppen...). Des weiteren existieren vier Methoden (<b>testCollisionUp</b>, <b>-Down</b>, ...), die für eine gegebene Position des Spielers einen Lookup in der zweidimensionalen Matrix des Levels machen und gegebenenfalls das Levelelement für die gewünschte Position oder null zurückgeben. Hier kommt schon mal der Sourcecode für die Methode testForPlayerCollisions(Player player) sowie für die Methode testCollisionDown (repräsentativ für die Methoden, die die LevelElemente an der gegebenen Spielerposition zurückgeben).</p>
// Methode testet nach Kollisionen des Spielers mit LevelElementen<br>
public void testForPlayerCollisions(Player player)<br>
{<br>
<ul>
// Bestimmte Positionswerte des Spielers holen<br>
int player_game_pos = player.getGameXPosition();<br>
int player_down_pos = player.getYPosDown();<br>
int player_up_pos = player.getYPosUp();<br><br>
int player_left = player_game_pos - (C_Jump.player_image_width/2);<br>
int player_right = player_game_pos + (C_Jump.player_image_width/2);<br><br>
// Teste nach Kollisionen unter dem Spieler<br>
LevelElement down_element = testCollisionDown(player_game_pos, player_down_pos);<br><br>
// Spieler fällt nicht, wenn ein Element unter ihm ist<br>
if(down_element != null)<br>
{<br>
<ul>player.playerFall(false);</ul>
}<br>
// ansonsten fällt der Spieler<br>
else<br>
{<br>
<ul>player.playerFall(true);</ul>
}<br><br>
// Teste nach Kollisionen oberhalb des Spielers (wichtig für Springen)<br>
LevelElement upper_element = testCollisionUp(player_game_pos, player_up_pos);<br><br>
// stoppe Springen wenn nötig<br>
if(upper_element != null)<br>
{<br>
<ul>player.playerJump(false);</ul>
}<br><br>
// Teste nach Kollisionen links des Spielers<br>
LevelElement left_element = testCollisionLeft(player_left, player_down_pos);<br><br>
// stoppe gegebenenfalls Bewegung nach links<br>
if(left_element != null)<br>
{<br>
<ul>player.playerWalkLeft(false);</ul>
}<br><br>
// Teste nach Kollisionen rechts des Spielers<br>
LevelElement right_element = testCollisionRight(player_right, player_down_pos);<br><br>
// stoppe gegebenenfalls Bewegung nach rechts<br>
if(right_element != null)<br>
{<br>
<ul>player.playerWalkRight(false);</ul>
}<br>
</ul>
}<br><br>
// Methode testet nach Kollisionen unten und liefert gegebenenfalls das Levelelemet zurück<br>
public LevelElement testCollisionDown(int game_pos, int player_y_down)<br>
{<br>
<ul>
// Übersetze die Spielerpositionen in Zeilen und Spalten des 2D - Arrays<br>
int col = game_pos / C_Jump.level_element_width;<br>
int row = player_y_down / C_Jump.level_element_height;<br><br>
try<br>
{<br>
<ul>
// Liefere Element an dieser Stelle oder null zurück<br>
if(collision_array[row][col] != null)<br>
{<br>
<ul>return collision_array[row][col];</ul>
}<br>
else<br>
{<br>
<ul>return null;</ul>
}<br>
</ul>
}<br>
catch (ArrayIndexOutOfBoundsException ex)<br>
{<br>
<ul>return null;</ul>
}<br>
</ul>
}<br>
<h3>Geschafft!</h3>
<p align="justify">So, damit möchte ich dieses Kapitel beschließen und hoffe, dass ich euch ein wenig weiterhelfen konnte. Mir ist klar, dass dieses Kapitel nicht einfach war und ist (weder für mich zu schreiben noch für euch um es zu verstehen), aber es handelt sich hier halt auch um ein etwas schwierigeres und komplexeres Thema. Außerdem würde ich mich über Feedback zu diesem Kapitel sehr freuen, da ich nicht so gut einschätzen kann, wo noch Schwachpunkte liegen, die man vielleicht noch besser erklären könnte. Schreibt mir doch einfach mal eure Meinung dazu! Ansonsten gibts wie immer den Sourcecode zum runterladen und das Beispielapplet zum ansehen (könnt aber auch genausogut <a href="Applets/Games/JrioGame/Jrio.html">J-Rio</a> spielen, da dieses Spiel zumindest in Grundzügen so implementiert ist, wie ich es gerade vorgestellt habe) und ich wünsche euch viel Spaß bei der Entwicklung eurer eigenen Platformspiele!</p>
<a href="SourceCodes/PlatformGameBasics/PlatformGameBasics.zip">Sourcecode runterzuladen</a><br>
<a href="Applets/PlatformGameBasics/PlatformGameBasics.html">Applet ansehen</a>
<!-- InstanceEndEditable -->
</div>
</td>
</tr>
<tr>
<td colspan="11" style="background-color:#990000" align="center">
<table width="100%" style="padding:0"><tr>
<td width="88" bgcolor="#993300"><div align="center" style="font-size:10px; color: #FFFFFF;"> <a href="#top"> to top </a></div></td>
<td><div align="center" style="font-size:10px; color: #FFFFFF;">
<a href="mailto:javacooperation@gmx.de">Fabian Birzele</a>, 2001-2004.<br>
web-design: <a href="http://www.freehand.str.ru/">Vadim Murzagalin</a>, 2004.
</div></td>
<td width="88">
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
<!-- InstanceEnd --></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -