Sprite, Mouse und kein "ClearSprite"

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Sprite, Mouse und kein "ClearSprite"

Beitrag von irobot »

Tach ihr lieben,

nach dem ich also in mühseeliger Kleinarbeit mein Programm
endlich so weit habe, zwei verschiedene Sprites wechselweise
mit dem Mauszeiger zu bewegen, weiss ich nun nicht, warum
diese auch nach dem MouseButton(2) noch am Mauszeiger hängen
(trotz FreeSprite danach) und warum diese weg sind, wenn ich
auf den ersten Button klicke.

Wer weiss Rat ?

Hier also das komplette Programm

Code: Alles auswählen

Declare SPRITE1_UEBR_FLAECHE_BEWEGEN()
Declare SPRITE2_UEBR_FLAECHE_BEWEGEN()

OpenWindow(1, 0, 0, 640, 480, #PB_Window_SystemMenu |#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget | #PB_Window_SizeGadget| #PB_Window_MaximizeGadget | #PB_Window_TitleBar , "...")

CreateGadgetList(WindowID(1))
ButtonGadget(2, 530, 30, 112, 20, "Nichts")
ButtonGadget(3, 530, 50, 112, 20, "Sprite 1")
ButtonGadget(4, 530, 70, 112, 20, "Sprite 2")

InitKeyboard()
InitSprite() 
InitMouse()   

OpenWindowedScreen(WindowID(1), 1, 1, 640-112, 480-76, 0, 1,1)
CreateSprite(100, 640-112, 480-76)                      ;der schwarze Hintergrund

Repeat
   EVENT = WaitWindowEvent() 
   If EVENT
         Select EventGadgetID()
            Case 3
               SPRITE1_UEBR_FLAECHE_BEWEGEN()
            Case 4
               SPRITE2_UEBR_FLAECHE_BEWEGEN()
         EndSelect
   EndIf   
Until WaitWindowEvent()=#PB_Event_CloseWindow 


Procedure SPRITE1_UEBR_FLAECHE_BEWEGEN()
   LoadSprite(101, "sprite_1.bmp")
   Repeat
      FlipBuffers()
      DisplaySprite(100, 1, 1)
      ExamineMouse()
      DisplaySprite(101, WindowMouseX(), WindowMouseY())
      ExamineKeyboard()
      If MouseButton(2)
         ReleaseMouse(1)
         FreeSprite(101)
         Break
      EndIf
   ForEver 
EndProcedure


Procedure SPRITE2_UEBR_FLAECHE_BEWEGEN()
   LoadSprite(102, "sprite_2.bmp")
   Repeat
      FlipBuffers()
      DisplaySprite(100, 1, 1)
      ExamineMouse()
      DisplaySprite(102, WindowMouseX(), WindowMouseY())
      ExamineKeyboard()
      If MouseButton(2)
         ReleaseMouse(1)
         FreeSprite(102)
         Break
      EndIf
   ForEver 
EndProcedure
sprite_1.bmp und sprite_2.bmp sind einfach so kleine Bildchen

Vielen Dank nochmals im voraus für eure Hilfe !

Grüsse
irobot
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Beitrag von irobot »

habe eben (25.10. 20:15) noch ein paar
Kleinigkeiten im Code richtig gestellt

Sorry

Grüsse
irobot
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Meines Erachtens hast Du das Program zu sehr "proceduret".

Pack die Loadsprites außerhalb der Proceduren (unterhalb createsprite(100...) ) und sieh Dir die Fehlermeldung nach
Klicken der rechten Maustaste mal an.


übrigens .. die Maus "verschwindet" nur weil Du ExamineMouse()
benutzt was aber gar nicht notwendig ist da Du ja WindowMouseX()
bzw. WindowMouseY() zur Positionsbestimmung einsetzt und nicht MouseX() und MouseY().
Lass das ExamineMouse mal ganz weg.

Ohne Prozeduren und mit sichtbarer Maus sieht das dann so
aus. (Bilddateinamen anpassen)

und dann noch : ein WaitWindowEvent() in der Schleife reicht.

Code: Alles auswählen

OpenWindow(1, 0, 0, 640, 480, #PB_Window_SystemMenu |#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget | #PB_Window_SizeGadget| #PB_Window_MaximizeGadget | #PB_Window_TitleBar , "...")

CreateGadgetList(WindowID(1))
ButtonGadget(2, 530, 30, 112, 20, "Nichts")
ButtonGadget(3, 530, 50, 112, 20, "Sprite 1")
ButtonGadget(4, 530, 70, 112, 20, "Sprite 2")


InitSprite()


OpenWindowedScreen(WindowID(1), 1, 1, 640-112, 480-76, 0, 1,1)
CreateSprite(100, 640-112, 480-76)                      ;der schwarze Hintergrund
LoadSprite(101, "d:\sprite1.bmp")
LoadSprite(102, "d:\sprite2.bmp")

Repeat
  EVENT = WaitWindowEvent()
  Debug event
  If event=517
  ShowCursor_(0)
  EndIf
  If event=514
  ShowCursor_(1)
  EndIf
  
  ;If EVENT
    Select EventGadgetID()
    Case 2
    
    Case 3
      FlipBuffers()
      DisplaySprite(100, 1, 1)
      DisplaySprite(101, WindowMouseX(), WindowMouseY())
    Case 4
      FlipBuffers()
      DisplaySprite(100, 1, 1)
      DisplaySprite(102, WindowMouseX(), WindowMouseY())
    EndSelect
  ;EndIf
Until Event=#PB_Event_CloseWindow

FreeSprite(100) ; das ist unnötig weil eh am Ende passiert (hoffe ich)
FreeSprite(101) ; das ist unnötig weil eh am Ende passiert (hoffe ich)

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Beitrag von irobot »

Hi bobobo,

vielen Dank erstmal für deine Hilfe !

Frage: Wie kann ich das machen, damit das Sprite
vom Mauszeiger wieder verschwindet ?
Momentan geht das ja komischerweise nur, wenn
ich Taste 2 drücke, wieso eigentlich ?

Wie muss die Zeile denn lauten ? Welchen "Befehl"
gibt es, der den Sprite(x) unsichtbar werden lässt ?

Nochmals dank im voraus

Wenn ich diesen Kram endlich zum laufen gekriegt
habe, kann ich mich in Ruhe selbst um den ganzen
Rest kümmern. Dann gehe ich euch hoffentlich
nicht mehr so oft auf'm Senkel

BTW: was ist eigentlich event 514 und 517 ?

Grüsse
irobot
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wie muss die Zeile denn lauten ? Welchen "Befehl" gibt es, der den Sprite(x) unsichtbar werden lässt ?

wenn es wirklich ein sprite ist, solltest du ihn einfach nicht anzeigen... ;)

wenn es ein ImageGadget ist, müßte es ein Visible-Flag haben, das man löschen kann...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag von crossroads »

@irobot:
So; hier eine überarbeitete Version Deines Codes mit ein paar Elementen aus dem Code von bobobo:

Code: Alles auswählen

Declare SPRITE1_UEBR_FLAECHE_BEWEGEN() 
Declare SPRITE2_UEBR_FLAECHE_BEWEGEN() 

OpenWindow(1, 0, 0, 640, 480, #PB_Window_SystemMenu |#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget | #PB_Window_SizeGadget| #PB_Window_MaximizeGadget | #PB_Window_TitleBar , "...") 

CreateGadgetList(WindowID(1)) 
ButtonGadget(2, 530, 30, 112, 20, "Nichts") 
ButtonGadget(3, 530, 50, 112, 20, "Sprite 1") 
ButtonGadget(4, 530, 70, 112, 20, "Sprite 2") 

InitSprite() 

OpenWindowedScreen(WindowID(1), 1, 1, 640-112, 480-76, 0, 1,1) 
CreateSprite(100, 640-112, 480-76)                      ;der schwarze Hintergrund 

CreateSprite(101, 40, 40)                               ;Sprite #1
StartDrawing(SpriteOutput(101))
Box(0,0,40,40,RGB($80,$FF,$0))                          ;gruenes Quadrat
StopDrawing()

CreateSprite(102, 40, 40)                               ;Sprite #2
StartDrawing(SpriteOutput(102))
Box(0,0,40,40,RGB($FF,$0,$0))                           ;rotes Quadrat
StopDrawing()

Repeat 
  Event = WaitWindowEvent() 
  If Event = #PB_EventGadget 
    Select EventGadgetID()
      Case 3 
        SPRITE1_UEBR_FLAECHE_BEWEGEN() 
      Case 4 
        SPRITE2_UEBR_FLAECHE_BEWEGEN() 
    EndSelect 
  EndIf    
Until Event = #PB_Event_CloseWindow 
End



Procedure SPRITE1_UEBR_FLAECHE_BEWEGEN() 
  ShowCursor_(0) ; cursor verbergen 
  Repeat 
    DisplaySprite(100, 0, 0) ; Hintergrund an Position (0,0) => linke obere Ecke ... 
    DisplaySprite(101, WindowMouseX(), WindowMouseY()) ; ... und Sprite #1 ...  
    FlipBuffers() ; ... anzeigen
    Delay(5)
  Until WindowEvent() = 516 ; rechte Maustaste: 
  DisplaySprite(100, 0, 0) ; Hintergrund an Position (0,0) => linke obere Ecke ... 
  FlipBuffers() ; ... anzeigen
  ShowCursor_(1) ; cursor anzeigen 
EndProcedure 


Procedure SPRITE2_UEBR_FLAECHE_BEWEGEN() 
  ShowCursor_(0) ; cursor verbergen 
  Repeat 
    DisplaySprite(100, 0, 0) ; Hintergrund an Position (0,0) => linke obere Ecke ... 
    DisplaySprite(102, WindowMouseX(), WindowMouseY()) ; ... und Sprite #2 ... 
    FlipBuffers() ; ... anzeigen
    Delay(5)
  Until WindowEvent() = 516 ; rechte Maustaste: 
  DisplaySprite(100, 0, 0) ; Hintergrund an Position (0,0) => linke obere Ecke ... 
  FlipBuffers() ; ... anzeigen
  ShowCursor_(1) ; cursor anzeigen 
EndProcedure 
Anmerkung:
Mit FreeSprite() entfernt man das Sprite aus dem Speicher, aber nicht vom Screen. Dafür muß man den Screen neu zeichnen - ohne das unerwünschte Sprite ... und noch ein paar kleinere Fehler - siehe Kommentare in Code :wink:
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Beitrag von irobot »

1000 Dank an euch, jetzt geht es !

:-)

Grüsse
irobot
_________________________________
Wer fragt, ist ein Narr für 5 Minuten, wer
nicht fragt, ist ein Narr das ganze Leben
Antworten