Partage
  • Partager sur Facebook
  • Partager sur Twitter

IMG_Load(image.png) ne trouve pas image.png

En SDL

Sujet résolu
28 octobre 2018 à 22:32:14

Bonjour,

Mon problème provient de la lib "SDL_image". Dans "SDL_image.h" je trouve cette ligne:

extern DECLSPEC SDL_Surface * SDLCALL IMG_Load(const char *file);

J'écris donc dans mon code:

SDL_Surface* tmpSurface = IMG_Load("image.png");

mais l'image ne semble pas s'afficher. Pourtant elle se trouve bien dans les fichiers de mon projet:

Y a-t-il sous code::blocks un moyen particulier pour inclure une image au projet? Car l'image n’apparaît pas dans l'arborescence sous code::blocks:

Je vous donne tout le code au cas où le problème vient d'ailleurs. 

main.cpp

#include "game.h"

Game *game = nullptr;

int main(int argc, char *argv[])
{
    game = new Game();

    game->init("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, false); //dernière valeur true ou false pour fullscreen

    while(game->running()){
        game->handleEvents();
        game->update();
        game->render();
    }
    game->clean();
    return 0;
}

game.h

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
#include "SDL.h"
#include "SDL_image.h"
#include <iostream>

class Game{

public:
    Game();
    ~Game();

    void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);

    void handleEvents();
    void update();
    void render();
    void clean();

    bool running() {return isRunning;};

private:
    int cnt = 0;
    bool isRunning;
    SDL_Window *window;
    SDL_Renderer *renderer;
};

#endif // GAME_H_INCLUDED

game.cpp

#include "game.h"

SDL_Texture* playerTex;

Game::Game(){

}

Game::~Game(){

}

void Game::init(const char *title, int xpos, int ypos, int width, int height, bool fullscreen){
    int flags = 0;

    if(fullscreen){
        flags = SDL_WINDOW_FULLSCREEN;
    }
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0){
        std::cout << "Subsystem Initialised!..." << std::endl;

        window=SDL_CreateWindow(title, xpos, ypos, width, height, flags);
        if(window){
            std::cout << "Window created!" << std::endl;
        }
        renderer = SDL_CreateRenderer(window, -1, 0);
        if(renderer){
            SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
            std::cout << "Renderer created!" << std::endl;
        }
        isRunning = true;
    }
    else{
        SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
        isRunning = false;
    }
    SDL_Surface* tmpSurface = IMG_Load("image.png");
    playerTex = SDL_CreateTextureFromSurface(renderer, tmpSurface);
    SDL_FreeSurface(tmpSurface);
}

void Game::handleEvents(){
    SDL_Event event;
    SDL_PollEvent(&event);
    switch(event.type){
    case SDL_QUIT:
        isRunning = false;
        break;
    default:
        break;
    }
}

void Game::update(){
    cnt++;
    std::cout<<cnt<<std::endl;
}

void Game::render(){
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, playerTex, NULL, NULL);
    SDL_RenderPresent(renderer);
}

void Game::clean(){
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_QUIT;
    std::cout << "Game cleaned!" << std::endl;
}

Désolé de vous mettre des gros pattés de code comme ça :'( et merci d'avance :-°



-
Edité par KFoxLDG 28 octobre 2018 à 22:34:06

  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2018 à 9:31:53

Bonjour, testes le retour de ta fonction pour savoir ce qui ne va pas:

SDL_Surface* tmpSurface = IMG_Load("image.png");
if(!tmpSurface) {
    std::cerr<< IMG_GetError()<<std::endl;
}



  • Partager sur Facebook
  • Partager sur Twitter
30 octobre 2018 à 9:37:44

Lu'!

game = new Game();
game->init("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, false);

Cette allocation dynamique est complètement inutile. Même si elle était utile, on n'utilise jamais new en C++ à moins d'avoir une excellente raison de le faire (d'ailleurs ici, tu ne fais pas le delete ...). Une fonction "init" n'a aucune raison d'exister, c'est le rôle du constructeur d'initialiser. Et pareil pour ta fonction clean, qui n'a aucune raison d'exister non plus puisqu'elle fait le boulot du destructeur.

Pour utiliser SDL2 en C++, il faut que tu écrives (ou récupères) un wrapper qui va permettre de rendre la gestion des ressources associées RAII-conform. Sinon, ce sera nécessairement incorrect.

Bref : arrête de coder en C. Si tu veux faire du C++, fais du C++, pas du C.

-
Edité par Ksass`Peuk 30 octobre 2018 à 9:40:44

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

4 novembre 2018 à 10:08:04

La prochaine fois je dois éviter de poster mon code? Comme ça j'éviterai les remarques qui ne répondent pas au sujet et qui en plus sont quelque peux agressives :-°.

Merci beaucoup bxdfr. J'avance un peu avec mon problème. Il me dit:

Failed loading libpng16-16.dll: Le module spécifique est introuvable.

J'ai donc résolu mon problème en déplaçant la lib concerné dans le fichier du projet. Utile cette fonction IMG_GetError(). Je vais voir un peu plus de documentation. Encore merci à toi bxdfr.

Pour Ksass'Peuk même si ton message est agressif, merci. Même si tu m'aides pas vraiment j'avais même pas conscience de faire du C. Je vais me renseigner sur deux trois terme que tu utilises et que je comprend pas.

 Sujet résolu

-
Edité par KFoxLDG 4 novembre 2018 à 10:14:26

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2018 à 12:38:40

Si tu trouves que c'est agressif, la vie va être très difficile pour toi. Il y a pas d'agression. J'expose simplement les problèmes (sans dire que c'est de la merde ou quoi que ce soit, c'est des problèmes, il faut que tu les corriges sinon tu vas aller dans le mur sans même le savoir). Mais si tu veux le prochain coup, je mettrais des images de chatons avec.

-
Edité par Ksass`Peuk 4 novembre 2018 à 12:39:11

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

4 novembre 2018 à 12:40:29

@KFoxLDG, s'il te plaît, continue à poster tes longs codes. Il y a des gens comme moi, qui ne seront jamais agressifs avec toi, même si tu écris des choses fausses.

Mes messages ont été parfois pris à parti par un ou deux autres. Mais ils savent bien que je ne me laisserai pas faire.

Maintenant, il ont aussi, derrière cette agressivité de façade, l'envie de t'aider probablement. D'ailleurs, grâce à eux, je progresse aussi.

Donc, stp, ne te décourage jamais de publier tes codes comme tu l'as fait, même si il peut y avoir des erreurs. Ceux qui s'adressent aux autres de la sorte, ne se rendent pas compte du mal-être qu'ils peuvent engendrer chez les autres par leurs paroles et leurs mots. ça s'appelle l'empathie

Tu seras quelqu'un de brillant. j'en suis certain.

Ton code prouve que tu es un bosseur. Et tu connais des choses sur lesquelles je vais aussi progresser. Par exemple la SDL. Donc continue à progresser, lis, apprends, tombe, relève-toi, et continue.

ça m'a touché quand tu as dit "La prochaine fois je dois éviter de poster mon code?"

C'est exactement à cause de cela que certains ont été dégoutés. Stp, n'évite pas. Publie ton code. Il y a des gens réellement pacifiques comme moi, qui ne toucheront jamais à ton amour propre.

Prends soin

-
Edité par pseudo-simple 4 novembre 2018 à 12:44:49

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2018 à 12:52:28

YES, man a écrit:

@KFoxLDG, s'il te plaît, continue à poster tes longs codes. Il y a des gens comme moi, qui ne seront jamais agressifs avec toi, même si tu écris des choses fausses.

D'ailleurs, ils ne te diront pas non plus quand c'est faux.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

4 novembre 2018 à 12:53:40

n'empêche que ton message n'avance à rien YES, man
  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2018 à 14:13:20

@VDD : Faux : j'aide dans la mesure du maximum de ce que je sais et je continue ma progression grâce au C++11/14

-
Edité par pseudo-simple 4 novembre 2018 à 14:16:11

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 novembre 2018 à 20:37:11

Si des gens sont dégoutés parce qu'on leur fait des remarques qui ne sont pas entièrement positives, ou parce qu'on fait des critiques constructives, qu'ils arrêtent donc de coder, ça ne sera pas une perte.

Il n'y a aucune agressivité dans le message de Ksass Peuk. Si ton amour propre est blessé, alors oui, ne poste plus de code source. La critique c'est exactement ce qui fait avancer. Si tu ne la supporte pas, ou si tu attends de ce forum qu'on réponde à toutes tes questions avec des grands coups de Bravo et T'es le meilleur, bah non.

Il faut arrêter avec la sensibilité et tout ça. Vouss croyez que le monde du travail et la vie en général vous ferons des cadeaux et faveurs ?

(Ce message peut être considéré comme désagréable)

  • Partager sur Facebook
  • Partager sur Twitter
5 novembre 2018 à 9:49:40

KFoxLDG a écrit:

La prochaine fois je dois éviter de poster mon code? Comme ça j'éviterai les remarques qui ne répondent pas au sujet et qui en plus sont quelque peux agressives :-°.


Il n'y a rien d'agressif. Il t'explique des choses à ne pas faire en C++. Aussi simple que ça. Il n'a pas utilisé d'insulte, ni de choses rabaissante non plus.
  • Partager sur Facebook
  • Partager sur Twitter

git is great because Linus did it, mercurial is better because he didn't.

27 novembre 2018 à 19:14:21

Je suis surpris de voir autant de débat :D

Pour ceux qui ont eu le même problème que moi, je vous laisse remonter plus haut pour la réponse.

Pour le débat, j'aimerais juste dire que j'ai senti une agressivité dans le message de @Ksass`Peuk . Après je ne dis pas que sa critique est négative en soit. Je l'accepte pleinement, preuve en est ce que j'ai dit dans mon message précédent:

KFoxLDG a écrit:

j'avais même pas conscience de faire du C. Je vais me renseigner sur deux trois termes que tu utilises et que je comprends pas.

Le vrai problème, c'est plutôt qu'il était hors sujet, voilà tout. Après encore une fois, même si j'ai l'impression qu'il a réagi avec agressivité, je le remercie. Il m'a quand même orienté pour que je m'améliore. :magicien:

Et pour finir:

Ksass`Peuk a écrit:

il faut que tu les corriges sinon tu vas aller dans le mur sans même le savoir

Les murs, on se les prends et on apprends. Comme ça qu'on retiens ;)

-
Edité par KFoxLDG 27 novembre 2018 à 19:15:12

  • Partager sur Facebook
  • Partager sur Twitter
27 novembre 2018 à 19:22:19

KFoxLDG a écrit:

Les murs, on se les prends et on apprends. Comme ça qu'on retiens ;)

En C++, tu auras plus que ta part de murs vu l'absurdité de certains détails du langage. Prends toi ceux qui sont intéressants, et qui vont te faire apprendre des trucs pertinents. Et ne prends pas ceux qui sont invisibles (comme par exemple la manipulation manuelle de mémoire, en C++, ça aura l'air de marcher, sauf que c'est vraiment le truc à ne jamais faire, c'est tellement la merde que même les experts du langage s'arrangent pour ne pas le faire).

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C