Seite 5 von 7

Verfasst: 16.02.2007 13:21
von #NULL
in den drei 'pos'-prozeduren gibst du float-werte zurück (ProcedureReturn ..).
du mußt also statt..

Code: Alles auswählen

Procedure getPlayerX(*p.player, x, currentTime) 
..schreiben:

Code: Alles auswählen

Procedure.f getPlayerX(*p.player, x, currentTime) 
(bei allen drei. bei der anderen steht ja auch "Procedure.l", weil du einen long-wert zurückgibst)

Verfasst: 16.02.2007 13:35
von Pandorra
jetzt klappt es aber er findet den pointer nicht.
Ich Experimentiere mal weiter herum.

Verfasst: 16.02.2007 13:48
von DarkDragon

Code: Alles auswählen

Global Dim players.player(#NUMBER_OF_PLAYERS)
players(1) = newPlayer(300, 300, 200, currentTime) 

Code: Alles auswählen

    For i = 0 To #NUMBER_OF_PLAYERS -1
      renderPlayer(players(i), currentTime)
    Next i
K.A. ob das geht, soviel ich aber noch weiß, schon.

Verfasst: 16.02.2007 14:01
von #NULL
@pandorra

du verhaust da was. du übergibst den prozeduren einen pointer auf den typ (structure) namens player. in der prozedure greifst du aber auf das feld posX zu (z.b.). dieses feld gibt es aber nur in der anderen structure, names movingObject.
mußt also nochmal gucken..

<edit>
oh, sorry. ich hab das extends übersehen. stimmt also doch.

Verfasst: 16.02.2007 14:16
von Pandorra
Mein Problem basiert darauf das er den Pointer nicht findet...

Verfasst: 16.02.2007 14:28
von #NULL
drei sachen mal korrigiert (und kommentiert):

Code: Alles auswählen

#NUMBER_OF_PLAYERS = 4

Structure movingObject
  xPos.f
  yPos.f
  zPos.f
  lastTime.l
  entity.l 
EndStructure

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



Procedure.f getPlayerX(*p.player, x, currentTime) ; <<<<<< mit rückgabetyp float (Procedure.f)
  ProcedureReturn *p\xPos
EndProcedure

Procedure.f getPlayerY(*p.player, y, currentTime) ; <<<<<< mit rückgabetyp float (Procedure.f)
  ProcedureReturn *p\yPos
EndProcedure

Procedure.f getPlayerZ(*p.player, z, currentTime) ; <<<<<< mit rückgabetyp float (Procedure.f)
  ProcedureReturn *p\zPos
EndProcedure

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

  getPlayerX(*new, x, time) ; <<<<<< hier mußt du deinen neuen 
  getPlayerZ(*new, z, time) ; <<<<<< pointer *new einsetzen, 
  getPlayerY(*new, y, time) ; <<<<<< und NICHT *players

  ProcedureReturn *new
EndProcedure



; <<<<<<<<<<<<< ..und (WICHTIG!), du mußt auch dein ganzes array 
; <<<<<<<<<<<<< von pointer mit gültigem speicher belegen, und 
; <<<<<<<<<<<<< nicht nur ein element, denn du greift in der 
; <<<<<<<<<<<<< hauptschleife weiter unten ja auch auf alle zu.
Global Dim *players.player(#NUMBER_OF_PLAYERS -1)
For i=0 To #NUMBER_OF_PLAYERS -1
  *players(i) = newPlayer(300, 300, 200, currentTime)
Next


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



;...
Repeat
    currentTime = ElapsedMilliseconds()

    For i = 0 To #NUMBER_OF_PLAYERS -1
      renderPlayer(*players(i), currentTime)
    Next i 
Until 0

Verfasst: 16.02.2007 14:59
von Pandorra
x klappt nun nur noch z nicht.
Obwohl alles gleich ist.

Verfasst: 16.02.2007 16:14
von ZeHa
Wollte nur nachfragen, ob Du getPlayerX usw absichtlich noch quasi freigelassen hast? Weil da muß natürlich die korrekte Berechnung rein, sonst geht da nix...

Verfasst: 16.02.2007 16:41
von Pandorra
nein hab ich nicht,
momentan bin ich nur dran interressiert das die Sachen ohne Probleme aufgrerufen werden.
Dann werde ich mich um die Berechnungen kümmern, wobei ich noch nicht weiß wie ich das anstellen soll.

Verfasst: 16.02.2007 17:12
von #NULL
also wenn du fehlermeldungen erhältst, muß es an deinem context liegen.
der code läuft jedenfalls in etwa, auch wenn er so keinen richtigen sinn macht. vielleicht hast du beim übertragen/kopieren irgendwas vergessen?

z.b. läuft das hier:

Code: Alles auswählen

#NUMBER_OF_PLAYERS = 4

Structure movingObject
  xPos.f
  yPos.f
  zPos.f
  lastTime.l
  entity.l
EndStructure

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



Procedure.f getPlayerX(*p.player, x, currentTime)
  ProcedureReturn *p\xPos
EndProcedure

Procedure.f getPlayerY(*p.player, y, currentTime)
  ProcedureReturn *p\yPos
EndProcedure

Procedure.f getPlayerZ(*p.player, z, currentTime)
  ProcedureReturn *p\zPos
EndProcedure

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

  getPlayerX(*new, x, time)
  getPlayerZ(*new, z, time)
  getPlayerY(*new, y, time)
  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, currentTime)
Next


Procedure renderPlayer(*p.player, currentTime)
  Debug getPlayerX(*p,12,currentTime)
  Debug getPlayerY(*p,12,currentTime)
  Debug getPlayerZ(*p,12,currentTime)
  Debug ""
  ;CameraLocate  (0, getPlayerX(*p.player, x, currentTime) - Cos(2*#PI*(rot/360))*15, TerrainHeight(getPlayerX(*p.player, x, currentTime),getPlayerZ(*p.player, z, currentTime))+10, getPlayerZ(*p.player, z, currentTime) + Sin(2*#PI*(rot/360))*15)
  ;EntityLocate(*p\entity, getPlayerX(*p.player, x, currentTime), TerrainHeight(getPlayerX(*p.player, x, currentTime),getPlayerZ(*p.player, z, currentTime)), getPlayerZ(*p.player, z, currentTime))
EndProcedure



;...
Repeat
    currentTime = ElapsedMilliseconds()

    For i = 0 To #NUMBER_OF_PLAYERS -1
      renderPlayer(*players(i), currentTime)
    Next i
Until 1

..du solltest mal die beiden aufrufe von CameraLocate() und EntityLocate() auftrieseln, zumindest zum debuggen. dort ist sicherlich was faul. was im rest deines eigenen codes sonst nicht stimmt, können wir leider nicht erraten.

< ## edit ## >
im übrigen mußt du beim aufruf der prozeduren nicht unbedingt den variablen-typ für die parameter mit angeben. statt
getPlayerX(*p.player, x, currentTime)
geht auch
getPlayerX(*p, x, currentTime)