⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platformgamebasicsdeu.html

📁 java tutorial all about java game design
💻 HTML
📖 第 1 页 / 共 3 页
字号:
  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&auml;sentation in die interne Datenstruktur &uuml;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&auml;chst ein zweidimensionales Array, in dem die Levelelemente an den gleichen Positionen wie in den Strings gespeichert werden. Dieses 2D - Array wird haupts&auml;chlich f&uuml;r die Kollisionskontrolle verwendet. Anschlie&szlig;end werden die Refferenzen aller Levelelemente im 2D - Array auch noch in ein 1D - Array kopiert. Dies geschieht ausschlie&szlig;lich aus Effizienzgr&uuml;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&auml;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&auml;hler f&uuml;r die Anzahl der verwendeten Levelelemente (wichtig f&uuml;r<br>                      // Initialisierung des 1D - Arrays<br>
          int elements_counter = 0;<br><br>

          // Iteriere &uuml;ber alle Strings im Definitionsarray<br>
          for(int i=0; i&lt;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&lt;definition_line.length; j++)<br>
                  {<br>
                          <ul>
                          // &Uuml;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 &uuml;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&ouml;hen<br>
                                  elements_counter ++;</ul>
                          }<br>
                          </ul>
                  }<br>
                  </ul>
          }<br><br>

          // &Uuml;bertrage die Leveldefinitionen in ein eindimensionales Array<br>
          // Code weggelassen, da hier au&szlig;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&auml;sentation des Levels. <br>
  Die Idee zur Kollisionskontrolle ist nun folgende: Da das Level intern als zweidimensionales Array repr&auml;sentiert wird m&uuml;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 &uuml;ber, unter, links und rechts des Spielers ein Levelelement befindet. Ist dies der Fall, so m&uuml;ssen wir die Bewegung des Spielers in diese Richtung stoppen, also die Bewegungsflags des Spielers entsprechend ver&auml;ndern. Dazu habe ich mehrere Methoden implementiert. Die Methode <b>testForPlayerCollisions()</b> ist f&uuml;r die Hauptkontrolle der Kollisionskontrolle zust&auml;ndig, testet also f&uuml;r alle m&ouml;glichen F&auml;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&auml;hlen, Bewegung stoppen...). Des weiteren existieren vier Methoden (<b>testCollisionUp</b>, <b>-Down</b>, ...), die f&uuml;r eine gegebene Position des Spielers einen Lookup in der zweidimensionalen Matrix des Levels machen und gegebenenfalls das Levelelement f&uuml;r die gew&uuml;nschte Position oder null zur&uuml;ckgeben. Hier kommt schon mal der Sourcecode f&uuml;r die Methode testForPlayerCollisions(Player player) sowie f&uuml;r die Methode testCollisionDown (repr&auml;sentativ f&uuml;r die Methoden, die die LevelElemente an der gegebenen Spielerposition zur&uuml;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&auml;llt nicht, wenn ein Element unter ihm ist<br>
          if(down_element != null)<br>
          {<br>
                  <ul>player.playerFall(false);</ul>
          }<br>
          // ansonsten f&auml;llt der Spieler<br>
          else<br>
          {<br>
                  <ul>player.playerFall(true);</ul>
          }<br><br>

          // Teste nach Kollisionen oberhalb des Spielers (wichtig f&uuml;r Springen)<br>
          LevelElement upper_element = testCollisionUp(player_game_pos, player_up_pos);<br><br>

          // stoppe Springen wenn n&ouml;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&uuml;ck<br>
  public LevelElement testCollisionDown(int game_pos, int player_y_down)<br>
  {<br>
          <ul>
          // &Uuml;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&uuml;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&ouml;chte ich dieses Kapitel beschlie&szlig;en und hoffe, dass ich euch ein wenig weiterhelfen konnte. Mir ist klar, dass dieses Kapitel nicht einfach war und ist (weder f&uuml;r mich zu schreiben noch f&uuml;r euch um es zu verstehen), aber es handelt sich hier halt auch um ein etwas schwierigeres und komplexeres Thema. Au&szlig;erdem w&uuml;rde ich mich &uuml;ber Feedback zu diesem Kapitel sehr freuen, da ich nicht so gut einsch&auml;tzen kann, wo noch Schwachpunkte liegen, die man vielleicht noch besser erkl&auml;ren k&ouml;nnte. Schreibt mir doch einfach mal eure Meinung dazu! Ansonsten gibts wie immer den Sourcecode zum runterladen und das Beispielapplet zum ansehen (k&ouml;nnt aber auch genausogut <a href="Applets/Games/JrioGame/Jrio.html">J-Rio</a> spielen, da dieses Spiel zumindest in Grundz&uuml;gen so implementiert ist, wie ich es gerade vorgestellt habe) und ich w&uuml;nsche euch viel Spa&szlig; 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 + -