-1

如果我调用移动球/查找碰撞的函数,它就不起作用。但是,如果我输入用“ball1”替换“b”的函数的内容,它确实有效。为了修复它,我尝试了很多很多很多东西,但无济于事。很抱歉代码这么长,但我担心如果我只包含一个片段,它将无法修复。

代码:

#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

0

ball_move并通过价值ball_wallCollide来接受他们的Ball论点。这意味着他们获得了调用者实例的副本。如果要更新调用者的实例,则需要将指针传递给该实例。

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

并更改调用以传递Ball更新的地址

ball_move(&ball1);
于 2013-05-26T16:04:53.620 回答