0

SDL を使用して、長方形がプログラムの壁内で連続的に衝突するプログラムを作成しましたが、衝突チェックが正しく機能しません。

コードは次のとおりです。

int main(int argc, char *argv[]){
//variable Initialization]
width = height = 45;
srcX = srcY = 0;
destY = destX = 0;
vlc = 1;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
SDL_WM_SetCaption("Bouncing Balls","./ball.jpg");
backg = IMG_Load("./back.png");
ball = IMG_Load("./ball.jpg");
while (checkBounce){
    //Increase velocity
    destX += vlc;
    destY += vlc;
     //Collision Checking
        if (destX < 0){
            destX = 0;
            vlc = -vlc;
            destX += vlc;
        }
        if (destY < 0){
            destY = 0;
            vlc = -vlc;
            destY += vlc;
        }
        if (destY + height > 480){
            destY = 480 - height;
            vlc = -vlc;
            }
        if (destX + width > 640){
            destX = 640 - width;
            vlc = -vlc;
        }
    if (SDL_PollEvent(&event)){
        if (event.type == SDL_QUIT)
            checkBounce = false;
    }
//Applying Surfaces
applySurface(0, 0, backg, screen);
applyBall(srcX, srcY, destX, destY, width, height, ball, screen);
SDL_Flip(screen);
}
SDL_Quit();
return 0;
}

これが gif 画像です

4

1 に答える 1

2

期待される結果は、長方形が壁から正しく跳ね返ることだと思いますか?

単一の数値を使用するのではなく、速度を x 成分と y 成分に分ける必要があります。これは、速度が 2 次元であるためです。

衝突が検出されるたびに、プログラムによって x 成分と y 成分の両方が負になります。これにより、長方形がパスに沿って後方に跳ね返ります。

ここに編集があります:

int main(int argc, char *argv[]){
    //variable Initialization]
    width = height = 45;
    srcX = srcY = 0;
    destY = destX = 0;
    vlcX = 1;
    vlcY = 1;
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    SDL_WM_SetCaption("Bouncing Balls","./ball.jpg");
    backg = IMG_Load("./back.png");
    ball = IMG_Load("./ball.jpg");
    while (checkBounce){
        //Increase velocity
        destX += vlcX;
        destY += vlcY;
        //Collision Checking
        if (destX < 0){
            destX = 0;
            vlcX = -vlcX;
            destX += vlcX;
        }
        if (destY < 0){
            destY = 0;
            vlcY = -vlcY;
            destY += vlcY;
        }
        if (destY + height > 480){
            destY = 480 - height;
            vlcY = -vlcY;
            }
        if (destX + width > 640){
            destX = 640 - width;
            vlcX = -vlcX;
        }
        if (SDL_PollEvent(&event)){
            if (event.type == SDL_QUIT)
                checkBounce = false;
        }
        //Applying Surfaces
        applySurface(0, 0, backg, screen);
        applyBall(srcX, srcY, destX, destY, width, height, ball, screen);
        SDL_Flip(screen);
    }
    SDL_Quit();
    return 0;
}
于 2013-07-24T04:22:12.200 に答える