Bilder werden nicht angezeigt?



  • Hi, ich mal wieder. Hab mich mittlerweile mal an meinem ersten Spiel versucht, so wie es in meinem Buch steht 🙂
    Es klappt auch alles, sprich keinerlei Fehlermeldung etc., jedoch wenn ich es ausführe werden absolut keine Bilder angezeigt...
    Das Programm selbst läuft ja sonst, lässt sich auch wunderbar mit ESC abbrechen aber ohne Bilder is das ganze nunmal echt doof.

    Bilder werden in zwei der Dateien benötigt, einmal game.cpp und einmal title.cpp.
    Da überhaupt keine angezeigt werden, denke ich, reicht es vorerst wenn ich title.cpp und die aus der main Datei benötigten Funktionen aufführe:

    title.h

    #pragma once
    
    bool title();
    

    title.cpp

    #include "iqchallenge.h"
    #include "title.h"
    
    bool title() {
        BITMAP* bg = load_bitmap("media/title.tga", NULL);
    
        if (bg == NULL) {
            fatal_error("Titelbild konnte nicht geladen werden");
        }
    
        blit(bg, doublebuffer, 0, 0, 0, 0, bg->w, bg->h);
        destroy_bitmap(bg);
    
        clear_keybuf();
    
        while(!keypressed()) {
            show();
        }
    
        if (key[KEY_ESC]) {
            return false;
        }
    
        clear_keybuf();
    
        return true;
    }
    

    sowie
    iqchallenge.h (Header der Main Datei)

    #pragma once
    
    #include <allegro.h>
    
    extern BITMAP* doublebuffer;
    extern volatile int timer;
    
    void fatal_error(char* error);
    void show();
    

    iqchallenge.cpp (Main Datei)

    #include <time.h>
    
    #include "iqchallenge.h"
    #include "title.h"
    #include "game.h"
    
    BITMAP* doublebuffer = NULL;
    volatile int timer   = 0;
    
    static void timerUpdater() {
        timer++;
    } END_OF_STATIC_FUNCTION(timerUpdater);
    
    void fatal_error(char* error) {
        allegro_message(error);
        exit(0);
    }
    
    void show() {
        blit(
            doublebuffer, screen,
            0, 0, 0, 0,
            doublebuffer->w, doublebuffer->h
        );
    }
    
    bool setGFXMode(int width, int height) {
        static int colorDepths[] = {16, 15, 16};
        static int gfx_modes[]   = {
            GFX_AUTODETECT_FULLSCREEN,
            GFX_AUTODETECT_FULLSCREEN,
            GFX_AUTODETECT_WINDOWED
        };
    
        for (int i = 0; i < 3; i++) {
            set_color_depth(colorDepths[i]);
            if (set_gfx_mode(gfx_modes[i], width, height, 0, 0)) {
                return true;
            }
        }
    
        return false;
    }
    
    void init() {
        srand(time(NULL));
    
        allegro_init();
    
        if (!setGFXMode(640, 480)) {
            fatal_error("Konnte Grafikmodus nicht setzen");
        }
    
        install_keyboard();
        install_timer();
        install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
    
        doublebuffer = create_bitmap(SCREEN_W, SCREEN_H);
        if (!doublebuffer) {
            fatal_error("Konnte keinen Doublebuffer erstellen");
        }
    
        LOCK_FUNCTION(timerUpdater);
        LOCK_VARIABLE(timer);
    
        install_int_ex(timerUpdater, BPS_TO_TIMER(30));
    }
    
    void done() {
        destroy_bitmap(doublebuffer);
    }
    
    int main() {
        init();
    
        bool gameover = false;
        while(!gameover) {
            if (!title()) {
                gameover = true;
            } else {
                game();
            }
        }
    
        done();
    } END_OF_MAIN();
    


  • Hab nochmal alles durchgeprüft. Ich lade in der game.cpp neben Bilder auch Musikdateien aus dem selben Verzeichnis, diese werden einwandfrei abgespielt...
    Nu weiß ich echt nicht mehr weiter, wieos die Bilder nicht angezeigt werden sollte 😕



  • Also erstens: Du lädst jede Grafik in jedem Frame komplett neu?! 😮
    Das könnte wenigstens in die Init-Funktion.

    Und ausserdem sehe ich zwar, dass die Grafik geblittet wird, aber wann wird denn der Speicher für den Bildschirm freigegeben? Da du einen Doublebuffer verwendest (was ja sinnvoll ist), musst du auch irgendwie zwischen den Speichern hin- und herschalten.



  • Powerpaule schrieb:

    Also erstens: Du lädst jede Grafik in jedem Frame komplett neu?! 😮
    Das könnte wenigstens in die Init-Funktion.

    Und ausserdem sehe ich zwar, dass die Grafik geblittet wird, aber wann wird denn der Speicher für den Bildschirm freigegeben? Da du einen Doublebuffer verwendest (was ja sinnvoll ist), musst du auch irgendwie zwischen den Speichern hin- und herschalten.

    Das mit dem neuladen stimmt, sagt auch das Buch, aber da es sich an totale Anfänger (mich) richtet belassen wirs erstmal dabei 😃

    Wie meinst du das "hin und herschalten zwischen dem Speichern" ?
    Musst wissen das ich in dem Bereich erst seit wenigen Tagen tätig bin 😕

    edit:
    hab nun immer wieder rumprobiert, aber das ergebnis ist das gleiche: ein weißer Bildschirm. Töne werden reibungslos abgespielt aber Bilder werden nicht angezeigt -.-
    Das is doch zum Mäuse melken 😕



  • Keiner mehr eine Idee? So komm ich einfach nicht weiter im buch 😕



  • Wird denn show() auch wirklich aufgerufen?
    Hab von allegro leider nicht wirklich viel Ahnung.
    Und die Grafik? Enthaelt die wirklich auch farbige Pixel oder nur weiss? 😉
    Mit anderen Grafiken kommt auch nix?



  • Jap, die wird aufgerufen, gerade mit der fatal_error Funktion nochmal getestet.
    Und ja, es ist ein Bild. Kann ich auch gerne mal hochladen und zeigen.
    Versteh einfach beim besten willen nicht, wieso da einfach nur weiß angezeigt wird 😞



  • Bist du mal mit dem Debugger durchgegangen und hast die Werte überprüft?
    Hast du es mit anderen Bildern probiert? Anderen Bildformaten?



  • ich hab das jetzt hinbekommen, meine setGFXMode war fehlerhaft.
    Hab nun diese Variante und es geht...

    bool setGFXMode(int mode, int width, int height) {
        static int colorDepths[] = { 16, 24, 15, 32 };
    
        for (int i = 0; i < 4; i++) {
            set_color_depth(colorDepths[i]);
            if (set_gfx_mode(mode, width, height, 0, 0) >= 0) {
                return true;
            }
        }
    
        return false;
    }
    

    mode muss man nun halrt selbst angeben, habe GFX_AUTODETECT_FULLSCREEN gewählt.

    Danke trotzdem 🙂



  • Jut, na dann viel Spass weiterhin 😉


Anmelden zum Antworten