weiche Sprite-Ränder erzeugen

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

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

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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)
 
  
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
I´a dllfreak2001
Antworten