(это вы делаете для того, чтобы создавать кубы только один раз). А теперь в методе GET_INIT_RUNNING(), до цикла while(); Впишите это: TexLoad.init(); А после этого метода следующее... World(); (сначала мы создаем кубы, а потом крепим к ним текстуры). Теперь откройте Класс Quad и замените весь код на новый:
public static boolean[] keys = new boolean[256]; public static final int DISPLAY_WIDTH = 800; public static final int DISPLAY_HEIGHT = 600; public String TITLE = "GL3Dgame"; public boolean VSYNC_ENABLED = false; public boolean RUNNING = true; public static final int MAX_FPS = 100; public static float dt = 0.0f; public static long lastFPS; public static long lastFrame; public static int fps;
// создание камеры Camera camera = new Camera(this);
// блоки List<Quad> quad = new ArrayList<Quad>();
// конструктор главного класса Main. public Main() { // здесь будет пусто, потому-что блоки нужно ставить только один раз }
// заготовка для настройки дисплея. public void GET_INIT_DISPLAY() { try { // настраиваем размеры окна, в моем случае это 800x600 Display.setDisplayMode(new DisplayMode(DISPLAY_WIDTH, DISPLAY_HEIGHT)); // меняем заголовок окна Display.setTitle(TITLE); // вертикальная синхронизация в этот момент отключена Display.setVSyncEnabled(VSYNC_ENABLED); // создаем окно Display.create(); // если появилась ошибка... } catch (LWJGLException e) { // выводим в консоль сообщение об ошибке System.err.println("Error: Display.create"); // здесь объяснять не буду. e.printStackTrace(); // asCrash == true это число 1, сообщаем всем, что причина очистки // из за ошибки cleanUp(true); }
// это настройка Opengl GET_INIT_GL3D(); // запускаем цикл GET_INIT_RUNNING(); }
public void GET_INIT_RENDER() { // Очистить экран и буфер глубины GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glLoadIdentity(); // установка позиции камеры camera.TranslateCamera(); for (Quad q : quad) { q.render(); } }
// здесь мы поместим все в один метод, чтобы было легче работать. public void GET_INIT_UPDATE() { // установка камеры camera.Update(); // скрытие курсора Mouse.setGrabbed(true); mapKeys(); GET_INIT_RENDER(); UpdateFPS(); }
// ну а здесь будет главный цикл игры. public void GET_INIT_RUNNING() { float lastTime = 0.0f; float time = 0.0f; lastFPS = GetTime(); // обратите внимание на то, что текстуры загружать нам нужно только один // раз. TexLoad.init(); // А уже после загрузки текстур нам нужно вызвать метод World World(); // цикл будет работать до тех пор, пока RUNNING не будет равен false; // окно не будет закрыто; пользователь не нажмет клавишу ESC. while (RUNNING && !Display.isCloseRequested() && !keys[Keyboard.KEY_ESCAPE]) { time = Sys.getTime(); dt = (time - lastTime) / 1000.0f; lastTime = time; GET_INIT_UPDATE(); // обновление окна Display.update(); Display.sync(MAX_FPS); } // asCrash == false это число 0. Выход в нормальном состоянии cleanUp(false); }
// массив для хранения Keyboard public void mapKeys() { for (int i = 0; i < keys.length; i++) { keys[i] = Keyboard.isKeyDown(i); } }
// очистка и разрушение окна public void cleanUp(boolean asCrash) { Display.destroy(); System.exit(asCrash ? 1 : 0); }
// здесь и так все понятно. public static void main(String[] args) { Main main = new Main(); main.GET_INIT_DISPLAY(); } }
Добавлено (14.01.2013, 02:40) --------------------------------------------- Из замечаний:
1) ты пишешь: > Создайте новый класс TexNum и впишите в него этот код: а на деле создать надо TexLoad.
2) Стоит сказать что текстуры надо поместить в res/texture/ 3) А также про то что их нужно подключить к проекту(лично я делал так) - возможно тут я не совсем прав и можно просто правильно разместить папку.. джаву и эклипс пользую впервые, действовал по наитию, когда компилятор начал ругаться на ресурсы...
wawe, продолжай делать уроки, и может канал сделаеш, мне лично понятней в видео, а так уроки супер и может попробуеш игру minecraft сделать это будет простой пример war_man333