Seite 6 von 7

Verfasst: 16.02.2007 17:19
von ZeHa
Okay.

Übrigens rein von der Logik her ist es falsch, CameraLocate() innerhalb von renderPlayer() zu haben, denn dann würde die Camera ja ziemlich rumspringen wenn Du 4 Player nacheinander renderst.

Sondern Du machst folgendes:

Code: Alles auswählen

Structure camera Extends movingObject
  *focusedObject.movingObject
EndStructure



Global *cam.camera = AllocateMemory(SizeOf(camera))

Procedure bindCameraToObject(*o.movingObject)
  *cam\focusedObject = *o
EndProcedure

Procedure updateCamera(currentTime)
  setXPos(*cam, getXPos(*cam\focusedObject, currentTime) + BLABLA)
  setYPos..... etc
EndProcedure
Nun bindest Du die Camera (also *cam) an das Objekt, das es verfolgen soll (das passiert natürlich nur einmal am Anfang, oder halt wenn das Spiel aus irgendeinem Grund ein anderes Objekt verfolgen soll), und updatest die Camera in JEDEM Frame mit updateCamera. In dieser Funktion kannst Du dann die Camera-Position errechnen, indem Du die momentane Position vom fokusierten Objekt holst (also über getXPos) und eben entsprechende Werte noch hinzuzählst (das ist das BLABLA), denn die Camera soll ja einen gewissen Abstand wahren. Du kannst diesen dann später auch noch überprüfen, bspw. wenn das Objekt nah an einer Wand steht, wirst Du sicherlich den Abstand nachkorrigieren wollen, weil sonst die Kamera hinter der Wand ist etc.

Wichtig: Benenne Deine momentanen getPlayerX und setPlayerX usw in getXPos und setXPos um, und lasse sie mit einem *o.movingObject arbeiten und nicht mit einem *p.player! Somit kannst Du sie dann mit allem verwenden (eben auch mit der Camera, die ja dann auch von einem movingObject abstammt).

Ich hoffe das ist nicht zu viel auf einmal aber eine gute Strukturierung ist halt sehr wichtig bei so einem Projekt. Wie gesagt ich arbeite grad an einem größeren Tutorial (hab schon angefangen), da werd ich solche Dinge nochmal etwas allgemeiner erklären.

Verfasst: 16.02.2007 20:58
von Pandorra
jetzt klappt es muss nur noch die Procedure getXPos etc. machen

Verfasst: 17.02.2007 15:25
von Pandorra
es läuft.
Jetzt muss ich nu noch die Berechnungen in getPlayer?Pos(neuerdings ?POS)
und set?Pos( ?Pos) so machen das ich dort die Positionen speichern kann)
So klappt es nur ich weiß nicht ob das so sein soll

Code: Alles auswählen

#NUMBER_OF_PLAYERS = 4

Structure movingObject
  Spielerx.f
  Spielery.f
  Spielerz.f
  lastTime.l
  entity.l
EndStructure

Structure Player Extends movingObject
  lives.b
  score.l
  energy.l
EndStructure



Procedure.f Spielerx(*p.player, x)
  Global Spielerx.f
  Spielerx = x
  ProcedureReturn *p\Spielerx
EndProcedure

Procedure.f Spielery(*p.player, y)
  Global Spielery.f
  Spielery = y
  ProcedureReturn *p\Spielery
EndProcedure

Procedure.f Spielerz(*p.player, z)
  Global Spielerz.f
  Spielerz = z
  ProcedureReturn *p\Spielerz
EndProcedure

Procedure.l newPlayer(x, z, y)
  *new = AllocateMemory(SizeOf(player))

  Spielerx(*new, x)
  Spielerz(*new, z)
  Spielery(*new, y)
  ProcedureReturn *new
EndProcedure



Global Dim *players.player(#NUMBER_OF_PLAYERS -1)
For i=0 To #NUMBER_OF_PLAYERS -1
  *players(i) = newPlayer(300, 300, 200)
Next



Procedure renderPlayer(*p.player)
  CameraLocate  (0, Spielerx - Cos(2*#PI*(rot/360))*15, TerrainHeight(Spielerx,Spielerz)+10, Spielerz + Sin(2*#PI*(rot/360))*15)
  EntityLocate(*p\entity, Spielerx, TerrainHeight(Spielerx,Spielerz), Spielerz) 
EndProcedure 

Verfasst: 17.02.2007 18:07
von ZeHa
Hmmm da stimmt einiges nicht so ganz...

Deine Spielerx-Funktionen z.B. kapiere ich überhaupt nicht - sollen das jetzt set- oder get-Funktionen sein? Benenne die bitte entsprechend, denn Du wirst sowieso beides benötigen!

Und daß Du globale Spielerx-Variablen einführst, bringt nichts, dafür hast Du erstens die Struktur und zweitens die dazugehörigen Funktionen. Wäre vielleicht praktisch wenn Du mal den gesamten Code zeigen könntest, dann könnten wir Dir besser helfen ;)

Verfasst: 17.02.2007 22:26
von Pandorra
ja,
nur ich weiß noch nicht ob ich evtl. nicht doch 3D machen soll...
Global war nur zum Tets, ich weiß nciht was ich da hin machen muss( bei set und get)

Verfasst: 18.02.2007 01:18
von PMV
get heißt zu deutsch, bekommen ... eine Get-Funktion gibt einen Wert
zurück.
set heißt zu deutsch, setzen ... eine Set-Funktion setzt einen Wert

einfaches Beispiel ohne Zusammenhang, deine müssen etwas anders
aussehen:

Code: Alles auswählen

Procedure SetPlayerX(X.l)
  player\x = X
EndProcedure

Procedure.l GetPlayerX()
  ProcedureReturn player\x
EndProcedure
3D ist schwerer als 2D ... wer noch nie ein Spiel programmiert hat, sollte
erst mal 2D machen. Zumindest meine meinung. Außerdem brauchst ja
auch Grafiken, die machst sicher selbst, oder? 3D ist mehr arbeit. Mach
lieber schöne 2D Grafik, als schlechte 3D :D

Und wenn du alles gut Strukturierst sollte es auch kein Problem sein,
später das ganze doch noch zusätzlich eine 3D-Engine zu verpassen.

MFG PMV

Verfasst: 18.02.2007 11:05
von Pandorra
ich hab den Code jetzt etwas umgearbeitet:

Code: Alles auswählen

#Number_of_Players = 4

Define.f KeyX, KeyY, MouseX, MouseY

Global rot.f, RollZ



Structure movingObject
  Spielerx.f
  Spielery.f
  Spielerz.f
  lastTime.l
  entity.l
EndStructure

Structure Player Extends movingObject
  lives.b
  score.l
  energy.l
EndStructure


Procedure SetSpielerX(*p.player, X.l)
  *p\Spielerx = X
EndProcedure

Procedure.l GetSpielerX(*p.player)
  ProcedureReturn *p\Spielerx
EndProcedure 

Procedure SetSpielerz(*p.player, Z.l)
  *p\Spielerz = Z
EndProcedure

Procedure.l GetSpielerZ(*p.player)
  ProcedureReturn *p\Spielerz
EndProcedure 

Procedure SetSpielery(*p.player, Y.l)
  *p\SpielerY = X
EndProcedure

Procedure.l GetSpielery(*p.player)
  ProcedureReturn *p\Spielery
EndProcedure 



Procedure.l newPlayer(x, z, y)
  *new = AllocateMemory(SizeOf(player))

  SetSpielerx(*new, x)
  SetSpielerz(*new, z)
  SetSpielery(*new, y)
  ProcedureReturn *new
EndProcedure



Global Dim *players.player(#Number_of_Players -1)
For i=0 To #Number_of_Players -1
  *players(i) = newPlayer(300, 300, 200)
Next



Procedure renderPlayer(*p.player)
  CameraLocate  (0, SetSpielerx - Cos(2*#PI*(rot/360))*15, TerrainHeight(SetSpielerx,SetSpielerz)+10, SetSpielerz + Sin(2*#PI*(rot/360))*15)
  EntityLocate(*p\entity, SetSpielerx, TerrainHeight(SetSpielerx,SetSpielerz), SetSpielerz) 
EndProcedure 
Geht das so?

Verfasst: 18.02.2007 11:38
von ZeHa
Nee das kann gar nicht gehen, weil in Deiner renderPlayer() lauter SetSpielerx verwendet werden, richtig wären aber GetSpielerx().

Und dann müssen Deine GetSpielerX() nur noch korrekt berechnet werden. Hmm vielleicht kann ich mal 'nen Pong-Clone programmieren mit dem selben Prinzip, da müßte der Code so kompakt sein daß der gut als Beispiel dienen könnte. Aber ich hab zur Zeit so wenig Zeit :|

Verfasst: 18.02.2007 22:23
von Pandorra
also wenn ich jetzt noch ein beispiel für GetPlayer und SetPlayer berechnung bekomme hääte ich dies abgehackt...
Könnte mir da jemand mit Tipps helfen.

Verfasst: 19.02.2007 00:23
von PMV
ZeHa hat geschrieben:Und dann müssen Deine GetSpielerX() nur noch korrekt berechnet werden. Hmm vielleicht kann ich mal 'nen Pong-Clone programmieren mit dem selben Prinzip, da müßte der Code so kompakt sein daß der gut als Beispiel dienen könnte. Aber ich hab zur Zeit so wenig Zeit :|
Das wäre gut für dein angepeiltes Tut <) ... muss ja auch nicht mit einem
mal fertig sein ... hauptsache es wird überhaupt was drauß.

Also ich hab mich heute mit anderen nervige Problemen beim Proggen
rumschlagen müssen und deswegen jetzt grad den Pfaden der Diskusion
hier verloren. Weis grad nicht wie weit ihr seit :lol: ... vielleicht hat ZeHa
ja doch etwas mehr Zeit und schon morgen (übermorgen) nen kleinen
Pong-Clone zum vorzeigen :D oder kann zumindest mit einem Teil davon
dir weiter helfen.

MFG PMV