Bild auf Benutzeroberfläche bewegen?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von bobobo »

nochmal ein Beispiel mit etwas fixierterer Positionierung und etwas hin und Her

Code: Alles auswählen

img=CreateImage(#PB_Any,50,50)
StartDrawing(ImageOutput(img))
  Box(0,0,50,50,#Red)
  Circle(25,25,24,#Yellow)
  
  Ellipse(25,28,12,5,#Black)
  Ellipse(25,26,14,5,#Yellow)
  
  Ellipse(15,15,3,5,#Black)
  Ellipse(35,15,3,5,#Black)
  
StopDrawing()

win=OpenWindow(#PB_Any,0,0,400,400,"test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ig=ImageGadget(#PB_Any,0,0,50,50,ImageID(img))

tim=1

AddWindowTimer(win,tim,10)
Repeat
  event=WaitWindowEvent()
  etimer=EventTimer()
  Select event
    Case #PB_Event_CloseWindow
      quit+1
    Case #PB_Event_Timer
      Select etimer
        Case tim
          If x=200
            ad=-1
          EndIf
          If x=0
            ad=1
          EndIf
          x+ad
          ResizeGadget(ig,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
      EndSelect
  EndSelect
Until quit
End
oder manuell

Code: Alles auswählen

img=CreateImage(#PB_Any,50,50)
StartDrawing(ImageOutput(img))
  Box(0,0,50,50,#Red)
  Circle(25,25,24,#Yellow)
  
  Ellipse(25,28,12,5,#Black)
  Ellipse(25,26,14,5,#Yellow)
  
  Ellipse(15,15,3,5,#Black)
  Ellipse(35,15,3,5,#Black)
  
StopDrawing()

win=OpenWindow(#PB_Any,0,0,400,400,"test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ig=ImageGadget(#PB_Any,0,0,50,50,ImageID(img))

tim=1

Repeat
  event=WaitWindowEvent()
  etimer=EventTimer()
  Select event
    Case #PB_Event_CloseWindow
      quit+1
    Case #PB_Event_Timer
      Select etimer
        Case tim
          If x=200
            ad=-1
          EndIf
          If x=0
            ad=1
          EndIf
          
          x+ad
          
          
      EndSelect
  EndSelect
  ResizeGadget(ig,WindowMouseX(win)-25,WindowMouseY(win)-25,#PB_Ignore,#PB_Ignore)
Until quit
End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von NeoRon »

habs probiert aber iwie tut sich nix

Code: Alles auswählen

    
  Repeat
   
    #FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered 
     If OpenWindow(#FENSTER_HAUPT, 0, 0, 800, 600, "Test", #FLAGS)

LoadImage(#pixelmann, "pixelm.bmp")
      ImageGadget(#BILD_pixelmann_ANZEIGE, 50, 300, 50, 50, ImageID(#pixelmann), #PB_Image_Border)
      
      LoadImage(#BILD_spielmap_DATEI, "landschaft.bmp")
      ImageGadget(#BILD_spielmap_ANZEIGE, 0, 0, 800, 600, ImageID(#BILD_spielmap_DATEI), #PB_Image_Border)

     tim=1

AddWindowTimer(win,tim,10)
Repeat
  ereignis=WaitWindowEvent()
  etimer=EventTimer()
Select Ereignis
           
          Case #PB_Event_Gadget 
      Select EventGadget()
                        Case #PB_Event_Timer
              Select etimer
                  
        Case tim
    
          If x=200
            ad=-1
          EndIf
          If x=0
            ad=1
          EndIf
          x+ad
          ResizeGadget(#BILD_pixelmann_ANZEIGE,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
      EndSelect
  EndSelect
  EndSelect
     
Until Ereignis = #PB_Event_CloseWindow Or Ende = #True

End
 ForEver
Könnt ihr mal drüber schaun.
Thx
The World is Cyber
Salk
Beiträge: 6
Registriert: 12.12.2012 20:46

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von Salk »

Ich glaube dir ist mehr geholfen, wenn wir dir zeigen, wie du in Zukunft solche Fehler selber aufspüren kannst.

Code: Alles auswählen

Repeat
  
  #FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
  If OpenWindow(#FENSTER_HAUPT, 0, 0, 800, 600, "Test", #FLAGS)
    
    LoadImage(#pixelmann, "pixelm.bmp")
    ImageGadget(#BILD_pixelmann_ANZEIGE, 50, 300, 50, 50, ImageID(#pixelmann), #PB_Image_Border)
    
    LoadImage(#BILD_spielmap_DATEI, "landschaft.bmp")
    ImageGadget(#BILD_spielmap_ANZEIGE, 0, 0, 800, 600, ImageID(#BILD_spielmap_DATEI), #PB_Image_Border)
    
    tim=1
    
    AddWindowTimer(win,tim,10)
    Repeat
      ereignis=WaitWindowEvent()
      etimer=EventTimer()
      Select Ereignis
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #PB_Event_Timer
              Select etimer
                  
                Case tim
                  
                  If x=200
                    ad=-1
                  EndIf
                  If x=0
                    ad=1
                  EndIf

                  Debug "ad: " + Str(ad)    ;Du erwartest, dass dieser Wert entweder -1 oder 1 ist.

                  x+ad
                  Debug "x: " + Str(x)

                  ResizeGadget(#BILD_pixelmann_ANZEIGE,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
              EndSelect
          EndSelect
      EndSelect
      
    Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
    
    End
  ForEver
Wenn irgendwas nicht so funktioniert, wie du dir das vorstellst, ist es immer hilfreich, sich die Werte der Variablen anzuschauen. (Entweder unter "Variablen" im Debugger oder mit dem Debug-Befehl)
Ich glaube du kommst von selbst auf das Problem, wenn du meine Änderung kurz laufen lässt.
Der Code ist so übrigens immer noch nicht lauffähig, aber ich gehe davon aus, dass das nur ein Ausschnitt sein soll.

Falls das das Problem nicht lösen sollte, poste bitte einen kompletten, lauffähigen Code. Hier den Fehler zu finden ist nicht ganz leicht.

Für was soll eigentlich diese äußerste Repeat-Schleife sein? Im Originalcode ist die aber nicht, oder?
Benutzeravatar
Dave
Beiträge: 22
Registriert: 12.06.2011 21:39
Computerausstattung: Windows 10 x64, Intel Core i7 7700k @4.2Ghz, 16GB RAM, PureBasic 5.72

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von Dave »

Hi,

Das Problem ist, dass du nach "Eventgadet()" den Timer abfragst.

So ist es richtig:
(fast richtig :bobobo ..der EventTimer wird hier zweimal aufgerufen, besser wäre
beim zweiten Mal die Abfrage der Variablen etimer, die ja schon das EventTimer()-Ereignis enthält)

Code: Alles auswählen


If OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  LoadImage(#pixelmann, "pixelm.bmp")
  ImageGadget(#BILD_pixelmann_ANZEIGE, 50, 300, 50, 50, ImageID(#pixelmann), #PB_Image_Border)
  
  LoadImage(#BILD_spielmap_DATEI, "landschaft.bmp")
  ImageGadget(#BILD_spielmap_ANZEIGE, 0, 0, 800, 600, ImageID(#BILD_spielmap_DATEI), #PB_Image_Border)
  
  
  AddWindowTimer(win,1,10)
  
  Repeat
    ereignis=WaitWindowEvent()
    etimer=EventTimer()
    
    Select ereignis  
      Case #PB_Event_Timer
        If EventTimer() = 1
          If x=200  :  ad=-1  :  EndIf
          If x=0    :  ad=1   :  EndIf
          x+ad
          ResizeGadget(#BILD_pixelmann_ANZEIGE,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
        EndIf
    EndSelect
    
  Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
EndIf
End
Lg Dave
Bild Bild Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von bobobo »

ich habe mal eine ALternative gebastelt .. malen auf einem Canvas statt mit ImageGadgets rumzutun
der "Pixelmann" hat hier Transparenz. Meine Bilder sind hier
landschaft
pixelmann

Code: Alles auswählen

UsePNGImageDecoder()

Enumeration ;gadgets und images
  #pixelmann  
  #BILD_spielmap_DATEI
  #canvas
EndEnumeration

Procedure drawcanvas(x)
  StartDrawing(CanvasOutput(#canvas))
    DrawImage(ImageID(#BILD_spielmap_DATEI),0,0)
    DrawAlphaImage(ImageID(#pixelmann),x,Sin(x/10)*10+10)
  StopDrawing()
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  LoadImage(#pixelmann, "d:\pixelm.png")
  LoadImage(#BILD_spielmap_DATEI, "d:\landschaft.png")
  CanvasGadget(#canvas,0,0,800,600)
  AddWindowTimer(win,1,1)
  
  Repeat
    ereignis=WaitWindowEvent()
    etimer=EventTimer()
    
    Select ereignis  
      Case #PB_Event_Timer
        If Etimer = 1
          If x=200  :  ad=-1  :  EndIf
          If x=0    :  ad=1   :  EndIf
          x+ad
          drawcanvas(x)

        EndIf
    EndSelect
    
  Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
EndIf
End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von NeoRon »

Soweit so gut und erstmals vielen Dank.
Hab nun 2 Probleme noch.

1.Einmal das die anderen Gadgets (Button Gadgets) nicht mehr funktionieren.
2.Das Image es übermalt diese auch.

Hier der Code:

Code: Alles auswählen

Repeat
  Enumeration
  #FENSTER_HAUPT
  #KNOPF_zuruck  
  #pixelmann
  #BILD_pixelmann_ANZEIGE
  #BILD_spielmap_DATEI
  #BILD_spielmap_ANZEIGE
EndEnumeration

Declare pixelmann()

Procedure pixelmann()
  Repeat
    
    #FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered 
    
    
    If OpenWindow(#FENSTER_HAUPT, 0, 0, 800, 600, "Test", #FLAGS)
      
      ButtonGadget(#KNOPF_zuruck, 600, 70, 180, 30, "zurück")
      LoadImage(#pixelmann, "pixelm.bmp")
      ImageGadget(#BILD_pixelmann_ANZEIGE, 50, 300, 50, 50, ImageID(#pixelmann), #PB_Image_Border)
      
      LoadImage(#BILD_spielmap_DATEI, "landschaft.bmp")
      ImageGadget(#BILD_spielmap_ANZEIGE, 0, 0, 800, 600, ImageID(#BILD_spielmap_DATEI), #PB_Image_Border)
      
      
      
      AddWindowTimer(#FENSTER_HAUPT,1,10)
      Repeat
        ereignis=WaitWindowEvent(1)
              Select Ereignis
            
            
          Case #PB_Event_Timer  
            If EventTimer() = 1
              
              If x=200
                ad=-1
              EndIf
              If x=0
                ad=1
              EndIf
              x+ad
              ResizeGadget(#BILD_pixelmann_ANZEIGE,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
            EndIf
            Select EventGadget()
              Case #PB_Event_Gadget 
              Case #KNOPF_zuruck
                
            EndSelect
        EndSelect
        
      Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
      
      End
    EndIf
  ForEver
EndProcedure


          
Bin bei der Select Case Befehl geblieben weil diese mir vertraut ist.

Grüße NeoRon
The World is Cyber
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von bobobo »

1. sollte man Gadgets nicht überlagern. Dafür sind die eigentlich nicht geeignet.

2. Sollte man ein Ereignis auf einem Knopf auch abfangen
gucke den code

(In der IDE kann man auch nachträglich den Code automatisch einrücken der markierte Bereich
wird mit Strg-i automatisch zurechtgerückt. Gerade bei Schleifenkonstrukten geht die Übersicht
sonst sehr leicht den Bach runter.)

Code: Alles auswählen

Enumeration
  #FENSTER_HAUPT
  #KNOPF_zuruck  
  #pixelmann
  #BILD_pixelmann_ANZEIGE
  #BILD_spielmap_DATEI
  #BILD_spielmap_ANZEIGE
EndEnumeration

Declare pixelmann()

Procedure pixelmann()
  Repeat
    
    #FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered 
    
    If OpenWindow(#FENSTER_HAUPT, 0, 0, 800, 600, "Test", #FLAGS)
      
      ButtonGadget(#KNOPF_zuruck, 600, 70, 180, 30, "zurück")
      LoadImage(#pixelmann, "pixelm.bmp")
      ImageGadget(#BILD_pixelmann_ANZEIGE, 50, 300, 50, 50, ImageID(#pixelmann), #PB_Image_Border)
      
      LoadImage(#BILD_spielmap_DATEI, "landschaft.bmp")
      ImageGadget(#BILD_spielmap_ANZEIGE, 0, 0, 800, 600, ImageID(#BILD_spielmap_DATEI), #PB_Image_Border)

      AddWindowTimer(#FENSTER_HAUPT,1,10)
      Repeat
        ereignis=WaitWindowEvent() ; ein timeout ist erstmal unnötig
        egadget=EventGadget() ; hier das Gadget merken (wenns eins gibt)
        Select Ereignis
          Case #PB_Event_Timer  
            If EventTimer() = 1
              If x=200
                ad=-1
              EndIf
              If x=0
                ad=1
              EndIf
              x+ad
              ResizeGadget(#BILD_pixelmann_ANZEIGE,x,Sin(x/10)*10+10,#PB_Ignore,#PB_Ignore)
            EndIf
          Case #PB_Event_Gadget
            Select egadget
              Case #KNOPF_zuruck
                Select ad
                  Case -1
                    ad=1
                  Case 1
                    ad=-1
                EndSelect
            EndSelect
        EndSelect
      Until Ereignis = #PB_Event_CloseWindow Or Ende = #True
      End
    EndIf
  ForEver
EndProcedure
pixelmann()
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von NeoRon »

Hallo,

Danke, hat mir sehr weiter geholfen.
Hab einiges gelernt und verstanden.

Nun noch ne frage was wäre denn für bewegte bilder sprich Grafiken in ner Gafischen Benutzeroberfläche am besten geeignet.

Grüße

Ron
The World is Cyber
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von bobobo »

ämm

erläuter das mal näher

was wilst du eigentlich letztlich bauen?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Bild auf Benutzeroberfläche bewegen?

Beitrag von NeoRon »

Also ich mache mini test programme sozusagen um zu üben.
Das aktuelle Programm will ich üben mit beweglichen Grafikgadget umzugehen.

Gerade versuch ich ein programm zu schreiben das eine Figur wie hier der Pixelmann mit kollisionsberechnung rum fliegt und den mario per Tastaur bewegen kann. Soweit hab ich das nun auch und nun will ich noch das der Mario bei einer anderen Figur sprich bereich ein event auslöst wie eine Sprechblase.

Und die frage war ob man auch nen image bewegen kann das kein gadget ist sprich das es sich nicht mit den gadgets beist.

Grüße
Ron
The World is Cyber
Antworten