Image auf ein Sprite zeichnen. Geht das ?

Anfängerfragen zum Programmieren mit PureBasic.
teachco
Beiträge: 48
Registriert: 12.07.2005 19:44

Image auf ein Sprite zeichnen. Geht das ?

Beitrag von teachco »

Hallo,

ich hatte vor, ein Image zu laden und das dann auf ein Sprite zu zeichnen neben einigen anderen Dingen, z.B. Text mit DrawText.
Leider scheint das nicht zu funktionieren. Das Bild wird einfach ignoriert.
Hat jemand eine Idee?

Andi

Code: Alles auswählen

Global id0x.l ,id0y.l, id1x.l ,id1y.l
id0x = 200
id0y = 200

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
  MessageRequester("System-Error","Kann DirectX nicht laden",0) 
  Else
  ;MessageRequester("Kontrolle","DirectX okay.",0) 
EndIf 

WinProperties.l = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_SizeGadget 
If OpenWindow(0, 5, 5, 1024, 1024/16*9+2, WinProperties , "T-Constructor") = 0
Else
;MessageRequester("Kontrolle","Window okay",0)
ImageID1 = LoadImage(#PB_Any,"testbild.bmp")
;MessageRequester("Kontrolle",Str(ImageID1),0)


If OpenWindowedScreen(WindowID(),4, 50, 1024 - 85, 1024/16*9 - 74, 0, 0, 0) = 0
Else
SpriteID0 = CreateSprite(#PB_Any, 20, 20)
If StartDrawing(SpriteOutput(SpriteID0))
   DrawingMode(1 | 4)
   FrontColor(230,230,230)
   Box(1,1,19,19)
   StopDrawing()
EndIf
SpriteID1 = CreateSprite(#PB_Any, 300, 300)
If StartDrawing(SpriteOutput(SpriteID1))
   DrawingMode(1 | 4)
   FrontColor(230,230,230)
   Box(1,1,299,299)
   FrontColor(0,0,100)
   ;MessageRequester("Kontrolle",Str(ImageID1),0)
   DrawImage(ImageID1, 10, 10 ) 
   DrawText("Dieses ist ein Text, der angezeigt wird.")
   StopDrawing()
EndIf
Repeat 
    FlipBuffers(): ClearScreen(255,255,255) 
    If StartDrawing(ScreenOutput())
       ;DrawingMode(0)
       ;FrontColor(255,0,0)
       ;Box(0, 0, 1024 - 85, 1024/16*9 - 74) 
       ;FrontColor(255,0,255)
       ;DrawText("Blabla")
       ImageID10 = CreateImage(#PB_Any, 50, 50)
       DrawImage(ImageID1, 100, 100 )
       StopDrawing()
    EndIf
    ;FlipBuffers() 


  
    DisplayTransparentSprite(SpriteID1, id1x ,id1y)
    DisplayTransparentSprite(SpriteID0, id0x ,id0y)
    ;DisplayTransparentSprite(SpriteID0, 100, 100)
 
    Delay(1)
    
    id0x = WindowMouseX()
    id0y = WindowMouseY()-50
    
    If SpriteCollision(SpriteID0,  id0x ,id0y, SpriteID1, id1x ,id1y) And LButtondownOn
       SpriteCollisionOn = 1
    EndIf

       If LButtondownOn And SpriteCollisionOn
          ;MessageRequester("Kontrolle","Kollision",0)
           id0x = WindowMouseX()
           id0y = WindowMouseY()-50
           id1x = WindowMouseX()
           id1y = WindowMouseY()-50
          ;DisplayTransparentSprite(SpriteID0, id0x ,id0y)
       Else
          ;DisplayTransparentSprite(SpriteID1, WindowMouseX(), WindowMouseY()-50)
          ;DisplayTransparentSprite(SpriteID0, id0x ,id0y)    
       EndIf

    EventID.l = WindowEvent()
    If EventID = #WM_LButtonDown
       ;MessageRequester("Kontrolle","link. Mousebutton down",0)
       LButtondownOn = 1

    EndIf
    If EventID = #WM_LButtonUp
       ;MessageRequester("Kontrolle","link. Mousebutton down",0)
       LButtondownOn = 0
       SpriteCollisionOn = 0

    EndIf
    
    If EventID = #PB_Event_CloseWindow
           quit = 1
    EndIf
Until quit=1    
EndIf


EndIf
Zuletzt geändert von teachco am 13.07.2005 18:10, insgesamt 1-mal geändert.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

mit useimage() gehts

Code: Alles auswählen

...
DrawImage(UseImage(ImageID1), 100, 100 ) 
...
(der debugger meldet sich sonst auch)
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
teachco
Beiträge: 48
Registriert: 12.07.2005 19:44

Beitrag von teachco »

Vielen Dank!
Da bin ich aber erstaunt.

Code: Alles auswählen

ImageID1 = LoadImage(#PB_Any,"testbild.bmp")
Mit #PB_Any sorgt man dafür, dass als Ergebnis, also nach ImageID1 die Bild-ID geschrieben wird.
Demnach dürfte man bei

Code: Alles auswählen

DrawImage(UseImage(ImageID1), 10, 10 )
UseImage GERADE NICHT anwenden, da ImageID1 die ID ja schon hat.

Code: Alles auswählen

Syntax
Ergebnis = UseImage(#Image)

Beschreibung
Ändert das aktuelle Bild in das angegebene neue Bild '#Image'. 'Ergebnis' enthält die ImageID des neuen aktuellen Bildes. 
Die funktionierende Lösung ist also irgendwie doppelt, nach dem Motto die ID von der ID.
Das muss man wohl nicht verstehen. Oder ?

Oder die Beschreibung anpassen:
Für #Image kann man auch die Bild-ID angeben, um zu erreichen, dass dieses Bild zum aktuellen wird.

Ich finde das auf jeden Fall irreführend.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Ja, das tue ich auch und hab´s am Anfang auch immer vergessen und mich gewundert :o warum das denn nicht geht...
Enzwichen hab ich mich dran gewöhnt, es wird wohl seine Grund haben, warum das so ist...:roll:
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Antworten