• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[SDL2] Błąd ze ścieszką do grafik.

Object Storage Arubacloud
0 głosów
381 wizyt
pytanie zadane 7 sierpnia 2017 w C i C++ przez Badzonor Obywatel (1,410 p.)

Witam! Mam taki problem:Gdy w Code::Blocks (bo w tym IDE programuję) kliknąłem F9 to polecenia

SDL_Surface * obraz_bloku = IMG_Load("C:/Grafika/Grafika1.png);

SDL_BlitScaled(obraz_bloku, NULL, ekran, &bloki);

działają poprawnie, ale gdy wejdę w pliki programu i z tamtąd go uruchomię to ta grafika się nie wczytuje.

Proszę o pomoc! 

komentarz 7 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Pokaż kod wczytywania tego obrazu, bo kod, który podałeś najwyraźniej nie jest tym, który masz w programie.
komentarz 7 sierpnia 2017 przez Badzonor Obywatel (1,410 p.)

Dobra. Jedyne co jest inaczej to jest to:

                int wynik = 10;
                string tmp;
                itoa(wynik, (char*)tmp.c_str(), 10);
                string str = tmp.c_str();
                string scieszka = "C:/Grafika/Gragika" + str + ".png";
                SDL_Surface * obraz_bloku = IMG_Load(scieszka.c_str());

I tak to wygląda.

A i jeżeli wiesz jak ten kod zoptymalizować to napisz :D

komentarz 7 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
  1. Piszemy "ścieżka", nie "ścieszka"
  2. itoa(wynik, (char*)tmp.c_str(), 10); ta linia powoduje Undefined Behaviour, gdyż modyfikujesz stały wskaźnik do zawartości stringa. Nie możesz tak zrobić, std::string sam zarządza wewnętrzną zawartością i najprawdopodobniej spowoduje to dalej błędy lub/i program się sypnie. Zadałeś niedawno pytanie o konwersję takich zmiennych i sam Ci na to pytanie odpowiedziałem, jak chcesz skonwertować inta na std::string to użyj std::stringstream lub std::to_string (akurat z tą funkcją jest pewien błąd w dawniejszych wersjach GCC, dlatego lepiej użyć std::stringstream):
    int wynik = 10;
    std::stringstream stream;
    stream << wynik;
    std::string strWynik = stream.str();

    A nawet lepiej możesz zrobić to tak:

    int wynik = 10;
    std::stringstream stream;
    stream << "C:/Grafika/Grafika" << wynik << ".png";
    SDL_Surface *obraz_bloku = IMG_Load(stream.str().c_str());

    Dodatkowo, widzę że masz literówkę w ścieżce - "C:/Grafika/Gragika".

  3. Ścieżka "C:/Grafika/Grafika" itd... jest ścieżką bezwzględną, oznacza to, że nie ma znaczenia czy uruchamiasz program z poziomu Code::Blocks czy normalnie - musisz mieć błąd gdzie indziej - może właśnie ta literówka a może jest to spowodowane przez poprzedni undefined behaviour.

komentarz 7 sierpnia 2017 przez Badzonor Obywatel (1,410 p.)
edycja 7 sierpnia 2017 przez Badzonor

Oto cały kod: (to jest początek tworzenia mojej gry)

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

#include <windows.h>
#include <iostream>
#include <cstdlib>
//przyszłe losowanie
#include <time.h>
//---------
#include <sstream>
#include <string>
using namespace std;

SDL_Window*okno;
SDL_Surface*ekran;
SDL_Event event;

SDL_Rect bloki;
SDL_Rect pozycja;
SDL_Rect pozycja_setne;

int frame = 0;
int swiat[300][300];

int main( int argc, char*args[])
{
SDL_Init(SDL_INIT_EVERYTHING);
okno = SDL_CreateWindow("Blocked In Combat", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 450, 200, NULL);
ekran = SDL_GetWindowSurface(okno);
pozycja.x = 60;
pozycja.y = 50;
pozycja_setne.x = 0;
pozycja_setne.x = 0;

//testowe 4 bloki
swiat[49][49] = 1;
swiat[50][50] = 2;
swiat[51][49] = 1;
swiat[48][49] = 1;
while(true)
    {
    if(frame == 0)
        {
        while(frame == 0)
            {
            while(SDL_PollEvent(&event))
                {
                if(event.type==SDL_QUIT)
                    {
                    return(0);
                    }
                }
               
            //Generoganie obrazu mapy na ekranie
            int do_konca_x = 0;
            int do_konca_y = 0;
            while(do_konca_y != 6)
                {
                std::stringstream stream;
                stream << "C:/BlockedInCombat/Textures/Block" << swiat[(pozycja.x - 5) + do_konca_x][(pozycja.y - 2) + do_konca_y] << ".png";
                SDL_Surface *obraz_bloku = IMG_Load(stream.str().c_str());
                int pos_x = (do_konca_x * 50) - (pozycja_setne.x / 2);
                int pos_y = (do_konca_y * 50) - (pozycja_setne.y / 2);
                bloki.x = pos_x;
                bloki.y = pos_y;
                bloki.h = 50;
                bloki.w = 50;
                SDL_BlitScaled(obraz_bloku, NULL, ekran, &bloki);
                do_konca_x++;
                if(do_konca_x > 10)
                    {
                    do_konca_y++;
                    do_konca_x = 0;
                    }
                }
                
            //Tu jest teleportacja poniewarz testuję dopiero ten program
            if(GetAsyncKeyState(VK_SHIFT))
                {
                cout << "Twoja pozycja: (X Y): " << pozycja.x << " " << pozycja.y << endl;
                cout << "Podaj nowa pozycje X: ";
                cin >> pozycja.x;
                cout << "Podaj nowa pozycje Y: ";
                cin >> pozycja.y;
                cout << endl;
                pozycja_setne.y = 0;
                pozycja_setne.x = 0;
                }
                
            //Chodzenie:
            if(GetAsyncKeyState('A'))
                {
                pozycja_setne.x -= 15;
                if(pozycja_setne.x < 0)
                    {
                    pozycja_setne.x = 99;
                    pozycja.x--;
                    }
                }
            if(GetAsyncKeyState('D'))
                {
                pozycja_setne.x += 15;
                if(pozycja_setne.x > 99)
                    {
                    pozycja_setne.x = 0;
                    pozycja.x++;
                    }
                }
                
            //Skakanie (do zrobienia)
            if(GetAsyncKeyState(VK_SPACE))
                {
                ;
                }

            SDL_UpdateWindowSurface(okno);
            SDL_Delay(30);
            }
        }
    }
}

I w tym kodzie jest właśnie ten błąd o którym mówiłem. A i niedawno zacząłem SDL2 więc pewnie niektóre rzeczy tu są nieoptymalne ale ok nauczę się :D

I przy okazji jak uruchomię program i generuje się blok o numerze 2, to w konsoli zaczyna spamować jakieś ostrzeżenie, możesz mi wytłumaczyć powód tego?

komentarz 7 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)

Raz masz ścieżkę

SDL_Surface * obraz_tlo = IMG_Load("C:/Blocked In Combat/Textures/Tlo.png");

a raz:

stream << "C:/BlockedInCombat/Textures/Block" <<

Może w tym tkwi błąd? W ogóle bardzo chaotycznie jest ten kod napisany.

Edit: jakie ostrzeżenie?

komentarz 7 sierpnia 2017 przez Badzonor Obywatel (1,410 p.)
Chaotycznie dlatego że dopiero zaczynam programować w SDL2, ale poprawia się z każdym programem :)

A co do rozbieżności ścieżek to jest tak, że zapomniałem usunąć tła bo w teście było potrzebne a już nie jest (zaraz to zmienie w kodzie :P).

Aha i jeszcze warning, no to w ścieszce C:/BlockedInCombat/Textures masz pliki Block0, 1 i 2 a Block0 oznacza tło. Po uruchomieniu programu jesteś na kratce 60 na 50 a te 4 bloki są na ok. 50 na 50, wystarczy pójść trochę w lewo (klikając 'A' lub teleportując się wpisując nową pozycję w konsoli) i kiedy pojawi się grafika Block2 to w tym momencie wyświetla się w konsoli komunikat: "libpng warning: iCCP: know incorrect sRGB profile"
komentarz 10 sierpnia 2017 przez Badzonor Obywatel (1,410 p.)
Mam coś bardzo ciekawego! Kiedy zmieniłem rozszerzenie do plików z *.png (i w plikach i kodzie) na *.bmp to działa i z pozycji Code::blocks uruchomiony z pliku. Dlaczego? Masz jakiś pomysł?
komentarz 10 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Może pliki były w złym formacie zapisane, nie wiem. Do musiał być jakiś błąd wewnętrzny.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Bot Użytkownik (760 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 7 kwietnia 2018 w C i C++ przez Badzonor Obywatel (1,410 p.)
0 głosów
1 odpowiedź 227 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez Badzonor Obywatel (1,410 p.)

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...