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;
}