Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/08/2015, à 22:41

MasterYo

[RESOLU] Problème affichage image (SDL)

Bonjour a tous !!

Tout d'abord, merci de me lire smile

Le problème est le suivant, lorsque je compile mon code, aucune erreur ne s'affiche, rien du tout, et pourtant mon image "zozor.bmp" ne s'affiche pas. Ma fenêtre est blanche hmm

Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

void pause();

int main(int argc, char *argv[])
{
    SDL_WM_SetCaption("Interactions !!", NULL);
    SDL_Surface *screen = NULL, *zozor = NULL;
    SDL_Rect zozoPos;

    if (SDL_Init(SDL_INIT_VIDEO) == -1)
    {
        printf("Erreur d'initialisation de l'application : \"%s\"", SDL_GetError());
        return EXIT_FAILURE;
    }

    screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

    if (screen == NULL)
    {
        printf("Erreur de chargement de l'écran : \"%s\"", SDL_GetError());
        return EXIT_FAILURE;
    }

    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));

    zozor = SDL_LoadBMP("zozor.bmp");

    if(zozor == NULL)
        return EXIT_FAILURE;

    SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

    zozoPos.x = (screen->w / 2) - (zozor->w / 2);
    zozoPos.y = (screen->h / 2) - (zozor->h / 2);

    SDL_BlitSurface(screen, NULL, zozor, &zozoPos);

    SDL_Flip(screen);

    pause();

    SDL_FreeSurface(zozor);
    SDL_Quit();
    return EXIT_SUCCESS;
}

void pause()
{
    SDL_Event event;
    while(1)
    {
        SDL_WaitEvent(&event);
            switch (event.type)
            {
                default:
                break;

                case SDL_KEYDOWN :
                    switch (event.key.keysym.sym)
                    {
                        default:
                        break;

                        case SDLK_RETURN:
                        return;

                        case SDLK_ESCAPE:
                        return;
                    }
                    break;

                case SDL_QUIT:
                return;
            }
    }
}

Merci d'avance pour vos réponses wink

Dernière modification par MasterYo (Le 21/08/2015, à 13:10)

Hors ligne

#2 Le 20/08/2015, à 14:11

mrlem

Re : [RESOLU] Problème affichage image (SDL)

Salut,

Ça fait bien longtemps que je n'y ai pas touché, à SDL, mais si j'en crois http://wiki.libsdl.org/SDL_BlitSurface les arguments de SDL_BlitSurface sont dans l'ordre :
- src the SDL_Surface structure to be copied from
- srcrect the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface
- dst the SDL_Surface structure that is the blit target
- dstrect the SDL_Rect structure representing the rectangle that is copied into

Et tu fais :

SDL_BlitSurface(screen, NULL, zozor, &zozoPos);

Autrement dit, tu inverses screen et zozor, puisque la source est sensée être ton image et la destination l'écran (et pas l'inverse). Du coup sauf erreur tu copies ton écran blanc sur ton image, actuellement tongue

Hors ligne

#3 Le 20/08/2015, à 15:17

Compte anonymisé

Re : [RESOLU] Problème affichage image (SDL)

Bonjour,

Je crois bien que le compilateur râle si les arguments ne sont pas écrits dans l'ordre.
Mais ce qui m'étonne, @MasterYo, c'est que tu ne fasses pas d'applySurface() hmm

Dernière modification par Compte anonymisé (Le 20/08/2015, à 15:24)

#4 Le 20/08/2015, à 15:21

mrlem

Re : [RESOLU] Problème affichage image (SDL)

jojo81 a écrit :

Je crois bien que le compilateur râle si les arguments ne sont pas écrits dans l'ordre.

Comment le compilateur pourrait-il savoir qu'il y a quelque-chose de mauvais, puisque source comme destination sont du même type de son point de vue ? (i.e. screen et zozor sont tous deux des SDL_Surface *)

Hors ligne

#5 Le 20/08/2015, à 15:39

Compte anonymisé

Re : [RESOLU] Problème affichage image (SDL)

moi en édition de message a écrit :

Mais ce qui m'étonne, @MasterYo, c'est que tu ne fasses pas d'applySurface()

Sinon, sur un exemple :
J'inclus ceci

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include "SDL.h"
#include "SDL_image.h"
#include <SDL/SDL_ttf.h>

using namespace std;

Je charge une image (deux fonctions possibles)

//Chargement d'une image:
SDL_Surface *
loadImage(string filename)
{
    return SDL_DisplayFormat(IMG_Load( filename.c_str()));
}

SDL_Surface *
loadImageWithColorKey(string filename, int r, int g, int b)
{
    SDL_Surface* optimizedImage;
    optimizedImage = SDL_DisplayFormat(IMG_Load( filename.c_str()));
    SDL_SetColorKey(optimizedImage, SDL_SRCCOLORKEY,
                    SDL_MapRGB(optimizedImage->format, r, g, b));
    return optimizedImage;
}

J'applySurface

//applySurface
void
applySurface(int x, int y, SDL_Surface* source,
             SDL_Surface* destination, SDL_Rect* clip)
{
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;
    SDL_BlitSurface( source, clip, destination, &offset );
}

Pis j'affiche

//Afficher balle
void
showBall(ball b, SDL_Surface *s)
{
    SDL_Rect r;
    r.x=(b.x-TAILLE/2)+3;
    r.y=(b.y-TAILLE/2)+3;
    r.w=TAILLE;
    r.h=TAILLE;
}

#6 Le 20/08/2015, à 15:56

mrlem

Re : [RESOLU] Problème affichage image (SDL)

En tous cas je viens d'essayer, en remplaçant :

SDL_BlitSurface(screen, NULL, zozor, &zozoPos);

par

SDL_BlitSurface(zozor, NULL, screen, &zozoPos);

et en compilant avec :

gcc plop.c -o plop `sdl-config --cflags --libs`

ça marche nickel.

Hors ligne