Du bist nicht angemeldet.

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

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

91

24.01.2007, 19:34

Wieso denn Zylinder, hast du eine 3D-Engine verwendet ?
Koennte man nicht einfach einen sehr kleinen Zylinder auf jeden Vertex einer Flaeche packen ?
"Have you tried turning it off and on again?"

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

92

24.01.2007, 20:02

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 ?

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?!

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

93

24.01.2007, 21:50

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?!

Ich merke gerade dass ich mir eine falsche Vorstellung von den Zylindern gemacht habe. Irgendwie dachte ich dass die Wand-Flaechen mit von oben betrachteten Zylindern 'gefuellt' werden; das ist natuerlich Quatsch. Offensichtlich befindet sich jewails ein Zylinder zwischen 2 Eckpunkten.

Woran ich gedacht hatte war einfach nur eine Kollision mit dem Eckpunkt zu erzwingen, indem man zusaetzlich ein (punktfoermiges (daher 'sehr klein')) Kollisionsobjekt dahin setzt.

(Link)

Wird der Winkel dann zu klein koennte sich die Rakete aber "verfangen"

Dir faellt doch bestimmt ein besserer Workaround ein :)
"Have you tried turning it off and on again?"

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

94

24.01.2007, 22:14

Es gibt jetzt ein (kleines) Update.
Da jetzt bald die Klausuren anstehen, habe ich momentan nicht so viel Zeit, wie ich gerne hätte :)

PS: Es wird mit großer Wahrscheinlichkeit bald die Möglichkeit geben, Levels über lua zu scripten!

Fraktal

Frischling

Beiträge: 15

Wohnort: Zülpich

Beruf: Student

  • Private Nachricht senden

95

25.01.2007, 00:07

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.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

96

25.01.2007, 21:26

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.

Es kann sein, dass du einfach vergessen hast, auf OK zu klicken bzw. Enter zu drücken, nachdem du deinen Namen eingegeben hast. Der Ghost wird trotzdem gespeichert.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

97

26.01.2007, 20:56

So, da das StarRace in der aktuellen Version unspielbar geworden ist, hier wieder ein Update: :)
http://alphanew.games-forge.de/extern/starrace.level

98

27.01.2007, 17:09

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

Also wenn du die Version am Ende der letzten Seite meinst- das ist doch die TA Karte- oder?? Die habe ich geschafft!! Ist ne coole Idee mit dem Sternchen, das man durch die Gegend schiessen muss!!

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

99

28.01.2007, 18:04

Es gibt wieder ein Update!
Ab sofort ist Scripting mit Hilfe von lua möglich!

Es folgt das Beispiel-Script aus dem Test-Level.
Es zeigt die wichtigsten Features, aber nicht restlos alle. Ich werde überlegen, ob ich eine Dokumentation dafür schreibe.
Natürlich wird die Mächtigkeit der Scripting-Engine mit der Zeit noch ausgebaut. Es ist aber schon recht viel damit möglich. Wenn Ihr noch Ideen habt oder wichtige Features vermisst, dann sagt bescheid.

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 );

BOSS

Frischling

Beiträge: 43

Wohnort: Hannover

Beruf: Autor, Mathematiker, Dozent.

  • Private Nachricht senden

100

28.01.2007, 19:43

@David. Bei mir hackt dein Spiel, trotz deiner Anweisungen und Tipps.
Vielleicht solltest du Systemanforderungen für uns aufschreiben. ;-)
"Wie dumm du doch bist. Ich bin ein Gott! Wie kannst du einen Gott töten? Welch große und berauschende Unschuld. Wie konntest du so naiv sein? Es gibt kein Entrinnen. Weder Widerruf noch Einmischung können an diesem Ort wirken. Komm, leg deine Waffen nieder... noch ist es Zeit Gnade walten zu lassen."

MfG Der Dozent

Werbeanzeige