little help
I am still working on my breakout game. I can get the ball to hit the brick but I cant get the brick to turn off permanently. The brick turn off and back on again, in other words it flickers on and off. I have tried a lot of different permutations of my code.
We don't know your code and need a little more help.
How do you store bricks? How do you turn bricks off/on? For both answers, show a bit of code.
How do you store bricks? How do you turn bricks off/on? For both answers, show a bit of code.
if(x>=3.0f && x<=5.0f && y>=3.5f && y<=4.0f)
{
bricks[3][5]=0;
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f);
glRectf(3.0f,4.0f,5.0f,3.5f);
brick_collision();
glutPostRedisplay();
glutSwapBuffers();
}
//draw ball
glColor3f(1.0f,1.0f,1.0f);
glRectf(x,y,x+rsize,y-rsize);
glutSwapBuffers();
I think the main problem comes from calling glutSwapBuffers two times.
Do a full redraw every time, with one glClear at the top and one glutSwapBuffers at the end. Only draw a brick, if it is not set to 0. Now when the ball is inside the brick rect (as your check seems to do), the brick is cleared and on the next redraw it is simply not drawn.
In other words, make it so:
Do a full redraw every time, with one glClear at the top and one glutSwapBuffers at the end. Only draw a brick, if it is not set to 0. Now when the ball is inside the brick rect (as your check seems to do), the brick is cleared and on the next redraw it is simply not drawn.
In other words, make it so:
// brick/ball collision
if ( ( x >= 3.0f )
&& ( x <= 5.0f )
&& ( y >= 3.5f )
&& ( y <= 4.0f ) )
{
bricks[3][5] = 0;
}
// brick/ball draw code
if ( bricks[3][5] ) != 0 )
{
// draw the brick
}
well I tried the above code and for some reason it works in reverse, I am so close to solving this problem.
if((x>=3.0f) && (x<=5.0f) && (y>=3.5f) && (y<=4.0f))
{
bricks[3][5]=0;
}
brick_collision();
void brick_collision()
{
if(bricks[3][5]!=0)
{
glColor3f(0.0f,0.0f,0.0f);
glRectf(3.0f,4.0f,5.0f,3.5f);
}
}
here is some of my code
{
bricks[3][5]=0;
}
brick_collision();
void brick_collision()
{
if(bricks[3][5]!=0)
{
glColor3f(0.0f,0.0f,0.0f);
glRectf(3.0f,4.0f,5.0f,3.5f);
}
}
here is some of my code
The way in which you clear and swap was previously called into question.
Why don’t you show enough code to include both your update logic and your clear/swap calls?
L. Spiro
Why don’t you show enough code to include both your update logic and your clear/swap calls?
L. Spiro
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureId_four);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
for(float i=-5.0f;i<=3.0f;i+=2.0f)
{
//draw bricks
glBegin(GL_QUADS);
glTexCoord2f(-1.0f, 0.0f);
glVertex3f(i, 5.0f, 0.0f);
glTexCoord2f(-1.0f, 1.0f);
glVertex3f(i+2.0f, 5.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(i+2.0f, 4.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(i, 4.5f, 0.0f);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureId_three);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
for(float i=-5.0f;i<=3.0f;i+=2.0f)
{
//draw bricks
glBegin(GL_QUADS);
glTexCoord2f(-1.0f, 0.0f);
glVertex3f(i, 4.5f, 0.0f);
glTexCoord2f(-1.0f, 1.0f);
glVertex3f(i+2.0f, 4.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(i+2.0f, 4.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(i, 4.0f, 0.0f);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
for(float i=-5.0f;i<=3.0f;i+=2.0f)
{
//draw bricks
glBegin(GL_QUADS);
glTexCoord2f(-1.0f, 0.0f);
glVertex3f(i, 4.0f, 0.0f);
glTexCoord2f(-1.0f, 1.0f);
glVertex3f(i+2.0f, 4.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(i+2.0f, 3.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(i, 3.5f, 0.0f);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureId_two);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//draw paddle
glBegin(GL_QUADS);
glTexCoord2f(-1.0f, 0.0f);
glVertex3f(-1.0f+j, -4.5f, 0.0f);
glTexCoord2f(-1.0f, 1.0f);
glVertex3f(1.0f+j, -4.5f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(1.0f+j, -5.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f+j, -5.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
if((x>=3.0f) && (x<=5.0f) && (y>=3.5f) && (y<=4.0f))
{
bricks[3][5]=0;
}
brick_collision();
//draw ball
glColor3f(1.0f,1.0f,1.0f);
glRectf(x,y,x+rsize,y-rsize);
glutSwapBuffers();
}
void brick_collision()
{
if(bricks[3][5]!=0)
{
glColor3f(0.0f,0.0f,0.0f);
glRectf(3.0f,4.0f,5.0f,3.5f);
}
}
here is my drawing code and some collision detection
The problem is right there.
You draw every brick regardless of whether at has been destroyed or not.
If you don’t want a brick to be drawn, don’t draw it. Don’t draw it and then try to cover it up later, just don’t draw it in the first place.
You should have encapsulated the blocks with classes. Each class would have a position/rectangle coordinates for rendering as well as a boolean flag to tell if the block is drawn for not.
Then the loop would like this:
And brick_collision() would simply not exist.
DO: No drawing of objects that are not visible.
DON’T: Draw invisible objects and then erase them.
L. Spiro
for(float i=-5.0f;i<=3.0f;i+=2.0f)
You draw every brick regardless of whether at has been destroyed or not.
If you don’t want a brick to be drawn, don’t draw it. Don’t draw it and then try to cover it up later, just don’t draw it in the first place.
You should have encapsulated the blocks with classes. Each class would have a position/rectangle coordinates for rendering as well as a boolean flag to tell if the block is drawn for not.
Then the loop would like this:
for ( int I = 0; I < ENUM_TOTAL_BLOCKS; ++I ) {
if ( g_bBlock.Visible() ) {
glBegin(GL_QUADS);
glTexCoord2f(-1.0f, 0.0f);
glVertex3f(g_bBlock.x, 4.0f, 0.0f);
glTexCoord2f(-1.0f, 1.0f);
glVertex3f(g_bBlock.x+2.0f, 4.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(g_bBlock.x+2.0f, 3.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(g_bBlock.x, 3.5f, 0.0f);
glEnd();
}
}
And brick_collision() would simply not exist.
DO: No drawing of objects that are not visible.
DON’T: Draw invisible objects and then erase them.
L. Spiro
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement