Netzwerk

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag von Pandorra »

jetzt klappt es aber er findet den pointer nicht.
Ich Experimentiere mal weiter herum.
Benutze PB v 4.40 Beta 3
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag von Pandorra »

Mein Problem basiert darauf das er den Pointer nicht findet...
Benutze PB v 4.40 Beta 3
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag von Pandorra »

x klappt nun nur noch z nicht.
Obwohl alles gleich ist.
Benutze PB v 4.40 Beta 3
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Beitrag 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.
Benutze PB v 4.40 Beta 3
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten