DisplaySprite liefert anderes Ergebniss als ImageGadget

Anfängerfragen zum Programmieren mit PureBasic.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von TheNewOne »

Hallo zusammen,
Ich habe einen WindowedScreen neben ein par ImageGadgets und wenn ich nun die gleichen Bilder als Sprites und Images laden lasse, werden sie aber unterschiedlich angezeigt. In den ImageGadgets funktioniert noch alles Prima, aber im Screen werden selbige in anderen Farben (hauptsächlich Lila/Rosa) angezeigt.
Nun habe ich mich gefragt was ich da falsch gemacht habe.
Hier der ganze Code:

Code: Alles auswählen

Global MaxKarteX, MaxKarteY, ZeigeKarte = #False
Global MaxTiles = 0
Global MausX, MausY, KMausX, KMausY, aktTile = 0, lastTile = 0

Procedure NeueKarte(groesse.i)
  MaxKarteX = groesse
  MaxKarteY = MaxKarteX
  Global Dim Karte(MaxKarteX, MaxKarteY)
  ZeigeKarte = #True
EndProcedure

Procedure ZeichneKarte()
  If ZeigeKarte = #True
    For y = 0 To MaxKarteY
      For x = 0 To MaxKarteX
        DisplaySprite(Karte(x, y), x*20, y*20)
      Next
    Next
  EndIf
EndProcedure

Procedure LadeTiles()
  ReadFile(0, "Sprites/Tilelist.txt")
  While Eof(0) = 0
    file.s = ReadString(0)
    LoadSprite(maxTiles, "Sprites/" + file + ".bmp")
    LoadImage(maxTiles, "Sprites/" + file + ".bmp")
    maxTiles + 1
  Wend
  CloseFile(0)
  maxTiles - 1
EndProcedure

Procedure Mouse()
  MausX = WindowMouseX(0)
  MausY = WindowMouseY(0)
  KMausX = (MausX - 200)/20
  KMausY = MausY/20
  
  SetGadgetText(3, "Maus-X: " + Str(MausX))
  SetGadgetText(4, "Maus-Y: " + MausY)
  If KMausX >= 0
    If KMausX <= MaxKarteX
      SetGadgetText(5, "Koordinaten: " + KMausX + "|" + KMausY)
    Else
      SetGadgetText(5, "Koordinaten:  | ")
    EndIf
  Else
    SetGadgetText(5, "Koordinaten: NA")
  EndIf
  
  If neu = #False
    If Not aktTile = lastTile
      SetGadgetState(99, ImageID(aktTile))
      lastTile = aktTile
    EndIf
  EndIf
EndProcedure

Procedure ChangeTile()
  If KMausX >= 0
    If KMausX <= MaxKarteX
      Karte(KMausX, KMausY) = aktTile
    EndIf
  EndIf
EndProcedure

Procedure OeffneKarte()
  OpenFileRequester("Karte laden", "Map.txt", "Text (*.txt)|*.txt", 1)
EndProcedure

InitSprite()
InitMouse()

If OpenWindow(0, 0, 0, 800, 620, "Map Editor", #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 200, 0, 600, 600)
  If CreateMenu(0, WindowID(0))
    MenuTitle("Datei")
    OpenSubMenu("Neu")
    MenuItem(1, "10x10")
    MenuItem(2, "15x15")
    MenuItem(3, "20x20")
    MenuItem(4, "25x25")
    MenuItem(5, "30x30")
    CloseSubMenu()
    MenuItem(6, "Öffnen")
    MenuItem(7, "Speichern")
    MenuItem(8, "Beenden")
    MenuTitle("Tile")
    MenuItem(9, "Hinzufügen")
    MenuItem(10, "Entfernen")
    MenuTitle("Spawn")
    MenuItem(11, "Hinzufügen")
    MenuItem(12, "Entfernen")
  EndIf
  TextGadget(3, 5, 05, 60, 20, "Maus-X: " + Str(MausX))
  TextGadget(4, 5, 30, 60, 20, "Maus-Y: " + MausY)
  TextGadget(5, 5, 55, 100, 20, "Koordinaten: " + KMausX + "|" + KMausY)
  TextGadget(7, 5, 80, 100, 20, "Aktuelles Tile:")
  
  LadeTiles()
  
  ImageGadget(99, 80, 80, 20, 20, ImageID(0))
  
  For n = 0 To maxTiles
    ImageGadget(n + 100, 5 + x*25, 105 + y*25, 20, 20, ImageID(n))
    x + 1
    If x > 5
      x = 0
      y + 1
    EndIf
  Next
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1 : NeueKarte(10)
          Case 2 : NeueKarte(15)
          Case 3 : NeueKarte(20)
          Case 4 : NeueKarte(25)
          Case 5 : NeueKarte(30)
          Case 6 : OeffneKarte()
          Case 8 : CloseWindow(0)
            End
        EndSelect
      Case #PB_Event_Gadget
        Select EventType()
          Case #PB_EventType_LeftClick
            If Not EventGadget() = 99
              aktTile = EventGadget() - 100
            EndIf
        EndSelect
      Case #WM_LBUTTONDOWN : ChangeTile()        
    EndSelect
       
    FlipBuffers() 
    ClearScreen(0)

    ZeichneKarte()
    Mouse()
    
    Delay(1)
  Until Event = #PB_Event_CloseWindow
EndIf
Danke schon mal im Voraus für alle Antworten.
Win7, 64bit, PB 4.60
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von KeyKon »

Ich kann auf Anhieb keinen Fehler erkennen.
Vielleicht kannst du noch einen Screen posten, oder eines der Bilder zur Verfügung stellen, damit man das Problem evtl. selbst reproduzieren kann?

LG KeyKon
(\/) (°,,,°) (\/)
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von TheNewOne »

Es sind nicht sonderlich vielfältige Sprites :D
Habe sie hier mal hochgeladen:
http://www.file-upload.net/download-782 ... s.bmp.html
http://www.file-upload.net/download-782 ... d.bmp.html
http://www.file-upload.net/download-782 ... n.bmp.html
http://www.file-upload.net/download-782 ... r.bmp.html

Edit: und hier noch ein Screenshot, in dem man links die richtigen Bilder sieht und rechts im Screen die, die falsch angezeigt werden:
http://www.file-upload.net/download-782 ... 6.png.html
Win7, 64bit, PB 4.60
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von RSBasic »

@TheNewOne
Ich weiß nicht, ob andere ebenfalls das Problem haben, aber ich jedenfalls kann keine Grafiken von diesem File-Uploaddienst herunterladen. Ich klicke auf den Download-Button und werde nur zur "Danke für den Download"-Seite weitergeleitet und daraufhin sofort wieder auf die vorherige Downloadseite, auf der ich grad' eben war. Heruntergeladen wurde bei mir nichts.
Könntest du deine Grafiken vielleicht auf eine andere Uploadseite hochladen?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von KeyKon »

Bei mir gings einwandfrei^^
Eine Frage hätte ich da aber noch, wie genau funktioniert dein Editor, ich schaffs nicht so recht ein Tile auf der Map einzufügen...

LG KeyKon
(\/) (°,,,°) (\/)
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von TheNewOne »

@KeyKon zuerst musst du oben auf Datei eine Neue Karte erstellen, und dann links unter aktuelles Tile, das Tile auswählen dass du setzen möchtest, und dann auf die im Screen auf das gewünschte Feld klicken.
Win7, 64bit, PB 4.60
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von KeyKon »

Das Problem scheint zu sein, dass du die BMPs mit Alphakanal (32bit) speicherst, daran scheint sich LoadSprite zu verschlucken, obwohl es eigentlich damit klar kommen sollte.
Eine Lösung wäre es die Bilder nur mit 24bit zu speichern, dann wird auch alles richtig geladen.
Wie man den Code in Richtung 32bit ändern könnte weis ich auch nicht.

Aber vll speicherst du das ganze auch einfach als PNG, dann ist es kleiner und gibt auch keine Probleme.

LG KeyKon
(\/) (°,,,°) (\/)
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: DisplaySprite liefert anderes Ergebniss als ImageGadget

Beitrag von TheNewOne »

Danke KeyKon, ich habe es jetzt als PNG gespeichert und es funktioniert.
Win7, 64bit, PB 4.60
Antworten