Ist hier eine Schlaufe möglich?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Ist hier eine Schlaufe möglich?

Beitrag von duli »

Hallo habe mein kleines Ein mal Eins nun um eine simple Animation erweitert.

Nicht gleich verärgert sein wenn ich auf diese Weise Frage, aber so glaube ich das ich es besser verstehe.

Wenn eine Rechnung falsch eingegeben wurde und enter gedrückt wurde. So wird das ganze ja ausgewertet. Nun soll es aber einen Totenkopf geben der sich schüttelt wenn das Resultat falsch war. Das mache ich in dem ich fünf bildchen haben die den Kopfschütler erzeugen. Diese lade ich in das Programm nachher rufe ich sie mit delays auf um sie ablaufen zu lassen. Ja ich weiss das ist gar nicht die feine, aber es hilft mir zu verstehen.

Nun denke ich mir das das ganze auch mit einer Schlaufe gemacht werden kann, und das anstelle fünf Bilder auch eines genommen werden kann wo dann immer nur den bereich dargestellt wir welches die Animation verwendet. Könntet ihr mir helfen anhand des Codes den ich hier poste, mir auf die Sprünge zu helfen. :mrgreen:

Hier der Teil wo ich die Bilder in das Programm lade.

Code: Alles auswählen

;Hier werden die Bilder in das Programm mit eingebunden wenn es Compiliert wird
    DataSection
      Bild1:
      IncludeBinary "Piraten1a.bmp"
    EndDataSection

    DataSection
      Bild2:
      IncludeBinary "Piraten1b.bmp"
    EndDataSection

    DataSection
      Bild3:
      IncludeBinary "Piraten1b1.bmp"
    EndDataSection
    
    DataSection
      Bild4:
      IncludeBinary "Piraten1b2.bmp"
    EndDataSection
    
    DataSection
      Bild5:
      IncludeBinary "Piraten1b3.bmp"
    EndDataSection
    
    DataSection
      Bild6:
      IncludeBinary "Piraten1b4.bmp"
    EndDataSection
    
    DataSection
      Bild7:
      IncludeBinary "Piraten1b5.bmp"
    EndDataSection
Hier der Teil wo ich die Animation erzeuge.

Code: Alles auswählen

If result = Val(GetGadgetText(#EingabeErgebnis))        ;"Wenn" das eingegeben Resultat mit dem berechneten Resultat übereinstimmt
                           
   
   ProcedureReturn #True                               ;wird dem Prozedurresultat mit der Konstante #True "Wahr" zugewiesen.
    
    If CatchImage(#bild2, ?Bild2) ;Hier wird das Bild das in das Programm eingebunden, wobei das ?Bild2 der Wert ist wo das Bild gespeichert wird.
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2));Hier wird das Bild mit dem ImageGadget dargestellt.
     EndIf 
   
   
  Else 
   
      
     If CatchImage(#bild2, ?Bild4) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
        If CatchImage(#bild2, ?Bild5) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
        If CatchImage(#bild2, ?Bild4) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
        If CatchImage(#bild2, ?Bild6) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
        If CatchImage(#bild2, ?Bild7) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
        If CatchImage(#bild2, ?Bild6) 
       ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#bild2))
     EndIf  
      
   Delay(200)
   
   
   
   
  EndIf       
Danke für eure Geduld
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du kannst alle Bilder in eine Datasection packen:

Code: Alles auswählen

DataSection
  Bild1:
  IncludeBinary "Piraten1a.bmp"
  Bild2:
  IncludeBinary "Piraten1b.bmp"
  ; ... 
EndDataSection
Dann einmal alle Bilder Catchen, Ergebnis in einer Variablen/Konstanten
speichern, dann brauchste nur noch das Bild wechseln.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

:allright: Danke vielmals.

Den ersten Teil habe ich verstanden, aber den Teil mit dem Catchen bin ich nicht mit gekommen, wie ist das Konkret? :oops:
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

Enumeration ; catched bmps
  #cBild1
  #cBild2
  #cBild3
  ; usw.
EndEnumeration

CatchImage(#cBild1, ?Bild1)
CatchImage(#cBild2, ?Bild2)
; usw.

If result = Val(GetGadgetText(#EingabeErgebnis))        ;"Wenn" das eingegeben Resultat mit dem berechneten Resultat übereinstimmt
                           
   
   ProcedureReturn #True                               ;wird dem Prozedurresultat mit der Konstante #True "Wahr" zugewiesen.
   
    ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#cBild1));Hier wird das Bild mit dem ImageGadget dargestellt.
  
  Else
    ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#cBild2))
    Delay(200)
    ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#cBild3))
    Delay(200)
    ImageGadget(#Konstante_Bildfunktion2, 110, 220, 100, 70, ImageID(#cBild4))
    ; usw.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

:mrgreen: Danke vielmals, jetzt ist mir der Groschen gefallen. Danke. :allright:
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

duli hat geschrieben::mrgreen: Danke vielmals, jetzt ist mir der Groschen gefallen. Danke. :allright:
Dann solltest Du ihn schnell wieder aufheben, Du weißt ja:
Wer den Groschen nicht Ehrt, den Taler nicht Wert :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

ts-soft hat geschrieben:
duli hat geschrieben::mrgreen: Danke vielmals, jetzt ist mir der Groschen gefallen. Danke. :allright:
Dann solltest Du ihn schnell wieder aufheben, Du weißt ja:
Wer den Groschen nicht Ehrt, den Taler nicht Wert :mrgreen:
rofl, Dagobert aus Berlin spricht ;)
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn mich schon jeder kennt, hier ein Bild von mir
Bild
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

[total offtopic]
ich dachte du meinst den hier
[/total offtopic]
Rings hat geschrieben:ziert sich nich beim zitieren
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Topic

die von ts vorgeschlagene Variante ist aber eher unüblich.
eine konstantenfolge ermöglicht nunmal kein arbeiten mit einer Schleife.

beim einlesen kann man noch keine schleife verwenden, weil man ja die labels direkt angeben muss.
(es gibt eine methode auch hier ne schleife verwenden zu können, aber die ist etwas aufwendiger...)

Code: Alles auswählen

Dim AnimImages(5)

AnimImages(1) = CatchImage(#PB_Any, ?Bild1)
AnimImages(2) = CatchImage(#PB_Any, ?Bild2)
AnimImages(3) = CatchImage(#PB_Any, ?Bild3)
AnimImages(4) = CatchImage(#PB_Any, ?Bild4)
AnimImages(5) = CatchImage(#PB_Any, ?Bild5)
du erzeugst also ein array, in dem du die IDs der fünf Images speicherst.
die ID wird von CatchImage zurückgeliefert, wenn man es mit #PB_Any benutzt.

anzeigen kannst du das bild jetzt mit

Code: Alles auswählen

SetGadgetState(#Konstante_Bildfunktion2, AnimImages(Nr))
und Nr kann auch eine Schleifenvariable sein, du kannst jetzt also eine Schleife verwenden.

den Befehl ImageID() brauchst du in diesem fall nicht mehr,
weil die erzeugung mit #PB_Any die ID zurückliefert.
wenn du in dem array die Nummer gespeichert hättest, müßtest du ImageID() weiterhin benutzen.

übrigens:
auch vorher schon hättest du das Bild anzeigen können mit

Code: Alles auswählen

SetGadgetState(#Konstante_Bildfunktion2, ImageID(#cBild2))
es ist nicht nötig, jedesmal das Gadget neu zu erzeugen, es genügt, das bild zu wechseln!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten