我试图让我的游戏沿着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与我的玩家有关,并在玩家移动时更新。 目前,如果您在游戏运行时获取窗口并调整其大小,您可以看到图像调整大小并且我的代码错误,因为正方形显示为矩形。
答案 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;
}