Autor Wątek: Scrolling-Problem  (Przeczytany 1646 razy)

Offline Aloneman4

  • Użytkownik

# Grudzień 19, 2010, 23:15:59
Witam, mam problem.
Oto moj kod:
//Includy
#include <SDL/SDL.h>
#include <windows.h>

//Integers
const int WIDTH = 640;
const int HEIGHT = 480;
const int BPP = 32;

int width = 32;
int height = 32;

int srcX = 0;
int srcY = 0;

int dstX = 0;
int dstY = 0;

int SPRITE_WIDTH = 1661;
int SPRITE_HEIGHT = 1246;

bool running = true;

bool key[323] = {false};

SDL_Event event;
//Powierzchnie
SDL_Surface *screen = NULL;
SDL_Surface *background = NULL;
SDL_Surface *sprite = NULL;

//Funkcje
void Init_And_Video()
{
     SDL_Init(SDL_INIT_EVERYTHING);
     screen = SDL_SetVideoMode(WIDTH,HEIGHT,BPP,SDL_SWSURFACE);
     SDL_WM_SetCaption("SDLTutorial",NULL);
}
void ImagesLoad()
{
     background = SDL_LoadBMP("Data/Images/Backgrounds/Background.bmp");
     sprite = SDL_LoadBMP("Data/Images/CharacterImages/Ball.bmp");
     SDL_SetColorKey(sprite,SDL_SRCCOLORKEY,SDL_MapRGB(sprite->format,255,0,255));
}
void M_B()
{
     MessageBox(NULL,"Program rozpoczyna dzialanie!","Uwaga!",MB_OK);
     if(!SDL_LoadBMP("Data/Images/Backgrounds/Background.bmp"))
     {
                     MessageBox(NULL,"Nie znaleziono obrazu", "Blad!",MB_OK);
     }
     if(!SDL_LoadBMP("Data/Images/CharacterImages/Ball.bmp"))
     {
                                                             
                     MessageBox(NULL,"Nie znaleziono obrazu", "Blad!",MB_OK);
     }
}
void draw_sprite(int srcX, int srcY,int dstX,int dstY,int width,int height,SDL_Surface *source, SDL_Surface *destination)
{
     SDL_Rect src;
     src.x = srcX;
     src.y = srcY;
     src.w = width;
     src.h = height;
     
     SDL_Rect dst;
     dst.x = dstX;
     dst.y = dstY;
     dst.w = width;
     dst.h = height;
     
     SDL_BlitSurface(source,&src,destination,&dst);
}
void apply_surface(int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip = NULL)
{
     SDL_Rect rect;
     rect.x = x;
     rect.y = y;
     
     SDL_BlitSurface(source,clip,destination,&rect);
}
//kamera
SDL_Rect camera = {0,0,WIDTH,HEIGHT};
//klasa kamery
class Sprite {
      private:
              int xVel, yVel;
              public:
                     Sprite();
                     
                     void handle_input();
                     
                     void move();
                     
                     void show();
                     
                     void set_camera();
};
//Zdefiniowanie Sprite'a
Sprite::Sprite()
{
                dstX = 0;
                dstY = 0;
                xVel = 0;
                yVel = 0;
}
void Sprite::handle_input()
{
    //If a key was pressed
    if( event.type == SDL_KEYDOWN )
    {
   
                key[event.key.keysym.sym] = true;
                if(key[SDLK_UP])
                  {
                                    dstY -= 1;
                  }
                if(key[SDLK_DOWN])
                  {
                                    dstY += 1;
                  }
                if(key[SDLK_LEFT])
                  {
                                    dstX -= 1;
                  }
                if(key[SDLK_RIGHT])
                  {
                                    dstX += 1;
                  } 
    }
    //If a key was released
    else if( event.type == SDL_KEYUP )
    {
                key[event.key.keysym.sym] = false;     
    }
}
//Sprite ruch
void Sprite::move()
{
     dstX += xVel;
     if((dstX < 0)||(dstX + width > SPRITE_WIDTH))
     {
          dstX -= xVel;
     }
     dstY -= yVel;
     if((dstY < 0)||(dstY + height > SPRITE_HEIGHT))
     {
          dstY -= yVel;
     }
}
//Umieszczamy kamere nad sprite
void Sprite::set_camera()
{
     camera.x = (dstX + width/2)-WIDTH/2;
     camera.y = (dstY + height/2)-HEIGHT/2;
     
     if(camera.x < 0)
     {
                 camera.x = 0;
     }
     if(camera.y < 0)
     {
                 camera.y = 0;
     }
     
     if(camera.x > SPRITE_WIDTH - camera.w)
     {
                 camera.x = SPRITE_WIDTH - camera.w;
     }
     if(camera.y > SPRITE_HEIGHT - camera.h)
     {
                 camera.y = SPRITE_HEIGHT - camera.h;
     }
}
void Sprite::show()
{
     apply_surface(dstX - camera.x, dstY - camera.y, sprite, screen );
}
//Funkcja glowna
int main(int argc, char *argv[])
{
    //Deklaracja Sprite'a
    Sprite mySprite;
    //Errors and messages
    M_B();
    //Init and video func
    Init_And_Video();
      //Image Load
    ImagesLoad();

    //Game loop
    while(running)
    {
                  if(SDL_PollEvent(&event))
                  {
                                       if(event.type == SDL_QUIT)
                                       {
                                                     running = false;
                                       }
                                       
                  }
                                       mySprite.move();
                                       
                                       mySprite.set_camera();
                                       
                                       apply_surface(0,0,background,screen,&camera);
                                       
                                       mySprite.show();
                                       
                                       mySprite.handle_input();
    //apply_surface
    SDL_Flip(screen);
    }
    SDL_FreeSurface(sprite);
    SDL_Quit();
    return 0;
}

I teraz jest problem, kamera ladnie chodzi na boki tzn. ludzik dochodzi do pewnego miejsca i mapa sie przewija, ale w gore i w dol juz nie...Nie wiem czym to jest spowodowane ale kiedy ludzik dochodzi do polowy mapy wyswietlonej idac w dol to nagle sie zatrzymuje i idzie w prawo...;[ Pomocy! Co mam zmienic w kodzie?!

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Grudzień 19, 2010, 23:32:24
Witam, mam problem.
Dzień dobry, będzie wpi**dol :)

A tak na serio, to mógłbyś podrzucić obrazki (ball i background) żebym mógł zobaczyć o co chodzi? Albo chociaż podaj wymiary?

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Grudzień 19, 2010, 23:32:46
Ciężko powiedzieć bez sprawdzania, ale przyjrzj się znakom w tym miejscu:
dstX += xVel;
if((dstX < 0)||(dstX + width > SPRITE_WIDTH))
{
     dstX -= xVel;
}
dstY -= yVel;
if((dstY < 0)||(dstY + height > SPRITE_HEIGHT))
{
     dstY -= yVel;
}

Offline Aloneman4

  • Użytkownik

# Grudzień 19, 2010, 23:43:40
No wiec tak:
'ball' jak to wspomniane zostalo ;P  ma rozmiary 32x32
Background ma rozmiary 1661x1246

Ze znakow nie wywnioskowalem nic; D

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Grudzień 19, 2010, 23:46:12
To bardzo nie dobrze, takie chochliki się zdarzają, a nie możesz za każdym razem z tym na forum przylatywać.
Odejmujesz od dstY yVel, sprawdasz, czy dstY jest mniejsze niż 0, i jeśli tak, to jeszcze raz odejmujesz yVel.

Offline Aloneman4

  • Użytkownik

# Grudzień 20, 2010, 00:10:37
Tak, tak wlasnie robie ale Ty to napisales i nic z tego nie wnioskuje bo to nie wyjasnilo mojego problemu, mozesz objasnic?

Offline Xirdus

  • Redaktor

# Grudzień 20, 2010, 00:10:49
Porównaj obsługę chodzenia w poziomie z chodzeniem w pionie. Powinno być tak samo (a nie jest).

Offline Aloneman4

  • Użytkownik

# Grudzień 20, 2010, 00:21:52
dstX += xVel;
     if((dstX < 0)||(dstX + width > SPRITE_WIDTH))
     {
          dstX -= xVel;
     }
     dstY += yVel;
     if((dstY < 0)||(dstY + height > SPRITE_HEIGHT))
     {
          dstY -= yVel;
     }

Teraz obsługa chodzenia wyglada tak... Niestety nadal nie rozwiazalo to mojego problemu bo po kompilacji nic sie nie zmienia

Offline cybek

  • Użytkownik
    • Strona domowa!

# Grudzień 20, 2010, 00:58:46
Ale dzięki temu unikniesz błędu, który w przyszłości by ci się nagle ujawnił, mając 3 razy więcej kodu.

Offline Aloneman4

  • Użytkownik

# Grudzień 20, 2010, 10:51:45
W dalszym ciągu czekam na odpowiedzi...

Offline Karol

  • Użytkownik

# Grudzień 20, 2010, 11:04:59
W dalszym ciągu czekam na odpowiedzi...
Odpowiedź brzmi: naucz się korzystać z debugera. Zapewne w minutę byś doszedł co jest nie tak.