Speicheradresse eines Sprites ermitteln.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Speicheradresse eines Sprites ermitteln.

Beitrag von PureLust »

Hallo zusammen,

ich versuche die Speicheradresse eines Sprites heraus zu finden.
Hätte da evtl. jamnd eine Idee für mich wie ich diese bekommen könnte?

ThanX und Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die Struktur die man von CreateSprite(0[...] bekommt sieht so aus

Code: Alles auswählen

  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 shade 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
Die Struktur ist von Stefan bzw seiner 'library descriptor'.
Ob und was sich da mit 4.0 geaendert hat weiss ich nicht.



Code: Alles auswählen


  InitSprite()
  
  OpenScreen(800,600,32,"")
  
  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 shade 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
  
  *Sprite.PB_Sprite = CreateSprite(#PB_Any,100,100)
  Debug *Sprite\Sprite
  Debug *Sprite\Width
  
  
  Debug "----"
  
  CreateSprite(0,666,666)
  *Sprite.PB_Sprite = IsSprite(0)
  Debug *Sprite\Sprite
  Debug *Sprite\Width
  
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Hallo edel,

vielen Dank für die Struktur - kann man immer gut gebrauchen.

In der Struktur konnte ich zwar nicht die Speicheradresse für das Sprite erkennen (hab ich die übersehen oder ist die nicht da drin?), aber ich habe wieder was gefunden, was ich schon mal benutzt hatte ("StartDrawing(SpriteOutput(x))" und dann "DrawingBuffer()").

Somit hat sich also mein Hauptproblem gelöst und dank Dir habe ich nun auch noch weitere interessante Infos zur Spritestruktur. ;)

Also nochmals Big-ThanX. :allright:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

IDirectDrawSurface7
ist ein Interface, das man im Structure-Viewer ansehen kann.
doppelklick auf den Interface-Namen, dann offenbart er folgendes:

Code: Alles auswählen

Interface IDirectDrawSurface7
  QueryInterface(a, b)
  AddRef()
  Release()
  AddAttachedSurface(a)
  AddOverlayDirtyRect(a)
  Blt(a, b, c, d, e)
  BltBatch(a, b, c)
  BltFast(a, b, c, d, e)
  DeleteAttachedSurface(a, b)
  EnumAttachedSurfaces(a, b)
  EnumOverlayZOrders(a, b, c)
  Flip(a, b)
  GetAttachedSurface(a, b)
  GetBltStatus(a)
  GetCaps(a)
  GetClipper(a)
  GetColorKey(a, b)
  GetDC(a)
  GetFlipStatus(a)
  GetOverlayPosition(a, b)
  GetPalette(a)
  GetPixelFormat(a)
  GetSurfaceDesc(a)
  Initialize(a, b)
  IsLost()
  Lock(a, b, c, d)
  ReleaseDC(a)
  Restore()
  SetClipper(a)
  SetColorKey(a, b)
  SetOverlayPosition(a, b)
  SetPalette(a)
  Unlock(a)
  UpdateOverlay(a, b, c, d, e)
  UpdateOverlayDisplay(a)
  UpdateOverlayZOrder(a, b)
  GetDDInterface(a)
  PageLock(a)
  PageUnlock(a)
  SetSurfaceDesc(a, b)
  SetPrivateData(a, b, c, d)
  GetPrivateData(a, b, c)
  FreePrivateData(a)
  GetUniquenessValue(a)
  ChangeUniquenessValue()
  SetPriority(a)
  GetPriority(a)
  SetLOD(a)
  GetLOD(a)
EndInterface
seh ich selbst zum ersten mal.
leider ist das 7er in der win32.hlp nicht beschrieben, da ist nur das erste und das 2er drin.

ich seh hier auf die schnelle auch keine methode, die den pointer zur grafik selber zurückliefert.
::GetAttachedSurface(a, b) selber ermöglicht anscheinend, eine Surface anzuhängen.
win32.hlp -> IDirectDrawSurface::GetAttachedSurface

auf jeden fall ist eine DD-Surface etwas wesentlich komplexeres als ein simpler grafik-speicherbereich.

OT
wenn ich sowas sehe, dann denke ich immer, wieviel ressourcen doch das OS verbrät für seinen ganzen objektkrempel,
und was man aus nem PC wohl rausholen könnte, wenn man ihn wirklich root-like programmieren würde.
man müsste bei nem game ein linux-kernel (deswegen linux, weil man davon den source bekommt) mitliefern,
und das game startet einfach per boot-CD. klar, die hardware-einstellungen wären ein bisschen ein problem,
weil ja heutzutage aller möglicher krempel verwendet werden kann und jeder müll andere treiber braucht....
aber die idee ist einfach reizvoll.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten