• 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.

0 głosów
83 wizyt
pytanie zadane 7 sierpnia 2017 w C i C++ przez ElektronPL Obywatel (1,090 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,950 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 ElektronPL Obywatel (1,090 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,950 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 ElektronPL Obywatel (1,090 p.)
edycja 7 sierpnia 2017 przez ElektronPL

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,950 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 ElektronPL Obywatel (1,090 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 ElektronPL Obywatel (1,090 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,950 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ź 113 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez Bot Użytkownik (760 p.)
0 głosów
1 odpowiedź 84 wizyt
pytanie zadane 7 kwietnia 2018 w C i C++ przez ElektronPL Obywatel (1,090 p.)
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez ElektronPL Obywatel (1,090 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

66,503 zapytań

113,269 odpowiedzi

239,876 komentarzy

46,641 pasjonatów

Przeglądających: 269
Pasjonatów: 7 Gości: 262

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...