2011-04-01 129 views
3

我想讓我的遊戲沿着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

當窗口調整大小或者顯示更多相同大小的地圖時,您是否希望一切都可以放大? – genpfault 2011-04-01 20:44:09

+1

要顯示更多相同大小的地圖,所以我可以右轉看地圖的其餘部分並跳到平臺上,以便屏幕上升 – himmerz 2011-04-01 20:48:19

回答

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; 
} 
+1

這個答案如何不同於我所說的?我只是沒有寫出整個代碼! :) – Ali1S232 2011-04-01 21:14:04

+1

我的上帝是如何愛這些獨角獸。很難不投票給別人看看他們! – manneorama 2011-04-01 21:27:54

+0

開始工作並瞭解這種效果的最佳示例。謝謝。 – 2012-11-19 21:59:12

4

我想問題是與視口分辨率,我的意思是當你調整窗口的大小時,你的視口保持不變像以前一樣,你仍然在繪製例如640x480的屏幕,同時顯示你在800x600中繪製的內容分辨率,所以我認爲你必須在任何窗口大小調整事件後致電glViewPort(0,0,screenWidth,screenHeight)

+0

是的,我每次更新都會調用它, – himmerz 2011-04-01 20:59:29

+0

glOrtho(tempX - screenWidth/2 ,tempX + screenWidth/2,tempY - screenHeight/2,tempY + screenHeight/2,-1,1); \t //也許這會工作? – himmerz 2011-04-01 21:00:13

+1

所以你確定你正在更新screenWidth和screenHeight?和'glveiwPort'不是每個幀調用的東西,你只需要調用它,每當你從Windows窗口調整大小的事件 – Ali1S232 2011-04-01 21:03:50