Witam,

Piszę grę w SDLu, jednak nie działają mi odbicia ( wydaje mi się że jest zły zamysł ) generalnie mogę sobie wejść w inny prostokąt itd, przepraszam za kod - wszystko w jednym pliku, ale już nie mam czasu tego rozdzielać. dwie funkcje odnośnie zderzeń. które działają, lecz chodzi jeszcze o same odbicia.

I poruszanie się obiektów - przeszkód ( pole ) ona muszą chodzić losowo w górę i w dół. Nie mam pomysł jak to zrobić ( czy muszę używać wielowątkowości ? )

Z góryu dziękuję za pomoc, poniżej załączam kod.

#include "SDL.h"
#include "lib/SDL_ttf.h"
#include <stdlib.h>
#include <time.h>
#include <iostream>

using namespace std;

#define skok 3 // przejscie o tyle px przy nacisnieciu klawisza

#define SCREEN_WIDTH  1680
#define SCREEN_HEIGHT 1020

#define PRZESZKODA_WIDTH 30
#define PRZESZKODA_HEIGHT 30

#define BACKGROUND_SIZE 10

#define LINE_SIZE 10
#define PoczatekY 220
#define PoczatekX 60
#define KoniecX 60
#define KoniecY 20

#define Jon_WIDTH 18 
#define Jon_HEIGHT 18


bool check_collision( SDL_Rect A, SDL_Rect B )
{
    //The sides of the rectangles
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;

    //Calculate the sides of rect A
    leftA = A.x;
    rightA = A.x + A.w;
    topA = A.y;
    bottomA = A.y + A.h;
        
    //Calculate the sides of rect B
    leftB = B.x;
    rightB = B.x + B.w;
    topB = B.y;
    bottomB = B.y + B.h;
	 //If any of the sides from A are outside of B
    if( bottomA <= topB )
    {
        return false;
    }
    
    if( topA >= bottomB )
    {
        return false;
    }
    
    if( rightA <= leftB )
    {
        return false;
    }
    
    if( leftA >= rightB )
    {
        return false;
    }
    
    //If none of the sides from A are outside B
    return true;
}



bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
{
     if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; 
     else if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; 
     else if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; 
     else if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; 
     else return false;
}bool CzyKoliduja(SDL_Rect a, SDL_Rect b)
{
	return kolizja(a.x,a.y,a.w,a.h,b.x,b.y,b.w,b.h);
}
bool KolJonPole(SDL_Rect a, SDL_Rect b[][13] )
{
	for (int i=0; i<26 ; i++)
	{
		for (int j=0; j<13; j++)
		{
			if(CzyKoliduja (a,b[i][j]))
				return true;
		}
	}
}

int main( int argc, char* argv[] )
{
	
	Uint8 *keystate;
	
	
	srand(time(NULL)); // losowanie
	SDL_Surface *screen, *koniec, *temp, *bg, *zarowka, *Line, *przeszkoda, *ikona, *jon, *zarowkaoff, *katoda, *anoda, *elektron, *drut, *pole[26][13];
	// ustawianie miejsc
	SDL_Rect rcBackground, rcZarowka, rcLine, rcPrzeszkoda, rcJon, rcKatoda, rcAnoda, rcElektron, rcDrut, rcPole[26][13];



	
	/* initialize SDL */
	SDL_Init(SDL_INIT_VIDEO);

	/* set the title bar */
	SDL_WM_SetCaption("LabFiz II Maria Sawicka & Krystian Rosłon", "LabFiz II Maria Sawicka & Krystian Rosłon");


	
	/* create window */
	screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
	//koniec = SDL_SetVideoMode(50, 50, 0, 0);

	/* load bitmap to temp surface */
	temp = SDL_LoadBMP("img/tlo4.bmp");

	/* convert bitmap to display format */
	bg = SDL_DisplayFormat(temp);

	/* free the temp surface */
	SDL_FreeSurface(temp);

	SDL_Event event;

	// Pole - przeszkody
	for (int i = 0 ; i< 26 ; i++)
	{
		for (int j = 0; j< 13; j++)
		{
			temp = SDL_LoadBMP("img/przeszkoda.bmp");
			pole[i][j]=SDL_DisplayFormat(temp);
			SDL_FreeSurface(temp);
			rcPole[i][j].y = PoczatekY+ j*PRZESZKODA_WIDTH + PRZESZKODA_WIDTH*j;
			rcPole[i][j].x = PoczatekX+ i*PRZESZKODA_HEIGHT + PRZESZKODA_HEIGHT*i;
			rcPole[i][j].w = PRZESZKODA_WIDTH;
			rcPole[i][j].h = PRZESZKODA_HEIGHT;
		}
	}


	//drut
	temp = SDL_LoadBMP("img/drut.bmp");
	drut = SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcDrut.x=205;
	rcDrut.y=125;

	//elektron
	temp = SDL_LoadBMP("img/elektron.bmp");
	elektron = SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcElektron.x=215;
	rcElektron.y=125;
	
	//katoda
	temp = SDL_LoadBMP("img/katoda.bmp");
	katoda = SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcKatoda.x = 190;
	rcKatoda.y = 125;

	//anoda
	temp = SDL_LoadBMP("img/anoda.bmp");
	anoda = SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcAnoda.x=1680-193;
	rcAnoda.y = 125;

	
	//zarowka
	temp   = SDL_LoadBMP("img/zarowka.bmp");
	zarowka = SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	// ustawianie miejsca zarowki
	rcZarowka.x=800;
	rcZarowka.y=50;

	//zarowka off
	temp = SDL_LoadBMP("img/zarowkaoff1.bmp");
	zarowkaoff=SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);

	
	//linia
	
	temp = SDL_LoadBMP("img/linia.bmp");
	Line=SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcLine.y=200;
	



	//jon
	temp=SDL_LoadBMP("img/jon.bmp");
	jon=SDL_DisplayFormat(temp);
	SDL_FreeSurface(temp);
	rcJon.y=PoczatekY+20;
	rcJon.x=10;
	rcJon.w = Jon_WIDTH;
	rcJon.h = Jon_HEIGHT;
	
	int gameover = 0;


	/* message pump */
	while (!gameover)
	{
		/* look for an event */
		if (SDL_PollEvent(&event)) {
			/* an event was found */
			switch (event.type) {
				/* close button clicked */
				case SDL_QUIT:
					gameover = 1;
					break;

				/* handle the keyboard */
				case SDL_KEYDOWN:
					switch (event.key.keysym.sym) {
						case SDLK_ESCAPE:
						case SDLK_q:
							gameover = 1;
							break;
					}
					break;
			}
		}
//obsluga klawiatury
		
		keystate = SDL_GetKeyState(NULL);
		if (keystate[SDLK_LEFT] || keystate[SDLK_a])
		{
			if (!KolJonPole(rcJon,rcPole))
			{
				rcJon.x-=skok;
				rcElektron.x+=skok;
			}
			else
			{
			rcJon.x+=skok;
			rcElektron.x+=skok;
			}
		}
		if ((keystate[SDLK_RIGHT] || keystate[SDLK_d]) )
		{
			if (!KolJonPole(rcJon,rcPole))
			{
				rcJon.x+=skok;
				rcElektron.x+=2*skok;
			}
			else
			{
				rcJon.x-=skok;
				rcElektron.x+=skok;	
			}
					}
		if((keystate[SDLK_UP] || keystate[SDLK_w]) )
		{
			if(!KolJonPole(rcJon,rcPole))
			{
				rcJon.y-=skok;
				rcElektron.x+=skok;
			}
			else 
			{
				rcJon.y+=skok;
				rcElektron.x+=skok;
			}
		}
		if((keystate[SDLK_DOWN] || keystate[SDLK_s]) )
		{
			if(!KolJonPole(rcJon,rcPole))
			{
				rcJon.y+=skok;
				rcElektron.x+=skok;
			}
			else 
			{
				rcJon.y-=skok;
				rcElektron.x+=skok;
			}
		}

// wyznaczone miejsce

		if(rcJon.y<PoczatekY)
		{
			rcJon.y=PoczatekY;
		}
		if(rcJon.y > SCREEN_HEIGHT - KoniecY - Jon_HEIGHT)
		{
			rcJon.y=SCREEN_HEIGHT - KoniecY - Jon_HEIGHT;
		}
		if(rcJon.x < 10)
		{
			rcJon.x = 10;
		}
		if (rcJon.x > SCREEN_WIDTH -10  - Jon_WIDTH)
		{
			rcJon.x = SCREEN_WIDTH - 10 - Jon_WIDTH;
		}
		if (rcElektron.x > 1680-200 -15 )
		{
			rcElektron.x = 215;
		}
		
		// draw the background
		for (int x = 0; x < SCREEN_WIDTH / BACKGROUND_SIZE; x++) 
		{
			for (int y = 0; y < SCREEN_HEIGHT / BACKGROUND_SIZE; y++) 
			{
				rcBackground.x = x * BACKGROUND_SIZE;
				rcBackground.y = y * BACKGROUND_SIZE;
				SDL_BlitSurface(bg, NULL, screen, &rcBackground);
			}
		}
		

		for (int x=0; x<SCREEN_WIDTH/LINE_SIZE;x=x++)
		{
			rcLine.x=x*LINE_SIZE;
			SDL_BlitSurface(Line,NULL,screen, &rcLine);
		} 
		for (int i = 0 ; i< 26 ; i++)
			for (int j = 0; j< 13; j++)
				SDL_BlitSurface(pole[i][j],NULL,screen,&rcPole[i][j]);

		SDL_BlitSurface(jon,NULL,screen,&rcJon);
		SDL_BlitSurface(drut,NULL,screen,&rcDrut);
		SDL_BlitSurface(katoda,NULL,screen,&rcKatoda);
		SDL_BlitSurface(anoda,NULL,screen,&rcAnoda);
		SDL_BlitSurface(elektron,NULL,screen,&rcElektron);
		if( keystate[SDLK_UP] || keystate[SDLK_w] || keystate[SDLK_DOWN] || keystate[SDLK_s] || keystate[SDLK_RIGHT] || keystate[SDLK_d] || keystate[SDLK_LEFT] || keystate[SDLK_a] )
			SDL_BlitSurface(zarowka,NULL,screen,&rcZarowka);
		else
			SDL_BlitSurface(zarowkaoff,NULL,screen,&rcZarowka);	
		//if(rcJon.x==SCREEN_WIDTH - 30 - Jon_WIDTH)
			//SDL_UpdateRect(koniec,0,0,0,0);

		

		/* update the screen */
		SDL_UpdateRect(screen, 0, 0, 0, 0);
		
	}

	/* free the background surface */
	SDL_FreeSurface(bg);

	/* cleanup SDL */
	SDL_Quit();

	return 0;
}