0

Below is the code I'm using to initiate the label showing the score. Unfortunately, the label doesn't appear on the screen, and I'm clueless as to why that is the case. I'd very much appreciate any advice on how to tackle this problem :)

int main(void)
{
    // seed pseudorandom number generator
srand48(time(NULL));

    // instantiate window
    GWindow window = newGWindow(WIDTH, HEIGHT);

    // instantiate bricks
    initBricks(window);

    // instantiate ball, centered in middle of window
    GOval ball = initBall(window);

    // instantiate paddle, centered at bottom of window
    GRect paddle = initPaddle(window);

    // instantiate scoreboard, centered in middle of window, just above ball
    GLabel label = initScoreboard(window);

    // number of bricks initially
    int bricks = COLS * ROWS;

    // number of lives initially
    int lives = LIVES;

    // number of points initially
    int points = 0;

    // ball velocity
    double x_velocity = drand48() - 0.2;
    double y_velocity = 0.2;

     // keep playing until game over
    while (lives > 0 && bricks > 0)
    {
        // mouse movement
        GEvent event = getNextEvent(MOUSE_EVENT);
        // if we heard an event
        if(event != NULL)
        {
            //if the event was movement
            if(getEventType(event) == MOUSE_MOVED)
            {
                //make paddle follow mouse
                double x = getX(event) - getWidth(paddle);
                double y = getY(paddle);
                setLocation(paddle, x, y);
            }
        }
        // move the ball
        move(ball, x_velocity, y_velocity);

        // make sure the ball bounces off walls
        // left wall
        if(getX(ball) < 0)
        {
            x_velocity = -x_velocity;
        }
        //right wall
        else if(getX(ball) + BALL_WIDTH > WIDTH)
        {
            x_velocity = -x_velocity;
        }
        // top edge
        else if(getY(ball) < 0)
        {
           y_velocity = -y_velocity;
        }
        // bottom edge
        else if(getY(ball) > HEIGHT)
        {
            lives--;
            setLocation(ball, getWidth(window)/2 - BALL_WIDTH, getHeight(window)/2);
            setLocation(paddle, PADDLE_X, PADDLE_Y);
            waitForClick();

        }

        // paddle and brick collisions
        GObject object = detectCollision(window, ball);

        if(object != NULL)
        {
            if(object == paddle)
            {
                y_velocity = -y_velocity;
            }
            else if(strcmp(getType(object), "GRect") == 0)
            {
                removeGWindow(window, object);
                y_velocity = -y_velocity;
                points++;
                bricks--;
            }
        }
    }
        if(bricks == 0 && lives > 0)
        {
            //create new GLabel --> you win!
            pause(3);
            GLabel game_over = newGLabel("YOU WIN!");
            setFont(game_over, "Verdana-60");
            setColor(game_over, "RED");
            setLocation(game_over, 45, 300);
            add(window, game_over);
        }
        if(lives == 0)
        {
            GLabel game_over = newGLabel("YOU LOSE!");
            setFont(game_over, "Verdana-60");
            setColor(game_over, "RED");
            setLocation(game_over, 40, 300);
            add(window, game_over);
        }

    // wait for click before exiting
    waitForClick();

    // game over
    closeGWindow(window);
    return 0;
    }


    }     
}


/**
 * Initializes window with a grid of bricks.
 */
void initBricks(GWindow window)
{
    // TODO
    //for each row
    int starting_y = SPACE;
    for(int i = 0; i < ROWS; i++)
    {
        int starting_x = SPACE;
        //each column
        for(int j = 0; j < COLS; j++)
        {
            // draw  a brick
            GRect brick = newGRect(starting_x, starting_y, BRICK_WIDTH, BRICK_HEIGHT);
            add(window, brick);
            setFilled(brick, true);
            setColor(brick, "BLUE");

            starting_x = starting_x + BRICK_WIDTH + SPACE;
        }
        starting_y = starting_y + BRICK_HEIGHT + SPACE;
    }

    }

/**
 * Instantiates ball in center of window.  Returns ball.
 */
GOval initBall(GWindow window)
{
    GOval ball = newGOval(BALL_X, BALL_Y, BALL_WIDTH, BALL_HEIGHT);
    add(window, ball);
    setFilled(ball, true);
    setColor(ball, "BLACK");
    return ball;
}

/**
 * Instantiates paddle in bottom-middle of window.
 */
GRect initPaddle(GWindow window)
{
    // TODO
    GRect paddle = newGRect(PADDLE_X, PADDLE_Y, PADDLE_WIDTH, PADDLE_HEIGHT);
    add(window, paddle);
    setFilled(paddle, true);
    setColor(paddle, "RED");

    return paddle;

}

/**
 * Instantiates, configures, and returns label for scoreboard.
 */
GLabel initScoreboard(GWindow window)
{
    int label_x = (WIDTH / 2);
    int label_y = (HEIGHT / 2);
    GLabel label = newGLabel("0");
    setFont(label, "Verdana-50");
    setColor(label, "C0C0C0");
    add(window, label);
    setLocation(label, label_x, label_y );
    return label;
}

/**
 * Updates scoreboard's label, keeping it centered in window.
 */
void updateScoreboard(GWindow window, GLabel label, int points)
{
    // update label
    char s[12];
    sprintf(s, "%i", points);
    setLabel(label, s);

    // center label in window
    double x = (getWidth(window) - getWidth(label)) / 2;
    double y = (getHeight(window) - getHeight(label)) / 2;
    setLocation(label, x, y);
}

/**
 * Detects whether ball has collided with some object in window
 * by checking the four corners of its bounding box (which are
 * outside the ball's GOval, and so the ball can't collide with
 * itself).  Returns object if so, else NULL.
 */
GObject detectCollision(GWindow window, GOval ball)
{
    // ball's location
    double x = getX(ball);
    double y = getY(ball);

    // for checking for collisions
    GObject object;

    // check for collision at ball's top-left corner
    object = getGObjectAt(window, x, y);
    if (object != NULL)
    {
        return object;
    }

    // check for collision at ball's top-right corner
    object = getGObjectAt(window, x + 2 * RADIUS, y);
    if (object != NULL)
    {
        return object;
    }

    // check for collision at ball's bottom-left corner
    object = getGObjectAt(window, x, y + 2 * RADIUS);
    if (object != NULL)
    {
        return object;
    }

    // check for collision at ball's bottom-right corner
    object = getGObjectAt(window, x + 2 * RADIUS, y + 2 * RADIUS);
    if (object != NULL)
    {
        return object;
    }

    // no collision
    return NULL;
}
2
  • hey, how did you solve this? I have similar problem and cant get my label up. I did test using "TEST" to put on the label instead of " " and still it did not go up, any clue?
    – user9878
    Commented Oct 11, 2015 at 17:25
  • I too get same problem and the label is clearly defined what could be the cause for it not showing
    – user44173
    Commented Dec 27, 2015 at 18:40

2 Answers 2

1

You haven't set the location where the label is supposed to appear in initScoreboard. Do it like that:

setLocation(label, x, y);
16
  • Thanks, did this, but it's still not working. However, if you change GLabel label = newGLabel(" "); to GLabel label = newGLabel(" WHATEVER") the thing works fine :/ Commented Aug 12, 2015 at 13:22
  • If you change newGLabel(" ") to newGLabel("0") does it show?
    – ChrisG
    Commented Aug 12, 2015 at 13:24
  • It's because the <space> is an invisible character. So the label is there but it doesn't show.
    – ChrisG
    Commented Aug 12, 2015 at 13:31
  • Yup, but the point is that it is meant to display the label with the score from updateScoreboard. I assumed that this line: setLabel(label, s) took care of adding the score into the initiated label, especially since it's pre-written by the course-staff, but apparently not, and I don't know how to fix it. Commented Aug 12, 2015 at 13:34
  • Since you start with 0 points you should initialize it displaying 0. The updateScoreboard is to increment the points shown when you gain them.
    – ChrisG
    Commented Aug 12, 2015 at 13:36
0

Maybe you could call updateScoreboardbefore entering the playing loop, just to display 0 points, and later you need to call updateScoreboard every time you increase points.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .