Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z SDL

Ostatnio zmodyfikowano 2011-03-16 17:13
Autor Wiadomość
piotrwalkusz1
Temat założony przez niniejszego użytkownika
Problem z SDL
» 2011-03-15 21:36:38
Witam. Mój program nie działa jak należy więc proszę was, doświadczonych programistów o znalezienie w moim programie błędu. Wszystko się ładnie kompiluje, ale nie takiego wyniku oczekiwałem. Tło jest czarne, a powinno być zielone (Ścieszka do pliku jest dobra, sprawdzałem). Oto kod:

C/C++
//main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <windows.h>
#include "mapa.hpp"

SDL_Surface * ekran;
SDL_Event zdarzenie;
bool wyjscie = false;
mapa mapa1( 1 );
int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 1024, 768, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    while( !wyjscie )
    {
        mapa1.narysuj_mape( ekran );
        SDL_Flip( ekran );
        while( SDL_PollEvent( & zdarzenie ) )
        {
            //tu nic ciekawego nie ma
        }
        Sleep( 50 );
    }
    return 0;
}

//mapa.hpp

#ifndef MAPA_HPP
#define MAPA_HPP
#include <fstream>
#include "pole.hpp"
using namespace std;
class mapa
{
private:
    pole miejsce[ 23 ][ 34 ];
    int ilosc_wierszy;
    int ilosc_kolumn;
public:
    mapa( int wybor_mapy );
    void narysuj_mape( SDL_Surface * rysunek );
    void narysuj_gory();
    void nadaj_wiersz( char * tab, int wielkosc, int wiersz );
};
#endif

//pole.hpp

#ifndef POLE_HPP
#define POLE_HPP
#include <SDL/SDL.h>
class pole
{
private:
    int x, y;
    char rodzaj;
    int obiekt;
public:
    void narysuj( SDL_Surface * rysunek );
    void nadaj_pozycje( int poz_y, int poz_x );
    void nadaj_rodzaj( char znak );
    char podaj_rodzaj();
};
#endif

//mapa.cpp

#include "mapa.hpp"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
mapa::mapa( int wybor_mapy )
{
    switch( wybor_mapy )
    {
    case 1:
        char tab1[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab2[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab3[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab4[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab5[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab6[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab7[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab8[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab9[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        char tab10[ 10 ] = { '1', '1', '1', '1', '1', '1', '1', '1', '1', '1' };
        nadaj_wiersz( tab1, 10, 0 );
        nadaj_wiersz( tab2, 10, 0 );
        nadaj_wiersz( tab3, 10, 0 );
        nadaj_wiersz( tab4, 10, 0 );
        nadaj_wiersz( tab5, 10, 0 );
        nadaj_wiersz( tab6, 10, 0 );
        nadaj_wiersz( tab7, 10, 0 );
        nadaj_wiersz( tab8, 10, 0 );
        nadaj_wiersz( tab9, 10, 0 );
        nadaj_wiersz( tab10, 10, 0 );
        for( int w = 0; w < 10; w++ )
        {
            for( int k = 0; k < 10; k++ )
            {
                miejsce[ w ][ k ].nadaj_pozycje( w, k );
            }
        }
        break;
    }
}

void mapa::narysuj_mape( SDL_Surface * rysunek )
{
    for( int w = 0; w < ilosc_wierszy; w++ )
    {
        for( int k = 0; k < ilosc_kolumn; k++ )
        {
            miejsce[ w ][ k ].narysuj( rysunek );
        }
    }
}

void mapa::narysuj_gory()
{
    char a;
    for( int w = 0; w < ilosc_wierszy; w++ )
    {
        for( int k = 0; k < ilosc_kolumn; k++ )
        {
            a = miejsce[ w ][ k ].podaj_rodzaj();
            if( a == '2' )
            {
                if( miejsce[ w - 1 ][ k - 1 ].podaj_rodzaj() == '1' && w > 0 && k > 0 ) //1
                {
                    miejsce[ w - 1 ][ k - 1 ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w - 1 ][ k ].podaj_rodzaj() == '1' && w > 0 ) //2
                {
                    miejsce[ w - 1 ][ k ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w - 1 ][ k + 1 ].podaj_rodzaj() == '1' && w > k < ilosc_kolumn - 1 ) //3
                {
                    miejsce[ w - 1 ][ k + 1 ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w ][ k - 1 ].podaj_rodzaj() == '1' && k > 0 ) //4
                {
                    miejsce[ w ][ k - 1 ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w ][ k + 1 ].podaj_rodzaj() == '1' && k < ilosc_kolumn - 1 ) //5
                {
                    miejsce[ w ][ k + 1 ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w + 1 ][ k - 1 ].podaj_rodzaj() == '1' && w < ilosc_wierszy - 1 && k > 0 ) //6
                {
                    miejsce[ w + 1 ][ k - 1 ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w + 1 ][ k ].podaj_rodzaj() == '1' && w < ilosc_wierszy - 1 ) //7
                {
                    miejsce[ w + 1 ][ k ].nadaj_rodzaj( '3' );
                }
                if( miejsce[ w + 1 ][ k + 1 ].podaj_rodzaj() == '1' && w < ilosc_wierszy - 1 && k < ilosc_kolumn - 1 ) //8
                {
                    miejsce[ w + 1 ][ k + 1 ].nadaj_rodzaj( '3' );
                }
            }
        }
    }
}

void mapa::nadaj_wiersz( char * tab, int wielkosc, int wiersz )
{
    for( int i = 0; i < wielkosc; i++ )
    {
        miejsce[ wiersz ][ i ].nadaj_rodzaj( * tab );
        tab++;
    }
}

//pole.cpp

#include "pole.hpp"
#include <SDL/SDL.h>
void pole::nadaj_rodzaj( char znak )
{
    rodzaj = znak;
}
void pole::nadaj_pozycje( int poz_y, int poz_x )
{
    y = poz_y * 30;
    x = poz_x * 30;
}
void pole::narysuj( SDL_Surface * rysunek )
{
    SDL_Surface * obraz = NULL;
    SDL_Rect fragment;
    fragment.x = x;
    fragment.y = y;
    switch( rodzaj )
    {
    case '1':
        obraz = SDL_LoadBMP( "nizina.bmp" );
    case '2':
        obraz = SDL_LoadBMP( "sciana.bmp" );
    case '3':
        obraz = SDL_LoadBMP( "gora.bmp" );
    }
    SDL_BlitSurface( obraz, NULL, rysunek, & fragment );
    SDL_FreeSurface( obraz );
}
char pole::podaj_rodzaj()
{
    return rodzaj;
}

Ja sprawdzałem ten kod już wiele razy i nic nie znalazłem plik "nizina.bmp" jest obrazem bitmapowym 30x30 pikseli i jest cały zielony.
P-29161
kamillo121
» 2011-03-15 22:17:21
Pomijając fakt, że funkcja która wczytuje bitmapę kopiuje ją a potem uwalnia pamięć i tak w kółko jest lekkim, ba wielkim marnotrawstwem (chyba, że źle obczaiłem kod to sry) ustaw w i h dla fragmentu.

C/C++
O tutaj
void pole::narysuj( SDL_Surface * rysunek )
{
    SDL_Surface * obraz = NULL;
    SDL_Rect fragment;
    fragment.x = x;
    fragment.y = y; //potem przy blitowaniu funkcja sobie pomyśli, że ma kopiować w podane miejsce x,y obraz o rozmiarach 0x0 albo jakieś tam losowej
   
    switch( rodzaj )
    {
    case '1':
        obraz = SDL_LoadBMP( "nizina.bmp" );
    case '2':
        obraz = SDL_LoadBMP( "sciana.bmp" );
    case '3':
        obraz = SDL_LoadBMP( "gora.bmp" );
    }
    /*Dodaj to */
    fragment.w = obraz.w;
    fragment.h = obraz.h;
    /*         */
    SDL_BlitSurface( obraz, NULL, rysunek, & fragment );
    SDL_FreeSurface( obraz );
}
To tak na szybko, jak Ci nikt nie udzieli pomocy do jutra a to nie zadziała  to obczaję dokładnie  :)

P-29165
piotrwalkusz1
Temat założony przez niniejszego użytkownika
» 2011-03-16 16:38:25
To akurat nie pomogło.
 
P-29196
kamillo121
» 2011-03-16 16:56:03
Dopiero teraz zauważyłem budowę tego śmiesznego switch'a

C/C++
switch( warttosc )
{
case VAL:
    //akcja
case VAL_2:
    //akcja
}

Dodaj breake bo w przeciwnym razie będzie ci ładować nie jedną a kilka bitmap (zależy od wartości).

Skoro nie zadziałało, to próbuj usuwać zbędne elementy i próbować bez nich aż znajdziesz błąd...

Sprawdź "warunkiem kontrolnym" czy wogole po switch'u bitmapa faktycznie się załadowała
C/C++
if( obrazek == NULL )
{
    //zbij program 
}
P-29199
piotrwalkusz1
Temat założony przez niniejszego użytkownika
» 2011-03-16 17:13:56
Hura. Wreszcie mi się udało! Okazało się, że nie nadałem, żadnej wielkości zmiennym ilosc_kolum i ilosc_wierszy. Wszystko już działa dzięki za pomoc. Zamykam.
P-29206
« 1 »
  Strona 1 z 1