Seite 3 von 3

Verfasst: 28.01.2007 12:00
von edel
ZeHa hat geschrieben:EDIT: Nochmal zu Deinem Beispiel. Ich habe gerade ein Sprite 10x geladen und immer #PB_Any benutzt. Dann kriege ich ja die Spritenummer zurück, das sind dann aber immer sehr große Zahlen - aber der Speicherverbrauch bleibt trotzdem relativ klein. Woran liegt das dann?
Kaeru Gaman hat geschrieben:du bekommst nämlich keine spritenummern zurück, sondern direkt das Handle,
und deswegen wird auch kein Handle-Table angelegt.

Falsch , mit #PB_ANY bekommt man die Nummer , nicht das Handle.
Die Nummer ist dann ein Zeiger auf das Objekt.

Verfasst: 28.01.2007 13:14
von Kaeru Gaman
> Falsch , mit #PB_ANY bekommt man die Nummer , nicht das Handle.
> Die Nummer ist dann ein Zeiger auf das Objekt.

ebenso falsch, denn eine nummer ist kein zeiger.
vielleicht war Handle der falsche Begriff, und ich hätte Pointer schreiben sollen,
aber eine Nummer ist es nicht, denn die Spritenummer, die ich direkt angebe,
ist kein Pointer, sondern der Index des Pointer-Tables. :p


> Hast Du (Kaeru) nicht zufällig noch 'ne alte Kiste rumstehen?

:lol: fällt flach, sorry.
bei meinem 1GHz-Rechner ist die Mother kaputt, da geht nix mehr.
schade eigentlich, hätte ihn in letzter zeit gern als alternativrechner gehabt.
die GF2 da drin wär für deine test-anfrage wohl passent gewesen.
(obwohl die inkompatibilitäten eher bei anderen älteren Grakas auftritt,
die GF2 hatte kein problem mit "unrechten" textures für sprite3D)

der andere oldtimer ist ein P1-100 mit win95, der fällt wohl eher flach.. ;)

ich hab nochn P3-400 im Keller, da wollte ich mal ME oder 98SE draufziehen,
um gewisse games zocken zu können, aber da bin ich noch nich zu gekommen.

Verfasst: 28.01.2007 13:27
von ZeHa
Hmm vielleicht sollte man mal irgendwo einen Sticky-Thread eröffnen, wo jeder kurz schreibt, was er für Testrechner zur Verfügung hätte (also am besten alt und sofort einsatzbereit), das wäre für die ein oder andere Software dann bestimmt mal ganz hilfreich. Auch gerade was Betriebssysteme angeht, damit man einfach mal 'nen Überblick hat und weiß, an wen man sich diesbzgl. wenden könnte oder so.

Verfasst: 28.01.2007 18:06
von edel
Kaeru Gaman hat geschrieben:> Falsch , mit #PB_ANY bekommt man die Nummer , nicht das Handle.
> Die Nummer ist dann ein Zeiger auf das Objekt.

ebenso falsch, denn eine nummer ist kein zeiger.
vielleicht war Handle der falsche Begriff, und ich hätte Pointer schreiben sollen,
aber eine Nummer ist es nicht, denn die Spritenummer, die ich direkt angebe,
ist kein Pointer, sondern der Index des Pointer-Tables. :p
Es ist und bleibt aber die PBID egal ob Zeiger oder nicht, daher Nummer.

Verfasst: 28.01.2007 18:21
von Kaeru Gaman
tatsache ist, es wird eine hohe zahl zurückgeliefert,
die einen zeiger darstellt und keinen table-index.
wenn ich das sprite mit nummer erstelle,
ist die nummer ein index, kein zeiger.

im grunde handelt es sich also um ein anderes Datum,
wenn es auch fishy implementiert ist,
an selber stelle als argument übergeben wird,
und die unterscheidung ob nummer oder zeiger im grunde durch die höhe getroffen wird,
weshalb auch die compilerwarnung eingerichtet ist.

aber wenn du den leuten diese detailinformation verbergen möchtest,
indem du beides schlicht "nummer" nennst, ist das nicht mein problem.

Verfasst: 28.01.2007 20:17
von edel
Hilfe hat geschrieben: Manchmal ist die indexierte Nummerierung nicht sehr praktisch, um dynamische Situationen zu handhaben, wo wir mit einer unbekannten Anzahl von Objekten umgehen müssen. PureBasic bietet eine einfache und komplementäre Möglichkeit, Objekte auf eine dynamische Art und Weise zu erstellen. Beide Methoden (indexiert und dynamisch) können gleichzeitig - ohne irgendeinen Konflikt - verwendet werden. Um ein dynamisches Objekt zu erstellen, müssen Sie die #PB_Any Konstante anstelle einer Index-Zahl angeben, und die dynamische Nummer wird als Ergebnis der entsprechenden Funktion zurückgegeben
Es steht nirgends etwas von Zeiger, man braucht also hier auch
nicht von Zeiger reden, es ist und bleibt eine Nummer. Was PB
intern damit macht, steht auf einem anderen Blatt.
Man selbst benoetigt solche Informationen (wenn ueberhaupt)
nur dann wenn man z.B. mal wieder ein Workaround braucht
oder Userlibs, Hacks usw. schreibt.

Aber damit du nicht ganz so traurig gucken musst, hier mal ein
Beispiel wie man dynamisch erstellte Objekte auslesen kann ohne
sie zu speichern :

Original stammt von remi, habs nur etwas angepasst.
Auf das sich Freak die Haare rauft :lol:

Code: Alles auswählen


; http://www.purebasic.fr/german/viewtopic.php?t=10043
  Import "ObjectManager.lib"
    PB_Object_GetObject      (*Object, DynamicOrArrayID)
    PB_Object_IsObject       (*Object, DynamicOrArrayID)
    PB_Object_EnumerateAll   (*Object, Callback, *Datas)
  EndImport
  
  Structure PB_Sprite
    Sprite.IDirectDrawSurface7       ; DirectDrawSurface7 pointer
    Width.w       ; Current width of the sprite (could change if ClipSprite() is used)
    Height.w      ; Current height of the sprite (could change if ClipSprite() is used)
    Depth.w       ; depth of the file. (in bits) 
    Mode.w        ; Sprite mode, as described in LoadSprite()
    FileName.l    ; Pointer on the filename, if any
    RealWidth.w   ; Original width of the sprite when it was loaded
    RealHeight.w  ; Original height of the sprite when it was loaded
    ClipX.w       ; X offset if ClipSprite()
    ClipY.w       ; Y offset if ClipSprite()
  EndStructure 

  Procedure.l CallBack(id.l, *Element.PB_Sprite, *SpriteObjects)
    
    *Element = PB_Object_IsObject(*SpriteObjects, id) ; ohne geht es nicht richtig 
                                                      ; warum auch immer
    
    With *Element
      Debug "--------ID : "+ Str(id) +"-----------" 
      Debug "Sprite    = " + Str(\Sprite)
      Debug "Width     = " + Str(\Width)
      Debug "Height    = " + Str(\Height)
      Debug "Depth     = " + Str(\Depth)
      Debug "Mode      = " + Str(\Mode)
    EndWith
    
    ProcedureReturn 1
  EndProcedure

  InitSprite()
  OpenScreen(640,480,32,"")
  
  for i = 0 to 20
    CreateSprite(-1,100,i+1)
  next 
  
  *Objects.l = 0
  
  !EXTRN _PB_Sprite_Objects
  !MOV Eax, [_PB_Sprite_Objects]
  !MOV [p_Objects], Eax
  
  
  PB_Object_EnumerateAll(*Objects, @CallBack(), *Objects)
 
  

Verfasst: 01.02.2007 01:39
von dllfreak2001
Ich denke sowas hat hier bestimmt schon einer Vrgeschlagen
aber ich stell es mal trotzdem rein.

Code: Alles auswählen


InitSprite()
InitMouse()
InitSprite3D()
InitKeyboard()

OpenScreen(1024,768,32,"StandartScreen")
;-Sprite3d erzeugen
CreateSprite(0,64,64,#PB_Sprite_Texture)
CreateSprite3D(0,0)

;-Image erzeugen
CreateImage(10,256,64)

StartDrawing(ImageOutput(10))
  Box(0,0,256,64,RGB(0,255,255))  
  For x = 0 To 3
    DrawText(x*64,16,Str(x+1)+".Frame")
  Next
StopDrawing()

Repeat
  ExamineKeyboard()
  ExamineMouse()
  SetFrameRate(60)

  ;-Bild in das Sprite3D malen
  ddel+1
  If ddel > 10
    ddel = 0 
    frame + 1
      If frame > 3
        frame = 0
      EndIf
    StartDrawing(SpriteOutput(0))
      DrawImage(ImageID(10),-frame*64,0);-Bild wird pro Animation nach hinten geschoben
    StopDrawing()
  EndIf

  ;-Auf Bildschirm ausgeben
  Start3D()
    DisplaySprite3D(0,MouseX(),MouseY())
  Stop3D()

  ;-Bildschirm zeichnen und löschen
  FlipBuffers()
  ClearScreen(0)
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
Ist zwar nicht sehr schön sollte aber seinen Zweck zuverlässig erfüllen.