Seite 1 von 4

ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 16:04
von stevie1401
Hallo Leute!

Zunächst einmal muss ich sagen, ich habe PB erst neu entdeckt und finde es recht gut.
Auch dieses Forum macht mit den freundlichen Helfern einen tollen Eindruck.

Nun komme ich aus der Freebasic und GFA-Basic Ecke und dort ist vieles vollkommen anders.
Deshalb tue ich mich (noch) etwas schwer einige Dinge zu verstehen.

Ich habe 12 ImageGadgets erstellt, in den Spielkarten geladen sind.
Nun möchte ich den ImageGadgets neue Karten geben, bzw. einige Karten löschen und unsichtbar machen. (Wird ein Kartenspiel).

Es wäre sehr nett, wenn ihr mir ein brauchbares Beispiel nennen könntet.
Hier mein Code:

Code: Alles auswählen

Dim meineKarte.i(12)
Dim nr(12)

For i=1 To 12
  ppic.s=Str(i)+".jpg"  ;Name und Ort der Karte, die erste heisst einfach 1.jpg, die zweite 2.jpg usw
  ppic=meinkartenordner+ppic  ;Ort wo die Karten auf dem Rechner liegen
    nr(i)=LoadImage(#PB_Any,ppic)  ;hier fängt die Verständnisschwierigkeit schon an. Was ist nr(i)? Ich das der Ansprechpunkt des Bildes?

  meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)), #PB_Image_Border)  ;was ist meineKarte(i)? Kann ich über meineKarte(i) das ImageGadget irgendwie      ansprechen?

  GadgetToolTip(meineKarte(i), "tooltiptest")
  
Next i
SetGadgetState(1,ImageID(2)  ;hier möchte ich ImageGadget 1 eine neue Karte geben, funktioniert aber son nicht
 
Bin für jede Hilfe dankbar.

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 16:37
von ts-soft
Hast Dir ja einen etwas komplizierten Code ausgesucht :D
aber nicht desto trotz wollen wir das ganze mal aufknüddeln.
In nr(i) wird das Image gespeichert. Die ImageID ist dann ImageID(nr(i)).
In meineKarte(i) wird dasselbe für das ImageGadget getan, so das daraus
folgt:

Code: Alles auswählen

SetGadgetState(meineKarte(1), ImageID(nr(2)))
Ich hoffe das funktioniert so, hab es nicht getestet. Es wäre auf jeden fall
besser, wenn Du einen komplett ausführbaren Code bereitstellst, weil solche
"Trockenübungen" doch nicht so erbaulich sind :wink:

Gruß
Thomas

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 18:20
von stevie1401
Der Code ist von mir ;-)
Ich habe es inzwischen verstanden, denke ich.
Allerdings habe ich folgendes festgestellt:
Wenn ich
SetGadgetState(meineKarte(7),0)
mache, wird die siebte Karte gelöscht, aber der Hintergrund wird nicht restauriert, sondern es bleibt ein grauer Hintergrund.
Kann man das irgendwie ändern?

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 18:33
von NicTheQuick
Was meinst du mit restaurieren? Ein ImageGadget hat normalerweise kein Hintergrund.

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 18:41
von ts-soft
Und ein Hinweis noch: Ein Array ist nullbasiert, Du erzeugst also 2 Arrays mit 13 Elementen,
von 0 - 12. Da könnte man noch optimieren.

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 18:45
von Kiffi
stevie1401 hat geschrieben:aber der Hintergrund wird nicht restauriert, sondern es bleibt ein grauer Hintergrund.
Kann man das irgendwie ändern?
wir wissen nicht, was Dein Hintergrund ist, bzw. wie Du ihn erzeugt hast. Wir kennen auch Deine Ereignis-Schleife nicht. Ohne das alles können wir schlecht helfen.

Aus diesem Grund hat Thomas auch geschrieben:
ts-soft hat geschrieben:Es wäre auf jeden fall besser, wenn Du einen komplett ausführbaren Code bereitstellst
Grüße ... Peter

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 19:18
von stevie1401
Hier der ganze Code:

Code: Alles auswählen

OpenWindow(1, 30, 30, 800, 600, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
Global ButtonBackColor 
ButtonBackColor = RGB(50, 37, 27)
Global ButtonForeColor 
ButtonForeColor = RGB(207, 186, 167)
  
Global exepath.s,Bilderordner.s,KartenOrdner.s,MeinKartenOrdner.s
exepath=GetCurrentDirectory()
Bilderordner=exepath+"inc/bilder/"
Kartenordner=BilderOrdner+"karten/"
MeinkartenOrdner=KartenOrdner+"Karten4/"
UseJPEGImageDecoder()

SetWindowColor(1, ButtonBackColor)

Dim meineKarte.i(12)
Dim nr(12)

For i=1 To 12
  ppic.s=Str(i)+".jpg"
  ppic=MeinKartenOrdner+ppic
  nr(i)=LoadImage(#PB_Any,ppic)
  meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)), #PB_Image_Border)
  ;meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)))
  GadgetToolTip(meineKarte(i), "tooltiptest")
Next i
SetGadgetState(meineKarte(7),0)  ;Karte 7 löschen - hier bleibt ein grauer Hintergrund

;- Ereignis-Schleife
  Repeat
    Event = WaitWindowEvent()
    EventWindow = EventWindow()
    EventGadget = EventGadget()
    EventType = EventType()
    
    Select Event
      Case #PB_Event_Gadget
       
      Case #PB_Event_CloseWindow
        If EventWindow = 1
          CloseWindow(1)
          Break
        EndIf
    EndSelect
  ForEver

Welcher Hintergund ist, ist doch egal. Eigentl wollte ich einen Holzhintergrund nehmen, wie ein Tisch. Das spielt im Moment aber noch keine Rolle.
Mir geht es darum, dass ein grauer Fleck dort ist, wo einst Karte 7 war.
EDIT:
Ich habe HideGadget(meineKarte(7),1) entdeckt. Damit wird mein Gadget unsichtbar und der Hintergrund wird restauriert. Fein :-)
Ach ja, wie kann ich ein ImageGadget nachträglich bewegen? Auch mit SetGadgetState?
EDIT:
ResizeGadget(meinekarte(7), 150, 100, #PB_Ignore, #PB_Ignore) ; Verschiebt das Gadget nur an eine neue Position.

Alles klar erst einmal. Vielen Dank für eure Hilfe :-)

Re: ImageGadget ein neues Bild geben

Verfasst: 19.10.2014 20:08
von ts-soft
Ein paar Tipps zu dem Code:
EnableExplicit - Variablen deklaration erforderlich.
Globale Deklaration - Entweder da fehlt noch Code, ansonsten nicht erforderlich, da keine Proceduren definiert.
exepath.s = GetCurrentDirectory() - Wer hat den CurrentDirectory definiert? Meist setzt der Explorer das richtige
Verzeichnis, aber nicht immer wird per Explorer gestartet! Besser:

Code: Alles auswählen

exepath.s = GetPathPart(ProgramFileName())
Dafür aber bitte: Temporäres Executable im Quellcode-Verzeichnis erstellen anschalten.

Und das Array ist zu groß, besser:

Code: Alles auswählen

Dim meineKarte.i(11)
Dim nr(11)

For i = 0 To 11
Da das Bild denselben Hintergrund wie das Fenster hat, nehme ich mal an, Du meinst die Border?
Entweder verzichtest Du auf das Flag oder HideGadget oder leeres Bild ohne Border.

Gruß
Thomas

Re: ImageGadget ein neues Bild geben

Verfasst: 20.10.2014 09:28
von stevie1401
Vielen Dank.
Nun fehlt mir noch die Transparents der Bilder.
Ich habe gelesen, dass es mit PNG-Images gehen soll, funktioniert bei mir allerdings nicht.
Gibt es da ein passendes Beispiel?
Mein Programm soll auf allen Plattformen laufen, deshalb bitte keinen reinen Windows-Linux- oder Mac-Code :-)

Re: ImageGadget ein neues Bild geben

Verfasst: 20.10.2014 12:27
von Andesdaf
schau mal in der Hilfe zur ImagePlugin-Library, dort gibt es
ein Beispiel, das Transparenz bei PNG-Dateien darstellt.

Oder kurz ins blaue: hast du auch UsePNGImageDecoder() genutzt?