-1

ボールを動かしたり衝突を見つけたりする関数を呼び出しても、うまくいきません。しかし、「b」を「ball1」に置き換えて関数の内容をタイプダウンすると、機能します。私はそれを修正するために多くの、多くの、多くのことを試みましたが、役に立ちませんでした。コードが長くて申し訳ありませんが、スニペットだけを含めると修正できなくなります。

コード:

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <math.h>
#include <stdbool.h>

#define SCREEN_WIDTH 500
#define SCREEN_HEIGHT 500
#define SCREEN_BPP 32
#define GRAVITY 1

SDL_Surface *image = NULL;
SDL_Surface *screen = NULL;
SDL_Event event;

SDL_Surface *loadImage(char *filename) {
    SDL_Surface *optimizedImage = NULL;
    SDL_Surface *loadedImage = IMG_Load(filename);
    if (loadedImage != NULL) {
        optimizedImage = SDL_DisplayFormat(loadedImage); /*optimizes image*/
        SDL_FreeSurface(loadedImage);
    }

    return optimizedImage;
}

void applySurface(int x, int y, SDL_Surface *source, SDL_Surface *destination) {
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;

    SDL_BlitSurface(source, NULL, destination, &offset);
}

bool initSDL(void) {
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
        return NULL;
    }
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

    if (screen == NULL) {
        return NULL;
    }

    SDL_WM_SetCaption("Bounce", NULL);
    return true;
}

/*Cleans all needed things*/
void cleanUp(SDL_Surface *image) {
    SDL_FreeSurface(image);
    SDL_Quit();
}

/*The Ball structure for OOP*/
struct Ball {
    int x;
    int y;
    int vy;
    int vx;
    SDL_Surface *image;
};

/*initialize a Ball structure*/
struct Ball ball_initBall(int x, int y, int vy, int vx, char *filename) {
    struct Ball b;
    b.x = x;
    b.y = y;
    b.vy = vy;
    b.vx = vx;
    b.image = loadImage(filename);

    return b;
}

void ball_move(struct Ball b) {
    b.x += b.vx;
    b.y += b.vy;
    b.vy += GRAVITY; 
}

void ball_wallCollide(struct Ball b) {
    if (b.x <= 1 || b.x >= 500 - 48) {
        b.vx *= -1;
    }

    if (b.y <= 1 || b.y >= 500 - 49) {
        b.vy *= -0.95;
    }
}

int main(int argc, char *argv[]) {
    bool running = true;
    initSDL();

    struct Ball ball1 = ball_initBall(SCREEN_HEIGHT/2, SCREEN_WIDTH/2, 1, 3, "resources/ball.jpg");

    while (running) {
        applySurface(ball1.x, ball1.y, ball1.image, screen);


        ball_move(ball1);
        ball_wallCollide(ball1);

        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
            }
        }
        SDL_Flip(screen);
        SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0, 0, 0));
        SDL_Delay(50);
    }
    cleanUp(ball1.image);
    return 0;
}
4

1 に答える 1