Advertisement

need help with Tetris type block dropping

Started by September 01, 2002 03:50 PM
4 comments, last by tylerbingham 22 years, 5 months ago
I need help understanding how I can make keys(VK_LEFT...)change focus on what block is moving. I have a function to draw block and I am using glTranslatef(x,y,z)to control movemnent, then I use the keys to move block if(keys->[VK_DOWN]==TRUE) { y-=0.05f; } I can get the block to move and I can draw another block if the first block moves far enough down...but once the other block is drawn they both move and I only want to move the new block.
You can use block''s velocity to determine whether to move it:
if velocity is non-zero - respond on VK_UP...
if velocity is zero - don''t respond on VK_UP...
now, just when the block reachs an obstacle - you only have to make it''s velocity zero!

Good luck!
Advertisement
So you have 1+ blocks that you can move at one time, but when there are 2 or more they all move the same??? I''m assuming this is what happens.

Have an array/list/whatever of all the possible moving blocks and the current block and then move only the current block:

float3 blocks[max_amount];
int current_block;

if (down)
blocks[current_block].y -= 0.05f;
else if (left/right)
change current_block;

That should do the trick...

Luigi Pino
The 23rd Dimension
thanx you all! I''ll give them both a try.
Maybe it would be better if I show you all what I have got so far(using the newest NeHe.cpp and NeHe.h files) this is the main.cpp:

#include <windows.h>
#include <stdlib.h>
#include <gl/gl.h>

#include "NeHeGL.h"

#pragma comment( lib, "opengl32.lib" ) // Search For OpenGL32.lib While Linking
#pragma comment( lib, "glu32.lib" ) // Search For glu32.lib While Linking

#ifndef CDS_FULLSCREEN // CDS_FULLSCREEN Is Not Defined By Some
#define CDS_FULLSCREEN 4 // Compilers. By Defining It This Way,
#endif // We Can Avoid Errors

/*********************************************************************

-----------Globals-----------

*********************************************************************/
#define SCREENTOP 4
#define SCREENBOTTOM -2

GL_Window* g_window;
Keys* g_keys;
Application* app;

float x=0.0f;
float y=0.0f;
float z=0.0f;

bool active=true;

void Block(float px, float py,float pz)
{
glColor3f(0.0f,1.0f,0.0f);
glPushMatrix();
glTranslatef(px,py,pz-8);
glTranslatef(x,y,z);
glBegin(GL_QUADS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glEnd();
glPopMatrix();
}

float GetPosition(void)
{
return y;
}

int CanDrawBlock(void)
{
if(y {
return true;
}
return false;
}
/*********************************************************************

------------Draw---------------

*********************************************************************/
void Draw(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity();

Block(0,0,0);
if(g_keys->keyDown[VK_LEFT]==TRUE)
{
x-=0.05f;
}

if(g_keys->keyDown[VK_RIGHT]==TRUE)
{
x+=0.05f;
}

if(g_keys->keyDown[VK_DOWN]==TRUE)
{
y-=0.05f;
}

if(g_keys->keyDown[VK_UP]==TRUE)
{
y+=0.05f;
}

if(CanDrawBlock())
{
Block(2,SCREENTOP,0);
}

if(y {
//active=false;
}

glFlush ();
}


/*********************************************************************

-----------Update---------------

*********************************************************************/
void Update(DWORD milliseconds)
{
if (g_keys->keyDown [VK_ESCAPE] == TRUE) // Is ESC Being Pressed?
{
TerminateApplication (g_window); // Terminate The Program
}

if (g_keys->keyDown [VK_F1] == TRUE) // Is F1 Being Pressed?
{
ToggleFullscreen (g_window); // Toggle Fullscreen Mode
}

}


/*********************************************************************

---------Initialize----------

*********************************************************************/
BOOL Initialize(GL_Window* window, Keys* keys)
{
g_window = window;
g_keys = keys;

glClearColor (0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth (1.0f); // Depth Buffer Setup
glShadeModel(GL_SMOOTH); // use smooth shading
glEnable(GL_DEPTH_TEST); // hidden surface removal
//glEnable(GL_LIGHT0); // enable light0
//glEnable(GL_LIGHTING); // enable lighting
//glEnable(GL_TEXTURE_2D);

return true;
}


/*********************************************************************

---------Deinitailize---------------

*********************************************************************/
void Deinitialize(void)
{

}
sorry.......the int CanDrawBlock(void) should be:
int CanDrawBlock(void)
{
if(y < SCREENBOTTOM)
{
return true;
}
return false;
}


[edited by - tylerbingham on September 3, 2002 4:50:02 PM]

This topic is closed to new replies.

Advertisement