Привет, гость!
В этот раз тебе очень повезло. Ты узнаешь о таймере и о анимации которая так сильно нужна в современных приложениях.
Что же подразумевается под словом "таймер"?
Таймер - некий отдельный класс или программа для измерения времени для анимации или для изменения позиции, например, квадрата или другого объекта на экране.
На счастье, в библиотеке LWJGL уже есть все необходимое для создания таймера и поэтому начнем!
System.currentTimeMillis(); в Java имеет точность в размере от 1 до 55 миллисекунд в зависимости от операционной системы, но для более точного и быстрого измерения времени, мы будем использовать Sys.getTime();
Этот lwjglковский таймер умеет измерять время в наносекундах, микросекундах, миллисекундах, и т.д.
Нам нужны миллисекунды, для этого нужно метод Sys.getTimer(); умножить на 1000.
Во многих играх целочисленное значение используется для хранения количество миллисекунд, прошедших с последнего кадра. Это значение может использоваться для перемещения объектов в игре в кадре независимым образом. Это означает, что независимо от того, быстро или медленно FPS все должно двигаться с постоянной скоростью.
Чтобы ограничить FPS в библиотеке существует метод
Display.sync(int fps);
Для чего это нужно?
Этот метод позволяет игровой цикл работать на заданной частоте кадров (например, 60 кадров в секунду) и спать в течение дополнительного времени для облягчения нагрузки на видеокарту или процессор.
Теперь по поводу анимации.
В LWJGL библиотеке есть встроенные методы для обработки нажатия клавиш на клавиатуре или кнопок на мыше.
Это классы Keyboard и Mouse.
Для того, чтобы обработать нажатие кнопки "F" на клавиатуре, нужно делать так:
if (Keyboard.isKeyDown(Keyboard.KEY_F))
{
System.out.println("нажат клавиша F");
}
Или для мыши
if (Mouse.isButtonDown(0)) // 0 - левая кнопка, 1 - правая.
{
System.out.println("нажат левая кнопка мыши");
}
Для того, чтобы обрабатывать нажатие кнопок всего один раз, нужно создать еще один цикл:
while(Mouse.next())
{
if (Mouse.isButtonDown(...) {...}
}
Теперь нам нужно при нажатии кнопок - перемещать квадрат по экрану...
Теперь код:
В этот раз тебе очень повезло. Ты узнаешь о таймере и о анимации которая так сильно нужна в современных приложениях.
Что же подразумевается под словом "таймер"?
Таймер - некий отдельный класс или программа для измерения времени для анимации или для изменения позиции, например, квадрата или другого объекта на экране.
На счастье, в библиотеке LWJGL уже есть все необходимое для создания таймера и поэтому начнем!
System.currentTimeMillis(); в Java имеет точность в размере от 1 до 55 миллисекунд в зависимости от операционной системы, но для более точного и быстрого измерения времени, мы будем использовать Sys.getTime();
Этот lwjglковский таймер умеет измерять время в наносекундах, микросекундах, миллисекундах, и т.д.
Нам нужны миллисекунды, для этого нужно метод Sys.getTimer(); умножить на 1000.
Во многих играх целочисленное значение используется для хранения количество миллисекунд, прошедших с последнего кадра. Это значение может использоваться для перемещения объектов в игре в кадре независимым образом. Это означает, что независимо от того, быстро или медленно FPS все должно двигаться с постоянной скоростью.
Чтобы ограничить FPS в библиотеке существует метод
Display.sync(int fps);
Для чего это нужно?
Этот метод позволяет игровой цикл работать на заданной частоте кадров (например, 60 кадров в секунду) и спать в течение дополнительного времени для облягчения нагрузки на видеокарту или процессор.
Теперь по поводу анимации.
В LWJGL библиотеке есть встроенные методы для обработки нажатия клавиш на клавиатуре или кнопок на мыше.
Это классы Keyboard и Mouse.
Для того, чтобы обработать нажатие кнопки "F" на клавиатуре, нужно делать так:
if (Keyboard.isKeyDown(Keyboard.KEY_F))
{
System.out.println("нажат клавиша F");
}
Или для мыши
if (Mouse.isButtonDown(0)) // 0 - левая кнопка, 1 - правая.
{
System.out.println("нажат левая кнопка мыши");
}
Для того, чтобы обрабатывать нажатие кнопок всего один раз, нужно создать еще один цикл:
while (Keyboard.next()) { // и в нем обрабатывать нажатие. if (Keyboard.isKeyDown(Keyboard.KEY_F)) { System.out.println("нажат клавиша F"); } if (Keyboard.isKeyDown(Keyboard.KEY_W)) { System.out.println("нажат клавиша W"); } }То же самое и для мыши:
while(Mouse.next())
{
if (Mouse.isButtonDown(...) {...}
}
Теперь нам нужно при нажатии кнопок - перемещать квадрат по экрану...
float x = 0.0F, y = 0.0F; float movementSpeed = 0.1F; if (Keyboard.isKeyDown(Keyboard.KEY_W)) { y += movementSpeed * delta; // delta - время, за которое произойдет перемещение позиции. } if (Keyboard.isKeyDown(Keyboard.KEY_S)) { y -= movementSpeed * delta; } if (Keyboard.isKeyDown(Keyboard.KEY_D)) { x += movementSpeed * delta; } if (Keyboard.isKeyDown(Keyboard.KEY_A)) { x -= movementSpeed * delta; }Ну вот и все!
Теперь код:
import java.util.logging.Level; import java.util.logging.Logger; import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; public final class SimpleProgram { private float x, y; private float movementSpeed; private float rotation; private long lastFrame; private long lastFPS; private int fps; private int delta; private SimpleProgram() { this.x = 400.0F; this.y = 300.0F; this.movementSpeed = 0.1F; this.rotation = 0.0F; this.lastFrame = 0; this.fps = 0; this.lastFPS = 0; this.delta = 0; } private void initialize() { this.createDisplay(800, 600, "SimpleProgram"); this.createMatrixOrtho(); this.running(); } private void createDisplay(int width, int height, String title) { try { Display.setDisplayMode(new DisplayMode(width, height)); Display.setTitle(title); Display.create(); } catch (LWJGLException ex) { Logger.getLogger(SimpleProgram.class.getName()).log(Level.SEVERE, null, ex); this.clearResources(true); } } private void createMatrixOrtho() { GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0.0D, (double) Display.getWidth(), 0.0D, (double) Display.getHeight(), -1.0D, 1.0D); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); } private void running() { this.bindResources(); while (!Display.isCloseRequested()) { this.displayUpdate(); } this.clearResources(false); } private void bindResources() { this.getDelta(); this.lastFPS = this.getTime(); } private void keyInput() { if (Keyboard.isKeyDown(Keyboard.KEY_W)) { this.y += this.movementSpeed * this.delta; // delta - время, за которое произойдет перемещение позиции. } if (Keyboard.isKeyDown(Keyboard.KEY_S)) { this.y -= this.movementSpeed * this.delta; } if (Keyboard.isKeyDown(Keyboard.KEY_D)) { this.x += this.movementSpeed * this.delta; } if (Keyboard.isKeyDown(Keyboard.KEY_A)) { this.x -= this.movementSpeed * this.delta; } this.rotation += 0.1F * this.delta; } private void drawQuad(float x, float y, float rotate, float width, float height) { GL11.glPushMatrix(); GL11.glTranslatef(x, y, 0.0F); GL11.glRotatef(rotate, 0.0F, 0.0F, 1.0F); // повернуть объект. GL11.glTranslatef(-width / 2, -height / 2, 0.0F); // сдвиг по координате x на половину для вращения в центре. GL11.glBegin(GL11.GL_QUADS); GL11.glVertex2f(0.0F, 0.0F); GL11.glVertex2f(width, 0.0F); GL11.glVertex2f(width, height); GL11.glVertex2f(0.0F, height); GL11.glEnd(); GL11.glPopMatrix(); } private void displayUpdate() { // обновление значение delta. this.delta = this.getDelta(); // обработка событий. this.keyInput(); GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); GL11.glLoadIdentity(); // рисование квадрата. this.drawQuad(this.x, this.y, this.rotation, 50.0F, 50.0F); GL11.glPushMatrix(); GL11.glTranslatef(100.0F, 200.0F, 0.0F); GL11.glBegin(GL11.GL_QUADS); GL11.glColor3f(1.0F, 0.0F, 0.0F); GL11.glVertex2f(0.0F, 0.0F); GL11.glColor3f(0.0F, 1.0F, 0.0F); GL11.glVertex2f(50.0F, 0.0f); GL11.glColor3f(0.0F, 0.0F, 1.0F); GL11.glVertex2f(50.0F, 50.0F); GL11.glColor3f(1.0F, 1.0F, 1.0F); GL11.glVertex2f(0.0F, 50.0F); GL11.glEnd(); GL11.glPopMatrix(); GL11.glColor3f(1.0F, 1.0F, 1.0F); this.updateFPS(); // обновление FPS. Display.update(); Display.sync(60); } private void clearResources(boolean hasCrash) { System.out.println(GLU.gluErrorString(GL11.glGetError())); Display.destroy(); System.exit(hasCrash ? 1 : 0); } private void updateFPS() { if (this.getTime() - this.lastFPS > 1000) { Display.setTitle("FPS: " + this.fps); // показ FPS. this.fps = 0; this.lastFPS += 1000; } this.fps++; } // получить delta. private int getDelta() { long time = this.getTime(); int delta2 = (int) (time - this.lastFrame); this.lastFrame = time; return delta2; } // получить время в миллисекундах. public long getTime() { return (Sys.getTime() * 1000) / Sys.getTimerResolution(); } /** * @param args the command line arguments */ public static void main(String[] args) { new SimpleProgram().initialize(); } }
Комментариев нет:
Отправить комментарий