그래서 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();
}
}
그래서 당신도 모델 뷰 스택에 오르 프로젝션 행렬을 려구요? 왜? – genpfault
그래서 두 번째 glOrtho 전에 gl_projection으로 전환해야한다고 말하는 것입니까? – Greffin28
@ Greffin28 : 접근 방식에는 몇 가지 잠재적 인 문제가 있지만 추가 코드가 없으면 진행 상황을 알기 어렵습니다. 해당 행렬을 두 스택에 놓으면 두 번 적용됩니다. 그리고 이것이 여러분이 기대하는 결과를 얻지 못하게 할 것입니다. glOrtho는 단지 스케일 - 변환 행렬을 생성합니다. – derhass