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

📄 daserstespieldeu.html

📁 java tutorial all about java game design
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<html><!-- InstanceBegin template="/Templates/template.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<!-- InstanceBeginEditable name="doctitle" -->
<title>Java Cooperation: our first game</title>
<!-- InstanceEndEditable --><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link href="jc_style.css" rel="stylesheet" type="text/css">
<script src="klayers.js"></script>

<script>

function cancelCloseMenu(){
        if(self.tm) clearTimeout(tm) // cancel delayed closing
}

function showMenu(){
        if(!self.menu || !self.submenu){
                menu=layer("menulayer")
                submenu=layer("submenulayer")
        }

        cancelCloseMenu()

        submenu.moveTo(menu.getAbsoluteLeft(), menu.getAbsoluteTop() + menu.getHeight()) // move second menu relatively
        submenu.show()
}

function initiateHideMenu(){
        tm=setTimeout("hideMenu()",400) // 1 second delay to close a submenu
}

function hideMenu(){
        submenu.hide()
}

</script>

<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable -->
</head>
<body bgcolor="#ffffff" leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
<div align="center">
  <a name="top"></a>
  <table bgcolor="#737373" border="0" cellpadding="0" cellspacing="0" width="618">
  <tr>
<td rowspan="8" bgcolor="#000000"><img src="Pics/spacer.gif" width="1" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="131" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="13" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="58" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="94" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="81" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="48" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="23" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="38" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="19" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="108" height="1" border="0" alt=""></td>
   <td bgcolor="#000000"><img src="Pics/spacer.gif" width="5" height="1" border="0" alt=""></td>

  </tr>

  <tr>
   <td rowspan="5"><a href="index.html"><img name="fab_r1_c1" src="Pics/fab_r1_c1.gif" width="131" height="71" border="0" alt="Java cooperation home"></a></td>
   <td rowspan="6" bgcolor="#737373"></td>
   <td colspan="9" height="15" bgcolor="#737373"></td>
   <td rowspan="8" bgcolor="#000000"><img src="Pics/spacer.gif" width="1" height="1" border="0" alt=""></td>
  </tr>
  <tr>
   <td colspan="5"><div class="colontitul"><!-- InstanceBeginEditable name="Colontitul" -->Tutorial<!-- InstanceEndEditable --></div></td>
   <td colspan="2" bgcolor="#737373"><img name="fab_r2_c8" src="Pics/fab_r2_c8.gif" width="57" height="19" border="0" alt="type and press Enter"></td>
   <td colspan="2">
<FORM method=GET action="http://www.google.com/search">
<TABLE bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" height="10px"><tr>
<td height="10" valign="middle">
<INPUT TYPE=text name=q size=18 maxlength=60 value="" style="font-size:12px; color:#000000; border-width: 0px;">
<input type=hidden name=domains value="http://javacooperation.gmxhome.de/">
<input type=hidden name=sitesearch value="http://javacooperation.gmxhome.de/" checked>
</td></tr></TABLE>
</td>
</form>
   <td><img src="Pics/spacer.gif" width="1" height="19" border="0" alt=""></td>
  </tr>
  <tr>
   <td colspan="9" bgcolor="#666666"><img name="fab_r3_c3" src="Pics/fab_r3_c3.gif" width="474" height="8" border="0" alt=""></td>
   <td><img src="Pics/spacer.gif" width="1" height="8" border="0" alt=""></td>
  </tr>
  <tr>
   <td colspan="6"><a href="TutorialStartDeu.html"><img src="Pics/deupanel_01.gif" width="56" height="22" border="0"></a><a href="OnlineSpieleStartDeu.html"><img src="Pics/deupanel_02.gif" width="94" height="22" border="0"></a><a href="DownloadsDeu.html"><img src="Pics/deupanel_03.gif" width="76" height="22" border="0"></a><a href="LinksDeu.html"><img src="Pics/deupanel_04.gif" width="52" height="22" border="0"></a><a href="KontaktDeu.html"><img src="Pics/deupanel_05.gif" width="64" height="22" border="0"></a></td>
   <td><img name="fab_r4_c9" src="Pics/fab_r4_c9.gif" width="19" height="22" border="0" alt=""></td>
   <td width="108" height="22" bgcolor="#666666"><div align="center"><span id="menulayer" style="position: relative; background-color:#666666; width:108; height:20; vertical-align:baseline; border:1px solid #FFFFFF"><a href="#" class="text" onmouseover="showMenu(); return true" onmouseout="initiateHideMenu(); return true">Select language</a></span>
   </div>
     <div id="submenulayer" style="position: absolute; visibility: hidden; background-color: #666666; width:108px;">
         <div class="text" style="border:1px solid #FFFFFF; border-top-width:0; padding:5px">
<a href="#" onmouseover="cancelCloseMenu(); return true" onmouseout="initiateHideMenu(); return true">German</a><br>
<a href="indexEng.html" onmouseover="cancelCloseMenu(); return true" onmouseout="initiateHideMenu(); return true">English</a><br>
<a href="http://javacooperation.dev.juga.ru/index.html" onmouseover="cancelCloseMenu(); return true" onmouseout="initiateHideMenu(); return true">Russian</a>
</div>
</div>
</td>
   <td><img name="fab_r4_c11" src="Pics/fab_r4_c11.gif" width="5" height="22" border="0" alt=""></td>
   </tr>
  <tr>
   <td colspan="9"><img name="fab_r5_c3" src="Pics/fab_r5_c3.gif" width="474" height="7" border="0" alt=""></td>
  </tr>
<tr>
<td colspan="11" style="padding:18; background-color:#333333; vertical-align:top;">
<div class="text">
  <!-- InstanceBeginEditable name="EditRegion" -->
  <h2>Die Entwicklung unseres ersten Spiels</h2>
  <h3>Die Spielidee</h3>
  <p align="justify">In unserem Spiel soll der Spieler zwei B&auml;lle (einen roten und einen blauen), die sich, per Zufallsgenerator bestimmt, in verschiedene Richtungen bewegen, durch einen Mausklick auf den Ball abschie&szlig;en. L&auml;&szlig;t der Spieler einen Ball aus dem Spielfeld fliegen, ohne ihn getroffen zu haben, so verliert er eines von anfangs 10 Leben. Trifft er den Ball, so erh&auml;lt er eine gewisse Zahl von Punkten (abh&auml;ngig von der Geschwindigkeit des Balles) und ein neuer Ball erscheint auf dem Spielfeld. Das Spiel soll au&szlig;erdem Sounddateien bei einem Schuss, bei einem Treffer und wenn ein Ball das Spielfeld verlassen hat abspielen.</p>
  <h3>Die verwendeten Klassen und ihre Methoden</h3>
  <h5>Die Klasse Main</h5>
  <p align="justify">In dieser Klasse sollen alle Methoden, die das Applet und die Animation direkt betreffen, implementiert werden. Dazu geh&ouml;ren die Methoden init(), start(), stop(), paint(), update(), run() und die mouseDown() - Methode zum Auffangen von Benutzerereignissen. Die Klasse verwaltet zudem alle f&uuml;r das Spiel n&ouml;tigen Objekte (zwei Ball Objekte und ein Spieler Objekt) sowie den Thread.</p>
  <ol start="1" type="1">
  <li>init(): In ihr werden alle Objekte initialisiert, die Audiodateinen geladen, der Mauscursor bestimmt und zudem wird die Geschwindigkeit des Spiels mit Hilfe eines Parameters von der HTML - Seite an das Applet &uuml;bergeben</li>
  <li>start(): Startet den Thread</li>
  <li>stop(): Stopt den Thread</li>
  <li>run(): Bewegt die beiden B&auml;lle</li>
  <li>paint(...): Zeichnet die beiden B&auml;lle sowie Punkte und Leben des Spielers. Ist das Spiel beendet, so wertet sie das Ergebniss und zeichnet die Bewertung auf den Bildschirm</li>
  <li>update(...): Realisiert die Doppelpufferung</li>
  <li>mouseDown (...): H&ouml;rt auf die Mausklicks des Benutzers. L&auml;uft das Spiel, so testet sie nach einem Mausclick, ob einer der beiden B&auml;lle getroffen wurde oder nicht. Ist das Spiel beendet oder wurde die Seite gerade neu geladen, so kann f&auml;ngt sie einen Doppelclick des Benutzers auf und startet somit das Spiel.</li>
  </ol>
  <h5>Die Klasse Player</h5>
  <p align="justify">Diese Klasse verwaltet Punktestand und Leben des Spielers. Dazu verf&uuml;gt sie &uuml;ber die Methoden getScore() und getLives(), die die aktuellen Werte an die Main - Klasse &uuml;bergeben, ebenso wie die addScore(int plus) und looseLife() - Methoden, mit denen man Leben abziehen und Punkte hinzuf&uuml;gen kann.</p>
  <h5>Die Klasse Ball</h5>
  <p align="justify">Diese Klass enth&auml;lt die kompliziertesten Methoden des Spiels. Sie definiert alle wichtigen Funktionen eines Ball Objektes. Diese sind:</p>
  <ol start="1" type="1">
  <li>Ball(...): In der Konstruktormethode werden alle relevanten Daten (Farbe des Balles, Bewegungsrichtung ...) an das Ball Objekt &uuml;bergeben</li>
  <li>move(): Diese Methode bewegt den Ball und testet durch den Aufruf von isOut() ob sich der Ball im Aus befindet</li>
  <li>ballWasHit(): Diese Methode wird aufgerufen, wenn der Ball getroffen worden ist. Der Ball wird daraufhin auf seinen Startpunkt zur&uuml;ckgesetzt, die Richtung der Flugbahn neu bestimmt</li>
  <li>userHit (int x, int y): Diese Methode testet mit Hilfe des Skalarproduktes (Details folgen sp&auml;ter) ob der Ball bei einem Klick des Spielers getroffen wurde oder nicht</li>
  <li>isOut(): Diese Methode testet, ob der Ball nach einer Bewegung im Aus ist oder nicht. Ist dies der Fall, so verliert der Spieler ein Leben.</li>
  <li>DrawBall(Graphics g): Diese Methode zeichnet den Ball und wird in jedem Threaddurchlauf von der paint() - Methode der Main - Klasse aufgerufen</li>
  </ol>
  <h5>Zusammenspiel der einzelnen Methoden:</h5>
  <p align="justify">Bei jedem Threaddurchlauf in der Main - Methode wird die move - Methode jedes Balles aufgerufen. Diese legt die neuen Koordinaten des Balles fest und testet zudem selbstst&auml;ndig, durch den Aufruf der Methode isOut(), ob der Ball im Aus  oder noch im Spielfeld ist. Ist der Ball im Aus, so ruft isOut() die looseLife() - Methode des Player - Objektes auf und der Spieler verliert ein Leben. <br>
  Immer wenn der Spieler in das Applet klickt, wird dieses Ereigniss von mouseDown in der Klasse Main aufgefangen und die Methode userHit () f&uuml;r beide B&auml;lle aufgerufen. Diese testet, ob der Ball getroffen wurde und liefert je nach dem true oder false zur&uuml;ck.  Ist der R&uuml;ckgabewert true, so wird von der Main - Methode aus ballWasHit () aufgerufen, die alle weiteren n&ouml;tigen Schritte (Ball zur&uuml;cksetzen, Punkte des Spielers erh&ouml;hen...) ausf&uuml;hrt.</p>
  <h5>Bevor wir richtig starten noch ein Hinweis</h5>
  <p align="justify">Zu allererst ist es wichtig, dass ihr euch den gesammten SourceCode des Spiels (am Ende der Seite) als *.zip - Archiv runterladet und immer im Auge habt, w&auml;hrend ich den Code erkl&auml;re. Dabei werde ich nur auf bestimmte Teile des Programmes eingehen und ihr solltet in der Lage sein bzw. es bald lernen, den restlichen Sourcecode (mit Hilfe der andernen Kapitel) zu lesen und zu verstehen um euch auf diese Art und Weise weiteres Wissen anzueignen. <br>
  Am allerwichtigsten aber ist es, dass ihr euch m&ouml;glichst bald an ganz einfache, eigene Aufgaben wagt und euch &uuml;berlegt wie ihr bestimmte Probleme in diesem Spiel gel&ouml;st h&auml;ttet. Denn jedes Spiel erfordert ab einem gewissen Punkt ganz individuelle L&ouml;sungen, die ihr nirgendwo finden werdet und bei denen euch oft auch niemand helfen kann. Benutzt also dieses erste Spiel und die anderen Applets / Sourcecodes auf diesen bzw. anderen Seiten (siehe auch Links) als Ideeengeber und "Nachschlagewerke", mit deren Hilfe ihr eure eigenen Spiel entwickelt. Denn nur &Uuml;bung macht den Meister!</p>
  <h3>Flugrichtung des Balles zuf&auml;llig gestallten</h3>
  <p align="justify">Wie ich schon mal im ersten Kapitel angedeutet habe, wollen wir die beiden B&auml;lle nun nicht mehr nur horrizontal &uuml;ber das Applet bewegen, sondern wir wollen beide Dimensionen (x und y - Koordinate) des Applets ausnutzen. Dazu m&uuml;ssen wir zu dem uns schon bekannten Richtungsvektor in x - Richtung (x_speed) noch einen weiteren in y - Richtung (y_speed) hinzuf&uuml;gen. Unser Ball hat also nun eine Geschwindigkeit in x - Richtung, die bei jedem Aufruf der Methode move() zur aktuellen x - Koordinate hinzugez&auml;hlt wird und ebenso eine y - Geschwindigkeit, die jeweils zur y - Koordinate hinzuaddiert wird. Der y_speed soll bei beiden B&auml;llen immer konstant bleiben. Dabei soll der eine Ball nach oben (y_speed = -1) und der andere Ball nach unten (y_speed = 1) fliegen. Man beachte, dass das Koordinatensystem von Java sozusagen auf dem Kopf steht (y - Werte werden von oben nach unten immer gr&ouml;&szlig;er!). Des weiteren soll diese Geschwindigkeit in x - Richtung nach jedem Abschuss / Aus des Balles neu, per Zufall bestimmt werden.</p>
  <h5>Ein Zufallsgenerator</h5>
  <p align="justify">Zun&auml;chst m&uuml;ssen wir uns also einen Zufallsgenerator in Java beschaffen. Wir importieren hierf&uuml;r die Klasse <i>java.util.*;</i> in unsere Ballklasse und deklarieren anschlie&szlig;end folgendes Objekt als Instanzvariable der Klasse Ball:<br></p>
  <ul><i>Random rnd = new Random ();</i></ul>
  <p align="justify">Nun k&ouml;nnen wir mit dem Befehl <i>rnd.nextInt()</i> eine zuf&auml;llige  Integerzahl erzeugen. Da wir eine Zahl zwischen -3 und +3 erzeugen wollen, m&uuml;ssen wir diese Zahl anschlie&szlig;end noch modulo 4 rechnen um nur Zahlen in diesem Zahlenraum zu erhalten. <br>
  Nun k&ouml;nnen wir immer wenn ballWasHit() aufgerufen wird oder wenn isOut() den Wert true zur&uuml;ckliefert die neue Flugrichtung des Balles zuf&auml;llig bestimmen, indem wir x_speed den zufallsgenerierten Wert zuweisen.</p>
  <h5>Die move - Methode des Balles</h5>
  <p align="justify">Nachdem wir die Instanzvariablen x_speed und y_speed deklariert und im Konstruktor initialisiert haben, k&ouml;nnen wir sie in jedem Aufruf von move() zu den aktuellen Koordinaten hinzuz&auml;hlen. x_speed wird dabei immer wieder neu bestimmt (siehe oben), y_speed bleibt konstant. Die move() - Methode sieht also folgenderma&szlig;en aus:</p>
  <ul><i>
  public void move()<br>
  {
  <ul>
  // Hinzuz&auml;hlen der Speed - Variablen zu den aktuellen Koordinaten<br>
  pos_x += x_speed;<br>
  pos_y += y_speed;<br><br>
  /* Aufrufen der Methode isOut() um zu testen, ob sich der Ball noch im Spielfeld befindet */<br>
  isOut();<br>
  </ul>
  }<br>
  </i></ul>
  <h5>Die Methode isOut()</h5>
  <p align="justify">Die Methode isOut() pr&uuml;ft, ob ein Ball eine der Grenzen des Spielfeldes &uuml;berschritten hat. Trifft eine der vier Abfragen zu, so wird der Ball auf seine Startposition zur&uuml;ckgesetzt, eine Audiodatei abgespielt, die Flugrichtung neu bestimmt und der Spieler verliert ein Leben (wie genau, das folgt sp&auml;ter noch). Das Prinzip ist das gleiche wie schon in unserem dritten Applet (BallReverse) besprochen, mit dem einzigen Unterschied, dass wir hier vier Grenzen haben, die wir nach m&ouml;glichen &Uuml;berschreitungen abfragen m&uuml;ssen und nicht nur zwei wie in unserem Beispiel aus Kapitel 1 c. Daher m&ouml;chte ich nicht n&auml;her auf die programmiertechnische Seite dieser Methode eingehen, versucht stattdessen die einzelen Schritte (im Grunde ist es nur einer, der sich viermal wiederholt) alleine nachzuvollziehen (mit den gegebenen Kommentaren und dem Kapitel 1c sollte das kein Problem sein).</p>
  <h3>Den Ball abschie&szlig;en</h3>
  <p align="justify">Dieses Problem ist wohl das Schwierigste in diesem Spiel. Der Ball hat ja eine x und eine y - Koordinate. Klickt der Spieler auf das Applet, so werden die x und die y - Koordinate mit an die aufgerufenen Methode userHit (int x, int y) &uuml;bergeben. Nun muss die Methode entscheiden, ob der Schuss den Ball getroffen hat, oder nicht. Wie soll man das bewerkstelligen. <br>  <br>
   Es gen&uuml;gt nicht nur x und y - Koordinate des Balles mit denen des Schusses zu vergleichen (bei Gleichheit gilt der Ball dann als getroffen), denn dann m&uuml;sste der Spieler immer genau die Mitte des noch dazu bewegten Balles treffen. Eine fast unl&ouml;sbare Aufgabe! <br>  <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -