Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Administrator
Zitat von »"Chase"«
Wieso denn Zylinder, hast du eine 3D-Engine verwendet ?
Koennte man nicht einfach einen sehr kleinen Zylinder auf jeden Vertex einer Flaeche packen ?
Zitat von »"David Scherfgen"«
Es geht nur um die Physik. ODE ist eine 3D-Physik-Engine. Ich habe keine vernünftige für 2D gefunden. Wie stellst du dir das denn mit den sehr kleinen Zylindern vor?!
Administrator
Administrator
Zitat von »"Fraktal"«
Kleine Fehlermeldung: Die Bestzeiten für die zweite Zeitstrecke waren nach der Rückkehr aus dem Hauptmenü gelöscht, allerdings war der "Geist" noch gespeichert. Die Rekorde auf den anderen Strecken waren alle noch da. Der Fehler hat sich (bis jetzt, nach mehrmaligem Testen) nicht wiederholt.
Zitat von »"CodingCat"«
So, da das StarRace in der aktuellen Version unspielbar geworden ist, hier wieder ein Update:
http://alphanew.games-forge.de/extern/starrace.level
Administrator
Quellcode |
|
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
function onTimer1( interval ) if( sound.valid ) then -- Instanz des Sounds erzeugen soundInst = sound:createInstance(); if( soundInst.valid ) then -- Sound an das Zielobjekt koppeln und abspielen. soundInst:attachTo( target ); soundInst:play(); -- Der Sound soll leiser und tiefer werden, während er abgespielt wird. -- Der erste Parameter ist jeweils der Zielwert, der zweite die Geschwindigkeit, -- mit der der Übergang stattfinden soll. soundInst:setVolumeTarget( 0.25, 5.0 ); soundInst:setPitchTarget( 0.25, 5.0 ); end end -- Ziel blinken lassen target.visible = not target.visible; n = n + 1; if( n == 10 ) then -- Die Kamera soll das Power-Up beobachten. level.cameraTarget = powerUp1; elseif( n == 15 ) then -- Text erzeugen und Power-Up verschwinden lassen level:addText( "Weg ist es!", powerUp1.position, Vec4f( 1, 0, 0, 1 ), 2, 5 ); powerUp1:kill(); elseif( n == 20 ) then -- Die Kamera soll zum Zielobjekt schwenken. level.cameraTarget = target; elseif( n == 30 ) then -- Die Kamera soll zurück zum Spieler schwenken. level.cameraTarget = player; -- Der Timer wird beendet, wenn die Funktion false zurückliefert. return false; end return true; end function onTimer2( interval ) -- Der Laser soll seine Drehrichtung ändern. rotatingLaser.angularVelocity = -rotatingLaser.angularVelocity; return true; end function onTimer3( interval ) -- Gravitationsvektor um 90° drehen print( "*** Gravitation dreht sich! ***" ); gravityAngle = gravityAngle + math.pi / 2; level.gravity = 8 * Vec2f( math.sin( gravityAngle ), math.cos( gravityAngle ) ); return true; end function onCollision( obj1, obj2 ) -- Objekte können leider nicht mit dem ==-Operator auf Gleichheit überprüft werden. -- Dazu gibt es aber die Funktion "areEqual". if areEqual( obj1, player ) and areEqual( obj2, trigger ) then -- Text anzeigen level:addText( "Lichtschranke!", obj1.position, Vec4f( 0, 1, 1, 1 ), 2, 5 ); -- Die Funktion "toPlayer" castet das Objekt zum Typ "Player", -- denn sonst fehlen die Attribute "score" und "health". -- Natürlich könnte man auch direkt mit der "player"-Variablen arbeiten. -- Dies hier ist nur zu Demonstrationszwecken. local p = toPlayer( obj1 ); p.score = p.score + 1; p.health = p.health * 2; -- Die "Lichtschranke" soll verschwinden. obj2:kill(); -- Callback wieder austragen p.collisionCallback = nil; end end function myThreadProc1() print( "Thread 1 gestartet" ); print( "Hallo Welt!" ); sleep( 1 ); print( "Dieser Level heisst " .. level.name ); sleep( 1 ); print( "Er ist vom Typ " .. level.type ); sleep( 1 ); local p = player.position; print( "Der Spieler ist auf Position " .. p.x .. ", " .. p.y ); sleep( 1 ); player.position = Vec2f( 5, 25 ); local p = player.position; print( "Jetzt ist er auf Position " .. p.x .. ", " .. p.y ); sleep( 1 ); local p = target.position; print( "Das Ziel ist auf Position " .. p.x .. ", " .. p.y ); sleep( 1 ); print( "Gesundheit des Ziels ist " .. target.health ); sleep( 1 ); print( "Der Treibstoff des Spielers ist " .. player.fuel ); sleep( 1 ); print( "Thread 1 beendet sich" ); end function myThreadProc2() print( "Thread 2 gestartet" ); sleep( 10 ); while player ~= nil do local p = player.position; print( "Spielerposition: " .. p.x .. ", " .. p.y ); sleep( 5 ); end print( "Thread 2 beendet sich" ); end n = 0; gravityAngle = 0; -- einen 3D-Sound als Sample (nicht als Stream) laden, der zur Soundgruppe "SFX" gehört sound = loadSound( "data\\notify.ogg", "SFX", "Sample", "3D" ); -- Alle 0.5 Sekunden soll "onTimer1" aufgerufen werden. -- Als Parameter erhält die Funktion das Zeitintervall, also hier 0.5. -- Der Rückgabewert der Funktion bestimmt, ob der Timer weiterlaufen soll (true) oder nicht (false). level:addTimerCallback( onTimer1, 0.5 ); -- "onTimer2" soll alle 5.2, 7.7 und 11.3 Sekunden aufgerufen werden. level:addTimerCallback( onTimer2, 5.2 ); level:addTimerCallback( onTimer2, 7.7 ); level:addTimerCallback( onTimer2, 11.3 ); -- "onTimer3" soll alle 10 Sekunden aufgerufen werden. level:addTimerCallback( onTimer3, 10 ); -- Wenn der Spieler mit einem Objekt kollidiert, soll "onCollision" aufgerufen werden. -- Diese Funktion erhält als Parameter die beiden Objekte, die kollidiert sind, wobei der erste -- Parameter das Objekt ist, für das die Callback-Funktion angegeben wurde (also hier "player"). player.collisionCallback = onCollision; -- Zwei Threads starten, die die Funktionen "myThreadProc1" und "myThreadProc2" ausführen. -- Die Kontrolle geht beim Starten eines Threads sofort an ihn über. -- Ein Thread läuft immer so lange, bis er mit "sleep" schlafen gelegt wird. -- Dies ist preemptive Multi-Threading, wie man es von Betriebssystemen her kennt, wo der Scheduler -- dafür sorgt, dass jeder Thread an die Reihe kommt! runThread( myThreadProc1 ); runThread( myThreadProc2 ); -- Einen kleinen Text an der Position des Spielers ausgeben, Farbe grün (R, G, B, A). -- Die Größe des Texts ist 2, und er bleibt für 10 Sekunden sichtbar. level:addText( "Hallo vom Script!", player.position, Vec4f( 0, 1, 0, 1 ), 2, 10 ); |
Werbeanzeige