Forum: SDL collision!

Forum huvudsida -> Programmering -> SDL collision!

Sidor: 1

Till botten

lord_slampa 21:34 - 4:e Januari 2007 | Post #1
Medlem
Inlägg: 46


Skicka PM
ngån som vet hur man gör en collision i SDL?
vore tacksam med hjälp.

-------------------------
DirectX + Win32 Api For the win!



Independence 21:53 - 4:e Januari 2007 | Post #2
Administratör
Inlägg: 1800


Skicka PM
För enkelhets skull så kan man anta att objekten är fyrkantiga, det stämmer inte så ofta men det brukar ändå vara tillräckligt noggrant för de flesta spel.

Sedan tar man reda på x och y värde samt höjd och bredd på de två objekten som man vill se om de krockar.

Nästa steg är en lång if-sats, som jag troligtvis kommer ihåg fel, men jag ska göra ett försök Smiley

obj1.x1
obj1.x2
obj1.y1
obj1.y2

obj2.x1
obj2.x2
obj2.y1
obj2.y2

Det där är de två objektens kordinater.

Sedan kan man kolla om ett hörn i obj2 ligger inuti obj1 såhär typ:

  1.  
  2. if (obj2.x1 <= obj1.x2 && obj2.x1 >= obj1.x1
  3. && obj2.y1 <= obj1.y2 && obj2.y2 >= obj1.y1)
  4. {
  5. cout << "Obj2's övre vänstra hörn ligger inuti Obj1!";
  6. }


Sedan upprepar man det för alla hörn tror jag. Det borde iaf fungera, men man kanske brukar göra på något annat sätt Smiley

-------------------------

Vi är riddarna som säger fiskbulle!



Senast redigerad 23:10 - 4:e Januari 2007


lord_slampa 22:20 - 4:e Januari 2007 | Post #3
Medlem
Inlägg: 46


Skicka PM
okej. det fungerar inte för mig. det är hel totalt cp. jag lyckas få en collision! och det är total fel!

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"

const int screenW = 800;
const int screenH = 600;
const int screenBPP = 32;

SDL_Surface *box1 = NULL;
SDL_Surface *Player_IMG = NULL;
SDL_Surface *screen = NULL;

SDL_Event event;

    int xVel = 0;
    int yVel = 0;
    int x = 0;
    int y = 0;
    int w = 32;
    int h = 64;



SDL_Surface *IMG(const char* file_name)
{
    SDL_Surface *Image = NULL;
    Image = IMG_Load(file_name);
    SDL_Surface *OptiImage = NULL;
    if(Image != NULL){
        OptiImage = SDL_DisplayFormat(Image);
        SDL_FreeSurface (Image);
    }
    return OptiImage;
}
void Apply_Surface(int x, int y, SDL_Surface *Källa,SDL_Surface *Mål)
{
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;
    SDL_BlitSurface(Källa,NULL,Mål,&offset);
}

void Player_Input()
{

    if(event.type == SDL_KEYDOWN)
    {
        switch(event.key.keysym.sym)
        {
        case SDLK_UP:
            yVel -= 2;
            break;
        case SDLK_DOWN:
            yVel +=2;
            break;
        case SDLK_LEFT:
            xVel -=2;
            break;
        case SDLK_RIGHT:
            xVel +=2;
            break;
        }
    }else if (event.type == SDL_KEYUP)
    {
        switch(event.key.keysym.sym)
        {
        case SDLK_UP:
            yVel +=2;
            break;
        case SDLK_DOWN:
            yVel -=2;
            break;
        case SDLK_LEFT:
            xVel +=2;
            break;
        case SDLK_RIGHT:
            xVel -=2;
            break;
        }
    }
}
void Player_Show()
{
    
    x+=xVel;
    if((x<0)||( x + w > screenW))
    {
        x-=xVel;
    }
    y+=yVel;
    if((y<0)||( y + h > screenH))
    {
        y-=yVel;
    }




    Player_IMG = IMG("Player2.png");


    Apply_Surface(x,y,Player_IMG,screen);
    SDL_UpdateRect(screen,0,0,0,0);
}
void Player()
{

    Player_Input();
    Player_Show();
    
}
struct Block()
{
    box1 = IMG("box.png");
    Apply_Surface(boxx,boxy,box1,screen);
    int boxx = 100;
    int boxy = 100;
    int boxxvel = 100;
    int boxyvel = 100;
    int boxw = 64;
    int boxh = 64;
}
void Collision()
{
    if(x <= boxx && w >= boxw)
    {
        x-=xVel;
    }
    if(y <= boxy && h >= boxh)
    {
        y-=yVel;
    }
}


int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(screenW,screenH,screenBPP,SDL_SWSURFACE);

while(1)
    {
        while(SDL_PollEvent(&event))
        {
            Collision();
            Player();
            {
                if(event.type == SDL_QUIT)
                {
                    SDL_Quit();
                    return 0;
                }
            }
        }
    }



    SDL_Flip(screen);
    SDL_Delay(2000);
    SDL_Quit();
    return 0;
}


-------------------------
DirectX + Win32 Api For the win!



Independence 22:23 - 4:e Januari 2007 | Post #4
Administratör
Inlägg: 1800


Skicka PM
Hmm, fast nu har du ju inte gjort i närheten av det jag sa Smiley

Du ska inte jämföra med w, utan x+w. Sedan gör du bara två jämförelser istället för fyra i if-satsen.

-------------------------

Vi är riddarna som säger fiskbulle!





lord_slampa 22:29 - 4:e Januari 2007 | Post #5
Medlem
Inlägg: 46


Skicka PM
jag hänger ärligt talat inte med alls.
ska jag ta "playerns" x och Lådans w?
sedan "playerns" y och lådans h?


-------------------------
DirectX + Win32 Api For the win!



Sidor: 1

Forum huvudsida -> Programmering -> SDL collision!
Atom feed

Du får inte posta i den här tråden | Till toppen