ubuntuusers.de

SDL und Scrolling

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

aschri

Anmeldungsdatum:
16. Januar 2007

Beiträge: 151

Liebe Ubunutuuser, Ich versuche mich zurzeit an einem Spiel in SDL und C (nicht C++, kommt aber vielleicht noch). Das Spielfenster hat die Auflösung 1280x1024, ich habe jedoch ein SDL_Rect, welches um einige Pixel größer ist. Hier ist schon mal die Schleife, mit der man das Ding per Tastatur bewegt:

    SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, 1); 
    while (!quit)
    {
      SDL_PollEvent (&e);
      keystate = SDL_GetKeyState (NULL);
      if (keystate [SDLK_ESCAPE])
        quit = 1;
      if (keystate [SDLK_LEFT])
        bgr.x-=10;
      if (keystate [SDLK_RIGHT])
        bgr.x+=10;
      if (keystate [SDLK_UP])
        bgr.y-=10;
      if (keystate [SDLK_DOWN])
        bgr.y+=10; 
   }

Dieses Rechteck soll "gescrollt" werden. Leider habe ich da ein Problem: Nach rechts und nach unten kann ich das Rechteck bewegen und es stößt nicht an den Ecken an. Wenn es nach oben oder nach links bewegt wird, stoppt es an den Kanten des Fensters an. Was muss ich tun, damit das Rechteck bgr über den Fensterrand hinaus bewegt werden kann?

stfischr Team-Icon

Avatar von stfischr

Anmeldungsdatum:
1. März 2007

Beiträge: 19197

Hi, wenn du den gesamten Quelltext postest kann man dir vielleicht helfen. Könnte es sein, das bgr.x unsigned ist?

aschri

(Themenstarter)

Anmeldungsdatum:
16. Januar 2007

Beiträge: 151

#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"
#include "SDL_ttf.h"
#include "Collision.h"
#include "SDL/SDL_image.h"
#include "Click.h"

int main (void)
{
  SDL_Surface *screen, *tmp, *pic, *BG, *backg;
  SDL_Event e;
  SDL_Rect rect, bgr;
  

  Uint8 *alle_tasten;
  int quit = 0;

  if (SDL_Init (SDL_INIT_VIDEO) == -1)
    {
      fprintf (stderr, "Kann SDL nicht initialisieren: %s\n", SDL_GetError ());
      exit (1);
    }
   if(TTF_Init()==-1)
   {
      printf("TTF_Init: %s\n", TTF_GetError());
      return 2;
   }
screen = SDL_SetVideoMode(1280, 1024, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Jack Lumber","Jack Lumber");
atexit (SDL_Quit);
  if (screen == NULL)
    {
      fprintf (stderr, "Video Modus kann nicht eingerichtet werden: %s\n", SDL_GetError());
      exit (1);
    }
  if ((BG = IMG_Load ("BG.png")) == NULL)
    {
      fprintf (stderr, "Bild konnte nicht geladen werden: %s\n", SDL_GetError());
      exit (EXIT_FAILURE);
    }
  if ((tmp = IMG_Load ("Jack.png")) == NULL)
    {
      fprintf (stderr, "Bild konnte nicht geladen werden: %s\n", SDL_GetError());
      exit (EXIT_FAILURE);
    }
  SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, SDL_MapRGB (tmp->format, 255, 255, 255));
  backg = SDL_DisplayFormat (BG);
  pic = SDL_DisplayFormat (tmp);
  rect.x = 10;
  rect.y = 800;
  rect.w = 225;
  rect.h = 325;
  SDL_BlitSurface(backg, NULL, screen, &bgr);
  SDL_BlitSurface(pic, NULL, screen, &rect);
  SDL_UpdateRect (screen, rect.x, rect.y, rect.w, rect.h);
  SDL_UpdateRect (screen, bgr.x, bgr.y, bgr.w, bgr.h);
	SDL_Surface *sBtn1,*blab;
	int *my, *mx;
	Uint8 knoepfe;
	int done=0;
	SDL_Event clicky;
	SDL_Rect Btn1;
	Btn1=NewBtn(100, 100, 200, 100);
	sBtn1=IMG_Load("Button.png");
	blab=SDL_DisplayFormat (sBtn1);
	SDL_BlitSurface(blab,NULL,screen,&Btn1);
	SDL_UpdateRect (screen, Btn1.x, Btn1.y, Btn1.w, Btn1.h);
		SDL_BlitSurface(blab,NULL,screen,&Btn1); 
	while(done==0)
	{
		SDL_PollEvent (&clicky);
		knoepfe = SDL_GetMouseState(mx,my);
        if (knoepfe & SDL_BUTTON (SDL_BUTTON_LEFT))
        {
        	int testit=BtnCheck(mx,my,Btn1);
        	if (testit==1)
        	{
        	  done=1;
        	}
        }	  
       SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));;
       SDL_BlitSurface(blab,NULL,screen,&Btn1);
       SDL_Flip(screen);  
    }    		
        		
    SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, 1); 
    while (!quit)
    {
      SDL_PollEvent (&e);
      alle_tasten = SDL_GetKeyState (NULL);
      if (alle_tasten [SDLK_ESCAPE])
        quit = 1;
      if (alle_tasten [SDLK_LEFT])
        bgr.x-=10;
      if (alle_tasten [SDLK_RIGHT])
        bgr.x+=10;
      if (alle_tasten [SDLK_UP])
        bgr.y-=10;
      if (alle_tasten [SDLK_DOWN])
        bgr.y+=10;    
      if (alle_tasten [SDLK_SPACE])
        {
        
        }
       SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));;
       SDL_BlitSurface(backg, NULL, screen, &bgr);
       SDL_BlitSurface(pic, NULL, screen, &rect);
       SDL_Flip(screen);

  }
  SDL_FreeSurface(tmp);
  return 0;
}

Hier noch mal der gesamte code.

Antworten |