2014-03-27 3 views
0

그래서 2d 플랫폼 작성자입니다. 나는 스크롤링 카메라를 가지고 게임을 만들기로 결정할 때까지 텍스처, 컨트롤 및 모든 것을 잘 처리했습니다. GlOrtho를 사용하여 카메라를 움직이거나 확대/축소하는 것을 말한 곳을 읽었습니다. 그러나 glOrtho로 전화를 걸면 검정색으로 변합니다. 내가 잘못한 것을 알고 있지만 무엇을해야할지 몰라요. OpenGL은 glOrtho lwjgl이 표시된 검은 색 화면이 표시됩니다.

나는 게임 루프 전에이있어 :

glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
glOrtho(0, GAME_WIDTH, GAME_HEIGHT, 0, 1, -1); 
glMatrixMode(GL_MODELVIEW); 
*enabling texture_2d and others 

그리고 난 카메라가 플레이어를 다음 있도록 게임 루프에서이있어 :

glClear(GL_COLOR_BUFFER_BIT); 
xOff = player.x - GAME.WIDTH/2; 
yOff = player.y - GAME.HEIGHT/2; 
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1); 

를하지만 나에게 검은 화면을 제공합니다 .. 그래도 glOrtho의 첫 번째 호출에서 값을 변경할 때 괜찮습니다. 이미 Google에서이 prob를 검색하지만 도움을 찾을 수 없습니까?

편집 : - 두 번째 코드 조각처럼 여기 여기서 문제는 당신이 지금까지 내가 말할 수있는 직교 투영을 전환하기 전에 GL_PROJECTION하기 위해 매트릭스 모드를 변경하지 않는 것이 기본 클래스

package com.org.Game; 

import static org.lwjgl.opengl.GL11.*; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.Sys; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

import com.org.Game.Graphics.Draw; 
import com.org.Game.Graphics.Sprite; 
import com.org.Game.Graphics.Spritesheet; 
import com.org.Game.Level.Level; 
import com.org.Game.Level.Entity.Mob.Player; 

public class Main { 

    private static String title = "Platformer"; 
    private static int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 600; 
    private static int GAME_WIDTH = 320, GAME_HEIGHT = 240; 

    private boolean exit = false; 
    private long lastFPS; 
    private int fps; 
    private long lastFrame; 
    private long delta; 
    private boolean fpscap = true; 

    private Level lvl; 
    private Player player; 
    private int xOff, yOff; 

    public Main() { 
     try { 
      Display.setDisplayMode(new DisplayMode(WINDOW_WIDTH, WINDOW_HEIGHT)); 
      Display.setTitle(title); 
      Display.setVSyncEnabled(true); 
      DisplayMode[] modes = Display.getAvailableDisplayModes(); 
      for (int i = 0; i < modes.length; i++) { 
       if (modes[i].getWidth() == WINDOW_WIDTH && modes[i].getHeight() == WINDOW_HEIGHT && modes[i].getFrequency() == 60 && modes[i].isFullscreenCapable()) { 
        Display.setDisplayMode(modes[i]); 
        System.out.println(modes[i].getWidth() + " " + modes[i].getHeight() + " " + modes[i].getBitsPerPixel() + " " + modes[i].getFrequency() + " " + modes[i].isFullscreenCapable()); 
        break; 
       } 
      } 
      // Display.setFullscreen(true); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      Display.destroy(); 
      System.exit(0); 
     } 

     glLoadIdentity(); 
     glMatrixMode(GL_PROJECTION); 
     glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
     glOrtho(0, GAME_WIDTH, GAME_HEIGHT, 0, 1, -1); 
     glMatrixMode(GL_MODELVIEW); 

     glEnable(GL_TEXTURE_2D); 

     glEnable(GL_CULL_FACE); 
     glCullFace(GL_BACK); 

     glEnable(GL_BLEND); 
     glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR); 

     glPolygonMode(GL_FRONT, GL_FILL); 

     lvl = new Level(); 
     lvl.loadLevel("level0.dat"); 
     if (lvl == null) System.out.println("NULL"); 
     player = new Player(16, 16, Sprite.cobalt, lvl); 

     start(); 

     Spritesheet.tiles.tex.release(); 
     Spritesheet.bg_day.tex.release(); 
     Display.destroy(); 
     System.exit(0); 
    } 

    int a; 

    private void render() { 
     Draw.clearScreen(); 

     glLoadIdentity(); 
     glMatrixMode(GL_PROJECTION); 
     glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1); 
     glMatrixMode(GL_MODELVIEW); 

     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

     Draw.setTexture(Spritesheet.bg_day); 
     Draw.drawBackground(GAME_WIDTH, GAME_HEIGHT, Spritesheet.bg_day); 

     Draw.setTexture(Spritesheet.tiles); 
     lvl.renderLevel(GAME_WIDTH, GAME_HEIGHT, xOff, yOff); 

     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     player.render(); 
    } 

    private void update(long delta) { 
     player.update(delta); 
     if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) exit = true; 
     if (Keyboard.isKeyDown(Keyboard.KEY_Z)) fpscap = true; 
     if (Keyboard.isKeyDown(Keyboard.KEY_X)) fpscap = false; 
    } 

    public void start() { 
     lastFPS = getTime(); 
     getDelta(); 

     while (!Display.isCloseRequested() && !exit) { 
      getDelta(); 

      xOff = (int) player.x - GAME_WIDTH/2; 
      yOff = (int) player.y - GAME_HEIGHT/2; 

      render(); 
      update(delta); 

      updateFPS(); 
      Display.update(); 
      if (fpscap) Display.sync(120); 
     } 
    } 

    private void getDelta() { 
     long now = getTime(); 
     delta = now - lastFrame; 
     lastFrame = now; 
    } 

    private void updateFPS() { 
     fps++; 
     if (getTime() - lastFPS > 1000) { 
      lastFPS += 1000; 
      Display.setTitle(title + " FPS: " + fps); 
      fps = 0; 
     } 
    } 

    private long getTime() { 
     return Sys.getTime() * 1000/Sys.getTimerResolution(); 
    } 

    public static void main(String[] args) { 
     new Main(); 
    } 

} 
+0

그래서 당신도 모델 뷰 스택에 오르 프로젝션 행렬을 려구요? 왜? – genpfault

+0

그래서 두 번째 glOrtho 전에 gl_projection으로 전환해야한다고 말하는 것입니까? – Greffin28

+0

@ Greffin28 : 접근 방식에는 몇 가지 잠재적 인 문제가 있지만 추가 코드가 없으면 진행 상황을 알기 어렵습니다. 해당 행렬을 두 스택에 놓으면 두 번 적용됩니다. 그리고 이것이 여러분이 기대하는 결과를 얻지 못하게 할 것입니다. glOrtho는 단지 스케일 - 변환 행렬을 생성합니다. – derhass

답변

0

입니다 매트릭스 모드 상태가 변경되지 않았습니다. 그래서,이 시도 : 당신의 변환 행렬을 재설정 마음이 코드를 유지

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
xOff = player.x - GAME.WIDTH/2; 
yOff = player.y - GAME.HEIGHT/2; 
glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1); 
glMatrixMode(GL_MODELVIEW); 

을, 그래서 어떤 glTransform() 또는 glRotate는()를 호출 또는 glScale()는 물론 뜻이 무효 될 호출하지만이에 있기 때문에 게임 루프가 시작되고 모든 틱이 실행됩니다. 문제가되지 않아야합니다.

+0

나는 그것을 시도했지만 여전히 검은 화면을 준다 :/ – Greffin28

+0

글쎄, 화면을 지우는 glClear (GL_COLOR_BUFFER_BIT)를 호출하고있다. – SDLeffler

+0

기다려 .. 뭐 ..하지만 내가 화면을 지운 후에 glOrtho라고 불렀다. – Greffin28

0

코드에 대한 두 가지 문제점 : "OpenGL 초기화"를 수행하고 있습니다. 왜? OpenGL은 상태 머신이며, 초기화되지 않습니다. OpenGL을 필요할 때 필요한 상태로 놓습니다. 생성자에서 OpenGL 호출의 대부분은 불필요하며 아무 효과가 없습니다. 대부분의 OpenGL 항목은 렌더링 기능에서만 수행되어야합니다. 렌더링 방법

이 시도 :

private void render() { 
      // glViewport does not depend on the matrix state 
    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 

    Draw.clearScreen(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(xOff, xOff + GAME_WIDTH, yOff + GAME_HEIGHT, yOff, 1, -1); 

    glMatrixMode(GL_MODELVIEW); 
      glLoadIdentity(); 

    glEnable(GL_TEXTURE_2D); 

    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 

      // probably don't want to blend the background 
      // actually get your blending stuff right, I removed it entirely 
      // because it's completely unclear from your code what you want 
      // to blend which way 
    glDisable(GL_BLEND); 
    Draw.setTexture(Spritesheet.bg_day); 
    Draw.drawBackground(GAME_WIDTH, GAME_HEIGHT, Spritesheet.bg_day); 

    Draw.setTexture(Spritesheet.tiles); 
    lvl.renderLevel(GAME_WIDTH, GAME_HEIGHT, xOff, yOff); 

      // probably needs its texture set. 
    player.render(); 
} 
+0

그래, 그래, 그래, 그래, 그래,하지만 다시 한번 바뀌지 않을 무언가를 부르는 것이 더 편할지도 모르겠다. 오, 예, 배경 앞에 블렌드를 꺼내 주신 것에 대해 감사드립니다.) – Greffin28

+0

@ Greffin28 : 프로젝션 설정 비용 행렬이 너무 작아서 모든 디스플레이 호출을 설정하는 것이 큰 이점입니다. 또한 조만간 프레임을 렌더링하는 과정에서 투영 매개 변수를 여러 번 변경해야하는 상황에 처하게 될 것이며 프로그램이 "한 번만 투영 설정"을 중심으로 빌드 된 경우 추적을 계속하려는 엄청난 혼란이 될 것입니다 어떤 것이 어떤 순서로 바뀌는가? 날 믿어, 당신은 각 프레임을 렌더링 프로젝션을 재설정 싶어요. – datenwolf

+0

아니요 프로젝션 매트릭스를 의미하는 것이 아니라 gl_texture_2d를 활성화하는 것과 다른 것 – Greffin28

관련 문제