屏幕滚动游戏

时间:2011-04-01 20:34:15

标签: c++ opengl

我试图让我的游戏沿着y轴和x轴滚动为玩家。

目前窗口的坐标系已经完成。 :(

我在openGl中使用以下行来滚动:

float tempX=px1;
float tempY=py1;
double left = tempX-screenWidth/2;
double right = screenWidth/2+tempX;
double bottom = tempY - screenWidth/2 + 300;
double top = screenHeight/2+tempY+ 300;
//gluOrtho2D(0,screenWidth,0,screenHeight);   (before scroll screen)
gluOrtho2D( left,  right, bottom ,  top);

px1和py1与我的玩家有关,并在玩家移动时更新。 目前,如果您在游戏运行时获取窗口并调整其大小,您可以看到图像调整大小并且我的代码错误,因为正方形显示为矩形。

2 个答案:

答案 0 :(得分:4)

我想问题是视口分辨率,我的意思是当你调整窗口大小时你的视口保持与以前一样,所以你仍然在绘制例如640x480屏幕同时显示你以800x600分辨率绘制的内容,所以我认为您必须在任何窗口调整大小事件后调用glViewPort(0,0,screenWidth,screenHeight)

答案 1 :(得分:3)

这样的东西?

#include <GL/glut.h>

#include <map>
using namespace std;

size_t win_w = 0;
size_t win_h = 0;

void Box( int xoff, int yoff, int size = 10 )
{
    glBegin(GL_QUADS);
        glVertex2f( xoff + -1*size, yoff + -1*size);
        glVertex2f( xoff +  1*size, yoff + -1*size);
        glVertex2f( xoff +  1*size, yoff +  1*size);
        glVertex2f( xoff + -1*size, yoff +  1*size);
    glEnd();    
}

map< int, bool > key_map;

void keyboard( int key, int x, int y )
{
    key_map[key] = true;
}

void keyboard_up( int key, int x, int y )
{
    key_map[key] = false;
}


void display(void)
{
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    static int center_x = 0;
    static int center_y = 0;
    if( key_map[GLUT_KEY_LEFT]  ) center_x--;
    if( key_map[GLUT_KEY_RIGHT] ) center_x++;
    if( key_map[GLUT_KEY_DOWN]  ) center_y--;
    if( key_map[GLUT_KEY_UP]    ) center_y++;

    double left   = center_x - win_w/2.0;
    double right  = center_x + win_w/2.0;
    double bottom = center_y - win_h/2.0;
    double top    = center_y + win_h/2.0;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(left, right, bottom, top, -10, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3ub(255,0,0);
    Box( 10, 10 );

    glColor3ub(0,255,0);
    Box( 100, 100 );

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    win_w = w;
    win_h = h;
    glViewport(0, 0, w, h);
}

void idle()
{
    glutPostRedisplay();
}


int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(200,200);
    glutCreateWindow("Scroll");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutSpecialFunc( keyboard );
    glutSpecialUpFunc( keyboard_up );

    glutIdleFunc(idle);
    glutMainLoop();
    return 0;
}