Seite 1 von 1

Speicheradresse eines Sprites ermitteln.

Verfasst: 06.12.2006 02:37
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.

Verfasst: 06.12.2006 02:56
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
  

Verfasst: 06.12.2006 04:32
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:

Verfasst: 06.12.2006 10:14
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.