Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL 2.0.5 Erreur image

SDL2

21 juin 2017 à 14:47:11

Bonjour à tous, je suis actuellement en train d'essayer de créer un mini-jeu grâce à la SDL2.

J'ai choisi cette bibliothèque car j'ai des petites connaissances en c++ console et en terme d'optimisation et performances, le c/c++ est ce qu'il y a de mieux (de ce que j'ai vu sur beaucoup de forums...)

Le problème, c'est l'affichage d'image et les tout ce qui est SDL_Surface, SDL_Renderer, SDL_Textures, c'est quoi exactement, des couches ?

Pour afficher les images, j'utilise bien sûr SDL2image car créer des images de merde en bmp, hahaha qui utilise ce format de merde !!!

Fond d'écran -> .jpg / Transparence -> .png

Voici tout mon code : 

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
#include <cstring>

using namespace std;

unsigned short int a = 0, b = 0;
char *un;

int main(int argc, char *argv[]) {
	SDL_Init(SDL_INIT_VIDEO);
	IMG_Init(IMG_INIT_JPG);
	SDL_Window *load = SDL_CreateWindow("Load", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 50, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS);
	SDL_Window *menu = SDL_CreateWindow("Menu", 5, 35, 0, 0, SDL_WINDOW_SHOWN);
	SDL_Renderer *rendu = SDL_CreateRenderer(load, -1, SDL_RENDERER_ACCELERATED || SDL_RENDERER_PRESENTVSYNC);
	SDL_SetWindowFullscreen(load, SDL_FALSE);
	SDL_SetWindowResizable(load, SDL_FALSE);
	SDL_SetRenderDrawColor(rendu, 255, 0, 0, 255);
	SDL_Event ev;
	bool actived = false;
	while (!actived) {
		while (SDL_PollEvent(&ev) != 0) {
			SDL_Rect pb = { 0, 0, a, 50 };
			SDL_RenderFillRect(rendu, &pb);
			SDL_RenderPresent(rendu);
			SDL_Delay(35);
			if (a < 400)
				a = a + b + 1;
			b++;
			if (a > 400) {
				SDL_DestroyWindow(load);
				SDL_SetWindowSize(menu, 1280, 720);
				string type = "Ice";
				string pos = "10";
				SDL_Renderer *sprite = SDL_CreateRenderer(menu, -1, SDL_RENDERER_ACCELERATED || SDL_RENDERER_PRESENTVSYNC);
				SDL_Rect img = { 0, 0, 121, 121 };
				SDL_RenderPresent(sprite);
				string localisation = "runes/support/" + type + "/" + type + pos + ".png";
				char *un = new char[localisation.size() + 1]; //Convertion string to char
				std::strncpy(un, localisation.c_str(), localisation.size()); // Convertion string to char
				cout << un << endl; // Ecrit dans la console : runes/support/Ice/Ice10.png═2222 (pourquoi les =2222, allez savoir !!)
				SDL_Surface *image = IMG_Load(un);
				delete[] un; // Sert à libérer de la place ?
				SDL_BlitSurface(image, NULL, image, &img);
				if (!image) {
					cout << "Erreur de chargement de l'image : " << SDL_GetError(); // affiche l'erreur classique présente dans tous les forums : Erreur de chargement de l'image : SDL_UpperBlit: passed a NULL surface
					system("pause");
				}
				SDL_UpdateWindowSurface(menu);
			}
			switch (ev.type) {
			case SDL_QUIT: actived = true;
				break;
			case SDL_KEYDOWN:
				switch (ev.key.keysym.sym) {
				case SDLK_0: actived = true;
					break;
				case SDLK_1: b = 500;
					break;
				}
			}
		}
	}
	SDL_DestroyRenderer(rendu);
	SDL_DestroyWindow(load);
	SDL_DestroyWindow(menu);
	IMG_Quit();
	SDL_Quit();
	return 1;
}

Bien sûr certaines variables ont été créé pour la suite, elle ne sont pas encore utilisées. 

Cette erreur est présente dans de nombreux forums mais les pages de codes étaient complètement différentes et les explications étaient des jeux de pistes, qui ne m'ont pas amené au trésor...

Si une âme brave peut ce montrer, je prends ;)

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2017 à 14:56:55

Salut,

SDL_Surface *image = IMG_Load(localisation.c_str());

?

Je vois pas trop pourquoi tu t'emmerdes à copier ça dans un char* (beurk). Pour le =2222, n'est-ce pas parce que ton pointeur ne se termine pas par '\0' ?

Sinon, beaucoup de petites "erreurs" :

  • SDL_RENDERER_ACCELERATED || SDL_RENDERER_PRESENTVSYNC => Remplace || par | (c'est un flag) ;
  • Pas de variables globales ;
  • Ton main beaucoup trop long ;
  • Évite au maximum d'utiliser des pointeurs (Quitte à utiliser une lib C++ et pas une lib C ;) ) ;
  • Sûrement d'autres choses que je n'ai pas vues

-
Edité par Emrak 21 juin 2017 à 14:57:17

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 12:10:56

Merci pour tous tes conseils, j'ai changé mon code et voila le résultat :

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>

using namespace std;

void winopenned(SDL_Window *, SDL_Window *, SDL_Renderer *, int, int, char *, bool);

int main(int argc, char *argv[]) {
	SDL_Init(SDL_INIT_VIDEO);
	IMG_Init(IMG_INIT_JPG);
	SDL_Window *load = SDL_CreateWindow("Load", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 50, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS);
	SDL_Window *menu = SDL_CreateWindow("Menu", 5, 35, 0, 0, SDL_WINDOW_SHOWN);
	SDL_Renderer *rendu = SDL_CreateRenderer(load, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	SDL_SetWindowFullscreen(load, SDL_FALSE);
	SDL_SetWindowResizable(load, SDL_FALSE);
	SDL_SetRenderDrawColor(rendu, 255, 0, 0, 255);
	winopenned(load, menu, rendu, 0, 0, 0, false);
	SDL_DestroyRenderer(rendu);
	SDL_DestroyWindow(load);
	SDL_DestroyWindow(menu);
	IMG_Quit();
	SDL_Quit();
	return 1;
}

void winopenned(SDL_Window *fenetre1, SDL_Window *fenetre2, SDL_Renderer *rendu1, int a, int b, char *un, bool actived) {
	SDL_Event ev;
	while (!actived) {
		while (SDL_PollEvent(&ev) != 0) {
			SDL_Rect pb = { 0, 0, a, 50 };
			SDL_RenderFillRect(rendu1, &pb);
			SDL_RenderPresent(rendu1);
			SDL_Delay(35);
			if (a < 400)
				a = a + b + 1;
			b++;
			if (a > 400) {
				SDL_DestroyWindow(fenetre1);
				SDL_SetWindowSize(fenetre2, 1280, 720);
				string type = "Ice";
				string pos = "10";
				SDL_Renderer *sprite = SDL_CreateRenderer(fenetre2, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
				SDL_Rect img = { 0, 0, 121, 121 };
				SDL_RenderPresent(sprite);
				string localisation = "runes/support/" + type + "/" + type + pos + ".png";
				SDL_Surface *image = IMG_Load(localisation.c_str());
				SDL_BlitSurface(image, NULL, image, &img);
				if (!image) {
					cout << "Erreur de chargement de l'image : " << SDL_GetError(); // affiche toujours l'erreur : SDL_UpperBlit: passed a NULL surface
					system("pause");
				}
				SDL_UpdateWindowSurface(fenetre2);
			}
			switch (ev.type) {
			case SDL_QUIT: actived = true;
				break;
			case SDL_KEYDOWN:
				switch (ev.key.keysym.sym) {
				case SDLK_0: actived = true;
					break;
				case SDLK_1: b = 500;
					break;
				}
			}
		}
	}
}

Plus de variables globales, séparation en 2 fonctions, rectification || -> |, par contre pour limiter les pointeurs, je ne vois pas comment faire, passer d'une lib c++ à c ?

Il me semble que la SDL et iostream sont des lib c++ non ? 

Le plus gros problème c'est qu'il affiche toujours la même erreur et l'image ne s'affiche donc pas...

-
Edité par smiletim 22 juin 2017 à 12:40:27

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 13:53:20

Salut,

Je ne pourrai pas t'aider sur l'erreur que tu rencontres, mais puisque tu parles d'optimisation, tu a malheureusement adopté la pire façon de faire. Je m'explique:
- Tu crées une fenetre.
- Tu entre dans la boucle de jeux.
- Dans la boucle, tu charge ton image.
- Encore dans la boucle, tu l'affiches.
- Toujours dans la boucle, tu test si l'image à bien été chargée.

Bref, le chargement et test de chargement des ressource est au mauvais endroit. Le chargement des ressources est coûteux, et il est inutile de les recharger à chaque tour de boucle (en plus, c'est une fuite de memoire car tu ne libères jamais la ressource).
Le chargement des ressources doit être fait une seule fois et en amont, avant même d'entrer dans la boucle de jeux.

Enfin, utiliser une librairie C en C++ sans l'encapsuler dans des capsules conformes RAII, c'est se tirer une balle dans le pied.
SFML est plus recommandée que SDL, tu n'auras pas ce boulot d'encapsulation préalable à faire vu que c'est une librairie C++.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 17:14:21

En fait Deedolith, le programme ne prendra pas cette forme à la fin (il y aura plusieurs class pour int, acitve, ...)

Cependant, je prends note de tes remarques qui me seront je pense utilise par le suite :)

En fait, mon gros problème c'est que je sais pas afficher une image en SDL, après quand je serais faire cela je serais posey.

Pour ce qui est de rejoindre le mouvement SFML j'ai vu que tu spamais cela sur le forum mais en fait j'ai testé facilement une dizaine de librairie pour dev des apps (logiciels ou jeu) comme wx, qt, SFML, Electron, API, ..., et même le VULKAN (oui c'est les moments où je suis taré...) et "la meilleure au niveau qualité prix" (complexité, poids en Mo du résultat) la SDL m'a séduit...

Je pense que tu dois me prendre pour un gros Jean-Kevin, mais je préfère apprendre "correctement" la SDL même si je dois passer plus de temps à comprendre et à faire des programmes d'entrainement...

Pour ce qui est du RAII, je me suis documenté dessus et si j'ai bien compris, cela consiste en gros à écrire les logs dans un fichier pour évité son stockage dans la mémoire vive, mais est-ce vraiment utile pour un si petit programme ? En tout cas, si mon projet prend de l’ampleur, je penserais à toi et j’essayerais ta technique.

Merci quand même pour ton commentaire, cela m'a appris des choses (et j'en ai bien besoin) même si cela ne résout pas mon problème ;)

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 17:41:09



smiletim a écrit:

Pour ce qui est du RAII, je me suis documenté dessus et si j'ai bien compris, cela consiste en gros à écrire les logs dans un fichier pour évité son stockage dans la mémoire vive, mais est-ce vraiment utile pour un si petit programme ? En tout cas, si mon projet prend de l’ampleur, je penserais à toi et j’essayerais ta technique.

Tu n'y es pas du tout !!
Les capsules RAII (Ressource Acquisition Is Initialisation) existent pour faciliter l'allocation dynamique des ressources, et libérer automatiquement ces dernières sans fuites de memoire, déchargeant ainsi le programmeur de la gestion manuelle de la memoire et tous les inconveniants qui vont avec.

Considère l'exemples ci-dessous:

int main()
{
    int* val1 = new int;
    *val1 = 5;
    int* val2 = new int;
    val2 = 8;
    delete val2;
    delete val1;
}

Pour un débutant, rien d'anormal, on alloue 2 dynamiquement 2 variables (donc des ressources), que l'on libère quand on en a plus besoin.
Sauf que l'operateur new peut lancer une exception. Si l'allocation de val2 echoue, le programme se termine immediatement, et val1 n'est jamais libéré.

Considère maintenant l'exemple suivant:

class Capsule
{
private:
	int* mData;
public:
	Capsule(int value)
	{
		mData = new int;
		*mData = value;
	}
	~Capsule()
	{
		delete mData;
	}
	int get() const
	{
		return *mData;
	}
};

int main()
{
	Capsule val1{5};
	Capsule val2{8};
}
La construction des objets fais appel à l'allocation dynamique, mais val1 et val2 sont des variables automatiques, qui seront detruites automatiquement en cas de problème.

-
Edité par Deedolith 22 juin 2017 à 17:50:53

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 17:44:00

Salut,

Pour l'idée d'un wrapper SDL : https://openclassrooms.com/forum/sujet/sdl-rapidite?page=1#message-91797368

(Sinon, y'en a pas qui existe déjà ?)

-
Edité par Emrak 22 juin 2017 à 17:44:36

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 18:03:20

J'ai essayé de comprendre ce que tu as dis Emrak pour l'idée du wrapper SDL mais je n'y comprends vraiment rien car je suis débutant (ton truc relate de la fonction enum non ?)

Voici mon code après les conseils de Deedolith :

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>

using namespace std;

void winopenned(SDL_Window *, SDL_Window *, SDL_Renderer *, SDL_Renderer *, SDL_Surface *, SDL_Rect, SDL_Rect, int, int, char *, bool);

int main(int argc, char *argv[]) {

	SDL_Init(SDL_INIT_VIDEO);
	IMG_Init(IMG_INIT_JPG);

	SDL_Window *load = SDL_CreateWindow("Load", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 400, 50, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS);
		SDL_SetWindowFullscreen(load, SDL_FALSE);
		SDL_SetWindowResizable(load, SDL_FALSE);
	SDL_Window *menu = SDL_CreateWindow("Menu", 5, 35, 0, 0, SDL_WINDOW_SHOWN);
	SDL_Renderer *renduload = SDL_CreateRenderer(load, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	SDL_Renderer *rendumenu = SDL_CreateRenderer(menu, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	SDL_Surface *image;
	SDL_Rect progressbar;
	SDL_Rect rectangleimage = { 0, 0, 121, 121 };

	SDL_RenderFillRect(renduload, &progressbar);
	SDL_SetRenderDrawColor(renduload, 255, 0, 0, 255);

	winopenned(load, menu, renduload, rendumenu, image, progressbar, rectangleimage, 0, 0, 0, false);
	
	SDL_FreeSurface(image);
	SDL_DestroyRenderer(renduload);
	SDL_DestroyRenderer(rendumenu);
	SDL_DestroyWindow(menu);
	IMG_Quit();
	SDL_Quit();
	return 1;
}

void winopenned(SDL_Window *fenetre1, SDL_Window *fenetre2, SDL_Renderer *rendu1, SDL_Renderer *rendu2, SDL_Surface *surface1, SDL_Rect rectangle1, SDL_Rect rectangle2, int a, int b, char *un, bool actived) {
	SDL_Event ev;
	string type = "Ice", pos = "10", localisation;
	while (!actived) {
		while (SDL_PollEvent(&ev) != 0) {
			rectangle2 = { 0, 0, a, 50 };
			SDL_RenderPresent(rendu1);
			SDL_Delay(35);
			if (a < 400)
				a = a + b + 1;
			b++;
			if (a > 400) {
				SDL_DestroyWindow(fenetre1);
				SDL_SetWindowSize(fenetre2, 1280, 720);
				SDL_RenderPresent(rendu2);
				localisation = "runes/support/" + type + "/" + type + pos + ".png";
				surface1 = IMG_Load(localisation.c_str());
				SDL_BlitSurface(surface1, NULL, surface1, &rectangle2);
				if (!surface1) {
					cout << "Erreur de chargement de l'image : " << SDL_GetError(); // affiche toujours l'erreur : SDL_UpperBlit: passed a NULL surface
					system("pause");
					actived = true;
				}
				SDL_UpdateWindowSurface(fenetre2);
			}
			switch (ev.type) {
			case SDL_QUIT: actived = true;
				break;
			case SDL_KEYDOWN:
				switch (ev.key.keysym.sym) {
				case SDLK_0: actived = true;
					break;
				case SDLK_1: b = 500;
					break;
				}
			}
		}
	}
}

Après, je trouve qu'il y à beaucoup de paramètres dans la fonction void donc  il faut créer d'autre fonctions (je pense).

Cependant je me trouve maintenant face à deux problèmes :

 - Le problème de départ (qui est le thème de se blog)

- Une erreur à la ligne 27 : Run-Time Check Failure #3 - The variable 'image' is being used without being initialized. Il arrive à lancer l'application mais sa crash après (erreur exception).

Merci de répondre en priorité au premier problème ;)

Pour se qui est de ton histoire de ~Capsule (je l'ai vu que après), je dois le faire à tous mes pointeurs (SDL_Renderer, SDL_Surface, etc) ?


-
Edité par smiletim 22 juin 2017 à 18:17:07

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2017 à 20:17:08

Bonjour smiletim :)

Voici une adresse avec des wrappers pour la SDL 2: http://www.swarminglogic.com/jotting/2015_05_smartwrappers

J'ai utilisé ce tuto pour mes projets de jeux video, ça m'a grandement simplifié la vie.:magicien: Plus besoin de libérer les ressources à la main.

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

22 juin 2017 à 21:01:55

Salut,

Mis à part le fait que ton code soit plus du C que du C++, tu utilises la SDL 2 comme si c’était la SDL 1.2.

  • Utilise des textures à la place de tes surfaces => exit les SDL_UpdateWindowSurface et utilisation de IMG_LoadTexture.
  • Ne charge pas surface_1 à chaque tour de boucle.
  • Tu n’utilises jamais surface dans ton main => retire le en paramètre de ta fonction et supprime le de ton main.
  • Ta fonction winopenned ne fait pas quelque chose de clair. Change son nom, fais plus de fonctions.
  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
22 juin 2017 à 21:45:30

Bonsoir,

un autre wrapper pour la SDL 2 en C++ : https://github.com/libSDL2pp/libSDL2pp

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 10:40:34

Salut,

Tu ne charge toujours pas les ressources avant d'entrer dans la boucle principale, par conséquent tu as une fuite de memoire immonde !

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 13:04:37

Je sais ce que ça fait de voir un programme moche et mal optimisé mais, SVP POUVEZ VOUS ME DIRE COMMENT AFFICHER UNE IMAGE DE FACON BASIQUE.

Par la suite, je pourrais m'améliorer mais si j'ai pas les bases ça ne sert à rien (c'est comme connaître tous le voc en anglais mais ne pas savoir faire de phrase).

Merci de votre compréhension.

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2017 à 13:45:05

> SVP POUVEZ VOUS ME DIRE COMMENT AFFICHER UNE IMAGE DE FACON BASIQUE.

Pourquoi écrire en majuscule ? Tu as plusieurs tutoriels sur Internet qui te montrent comment faire, une petite recherche et tu as ce qu’il faut.

Voici un exemple en C.

int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    int statut = -1;

    if(0 != SDL_Init(SDL_INIT_VIDEO))
        fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
    else
    {
        SDL_Window *window = SDL_CreateWindow("IMG", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                                              640, 480, SDL_WINDOW_SHOWN);
        if(!window)
            fprintf(stderr, "Erreur SDL_CreateWindow : %s", SDL_GetError());
        else
        {
            SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if(!renderer)
                fprintf(stderr, "Erreur SDL_CreateRenderer : %s", SDL_GetError());
            else
            {
                SDL_Texture *texture = IMG_LoadTexture("img.bmp", renderer);
                if(!texture)
                    fprintf(stderr, "Erreur IMG_LoadTexture : %s", IMG_GetError());
                else
                {
                    SDL_RenderCopy(renderer, texture, NULL, &NULL); 
                    SDL_Delay(3000);
                    statut = 0;
                    SDL_DestroyTexture(texture);
                }
                SDL_DestroyRenderer(renderer);
            }
            SDL_DestroyWindow(window);
        }
        
        SDL_Quit();
    }
    return statut;
}

-
Edité par yo@n97one 23 juin 2017 à 13:46:36

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
23 juin 2017 à 19:50:23

Voila pourquoi je n'arrive pas à afficher une image : yo@n97one ton code marche pas et j'ai essayé de nombreux codes tout fais sur des forums, sans succès...

"img.bmp", renderer -> inversé
&NULL -> souligné
J'ai essayé ce code, mais sans succès :
#include <SDL.h>
#include <SDL_image.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	SDL_Window *window = NULL;
	SDL_Renderer *renderer = NULL;
	int statut = -1;

	if (0 != SDL_Init(SDL_INIT_VIDEO))
		fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
	else
	{
		SDL_Window *window = SDL_CreateWindow("IMG", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
			640, 480, SDL_WINDOW_SHOWN);
		if (!window)
			fprintf(stderr, "Erreur SDL_CreateWindow : %s", SDL_GetError());
		else
		{
			SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
			if (!renderer)
				fprintf(stderr, "Erreur SDL_CreateRenderer : %s", SDL_GetError());
			else
			{
				SDL_Texture *texture = IMG_LoadTexture(renderer, "img.jpg");
				if (!texture)
					fprintf(stderr, "Erreur IMG_LoadTexture : %s", IMG_GetError());
				else
				{
					SDL_RenderCopy(renderer, texture, NULL, NULL); //nullptr ne fonctione pas ainsi que null
					SDL_Delay(3000);
					statut = 0;
					SDL_DestroyTexture(texture);
				}
				SDL_DestroyRenderer(renderer);
			}
			SDL_DestroyWindow(window);
		}

		SDL_Quit();
	}
	return statut;
}

Je ne sais pas si c'est important, je compile en 64 bits...

Deplus, toutes les autres personne de la discution recommande le c++...

C'est incroyable, tous les problèmes que j'ai sont insolvables...

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2017 à 0:27:35

En effet, j’ai écrit le code sans le tester, en plus de ce que tu as relevé, il manque un SDL_RenderPresent(renderer) après le SDL_RenderCopy.

> Deplus, toutes les autres personne de la discution recommande le c++...

Le problème, c’est que le C et le C++ sont deux langages différents. Utiliser iostream veut juste dire que tu compiles en C++, mais hormis ça, tous les codes que tu as posté sont du C. Si tu ne connais pas le C++ mais le C, fais du C (ou apprend le C++). Sinon as-tu essayé de suivre un tutoriel sur la SDL ?

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
24 juin 2017 à 22:02:37

J'ai essayé de nombreux tuto SDL (notamment sur yt) mais c'est de l'anglais alors je ne comprenais la moitié des choses et j'ai depuis peut compris qu'il vaut mieux comprendre de la merde pour s'attaquer à mieux plutôt que rien comprendre et recopier bêtement...

Ps : Aucune vidéo ne m'as permis d'afficher une image correctment...

Pour finir en beauté, même avec SDL_RenderPresent(renderer), sa crash et sa ne marche pas :

Il dit que ça c'est arrêté avec le code -1...

Comme je le dis tout le temps (je pense que c'est mon slogan) :

C'est incroyable, tous les problèmes que j'ai sont insolvables...

-
Edité par smiletim 24 juin 2017 à 22:03:28

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2017 à 23:43:48

> Il dit que ça c'est arrêté avec le code -1...

Donc ça veut dire qu’une initialisation ou un chargement a échoué. As-tu regardé stderr pour connaître le message d’erreur ? Le fichier img.jpg est bien placé au bon endroit ?

> J'ai essayé de nombreux tuto SDL (notamment sur yt) mais c'est de l'anglais alors je ne comprenais la moitié des choses et j'ai depuis peut compris qu'il vaut mieux comprendre de la merde pour s'attaquer à mieux plutôt que rien comprendre et recopier bêtement...

Regarde sur Zeste de Savoir ou encore sur Developpez. Sais-tu au moins à quoi sert le renderer et les textures, et ce que font les fonctions du code ? Si non, il faudrait d’abord comprendre ça et faire les choses dans l’ordre.

PS : insolvable ne veut pas du tout dire ce que tu penses.

-
Edité par yo@n97one 24 juin 2017 à 23:46:25

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs