2013-12-22 3 views
0

Я использую OpenGL. Для моих плит я использую список отображения, и я просто использую немедленное больше для своего плеера (на данный момент). Когда я перемещаю плеер, я хочу центрировать его в центре окна, но позволяю ему прыгать по оси y, а камера не следует за ним. Но проблема в том, что я не могу понять, как центрировать игрока в окне просмотра! Вот метод обновления игрок:2D-камеры переводы

public void update() { 
    if (Keyboard.isKeyDown(Keyboard.KEY_D)) { 
     World.scrollx -= Constants.scrollSpeed; 
     setCurrentSprite(Sprite.PLAYER_RIGHT); 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_A)) { 
     World.scrollx += Constants.scrollSpeed; 
     setCurrentSprite(Sprite.PLAYER_LEFT); 
    } 
    move((Constants.WIDTH)/2 + -World.scrollx, getY()); 
} 

World.scrollx и World.scrolly являются переменными, которые я увеличить/уменьшить, чтобы переместить плитки. move() - это всего лишь метод, который устанавливает положение игрока, ничего другого. Оказываю игрока на его текущих координат, как это:

public void render() { 
    glBegin(GL_QUADS); 
    Shape.renderSprite(getX(), getY(), getCurrentSprite()); 
    glEnd(); 
} 

Shape.renderSprite это:

public static void renderSprite(float x, float y, Sprite sprite){ 
    glTexCoord2f(sprite.x, sprite.y + Spritesheet.tiles.uniformSize()); 
    glVertex2f(x, y); 
    glTexCoord2f(sprite.x + Spritesheet.tiles.uniformSize() , sprite.y + Spritesheet.tiles.uniformSize()); 
    glVertex2f(x + Constants.PLAYER_WIDTH, y); 
    glTexCoord2f(sprite.x + Spritesheet.tiles.uniformSize(), sprite.y); 
    glVertex2f(x + Constants.PLAYER_WIDTH, y + Constants.PLAYER_HEIGHT); 
    glTexCoord2f(sprite.x, sprite.y); 
    glVertex2f(x, y + Constants.PLAYER_HEIGHT); 
} 

Довольно просто, я просто вынести четверной в текущую позицию игрока. Вот как я на самом деле все:

public void render(float scrollx, float scrolly) { 
    Spritesheet.tiles.bind(); 
    glPushMatrix(); 
    glTranslatef(scrollx, scrolly, 0); 
    glCallList(tileID); 
    glPopMatrix(); 
    player.render(); 
} 

Это та часть, с которой я смущен. Я переводил плитки в соответствии с переменными scrollx и scrolly, а затем показываю плеер в его текущей позиции. Но игрок движется быстрее, чем прокрутка плитки, и он может скрыться от экрана! Как центрировать игрока с движущимися плитами?

Спасибо за помощь!

ответ

1

Если вы хотите, чтобы игрок был зафиксирован в центре экрана, то World.scrollx и World.scrolly должны быть получены из позиции игрока, не изменяясь независимо от него. Ваше обновление должно выглядеть примерно так (концептуально)

void update { 
    getPlayerInput() 
    updatePlayerPosition(); 
    updateWorldCoordinatesFromPlayerPosition(); 
} 
+0

Хмм ... Я пытаюсь думать о том, что я должен делать, и я не могу понять это. Я знаю, как сделать все, кроме последнего метода, получить исходную позицию игрока, а затем добавить переменные прокрутки, а затем визуализировать с помощью вывода? Я просто не знаю. –

+0

Еще один способ взглянуть на то, чтобы рассматривать позицию игрока как мировые координаты. Наличие координат мира немного странно. Вы должны думать о них вместо этого как координаты «камеры», и что мир имеет фиксированную систему координат. – Jherico

+0

Хорошо ... но тогда как я на самом деле это делаю? Я думаю, что понимаю теорию, но я серьезно не знаю, как ее реализовать. –