Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Статьи
        Основы
            AppSettings

AppSettings

Опубликованно: 25.09.2015, 23:24
Последняя редакция, AdiDOS: 19.04.2017 7:28

Давайте представим что есть у нас некая игра написанная на движке JME3 , а стандартное окно запуска нам не очень нравится , в таком случае появляться желание сделать свое меню настроек допустим настройки графики , звука и прочее , собственно  в этой статье мы рассмотрим как с помощью движка JME можно получить доступ к настройкам системы.

package test;

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.DisplayMode;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.ZipLocator;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeCanvasContext;

public class SettingsTest extends SimpleApplication {

 public static void main(String[] args) {
   new SettingsTest().start();
 }

 @Override
 public void simpleInitApp() {
   flyCam.setDragToRotate(true);
   flyCam.setMoveSpeed(20);
   viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));

   createLight();
   createScene();
 }
 //Создание сцены
 private void createScene(){
   assetManager.registerLocator("E:/AssetsTest/jME3-testdata/town.zip", ZipLocator.class);
   Spatial sceneModel = assetManager.loadModel("main.scene");
   sceneModel.setLocalScale(2f);
   rootNode.attachChild(sceneModel);
 }
 //Создание источника света
 private void createLight() {
   AmbientLight al = new AmbientLight();
   al.setColor(ColorRGBA.White.mult(1.3f));
   rootNode.addLight(al);

   DirectionalLight dl = new DirectionalLight();
   dl.setColor(ColorRGBA.White);
   dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());
   rootNode.addLight(dl);
 }

 @Override
 public void start(){
   AppSettings settings = new AppSettings(true);
   settings.setWidth(640);//Ширина экрана в пикселях
   settings.setHeight(480);//Высота экрана в пикселях
   settings.setFrameRate(120);//Частота кадров (fps)
   settings.setVSync(false);//Вертикальная синхронизация
   settings.setBitsPerPixel(24);//Установка глубина цвета
   settings.setRenderer(AppSettings.LWJGL_OPENGL3);//Версия рендеринга OpenGL
   settings.setFrequency(60);//Частота обновления
   settings.setSamples(16);//Сглаживание
   settings.setAudioRenderer(AppSettings.LWJGL_OPENAL);
   //Текущее разрешение экрана
   Dimension resolution = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
   settings.setResolution(resolution.width, resolution.height);
   settings.setFullscreen(true);//Полно-Экранный режим

   //Установка настроек
   this.setSettings(settings);
   this.createCanvas(); 

   //Создание контекста отображения
   JmeCanvasContext ctx = (JmeCanvasContext) getContext();
   ctx.setSystemListener(this);
   ctx.getCanvas().setPreferredSize(new Dimension(640, 480));

   //Создание формы
   JFrame frame = new JFrame();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setSize(1024, 748);
   frame.setLocationRelativeTo(null);

   frame.getContentPane().add(ctx.getCanvas());
   frame.setVisible(true);

   //Получаем список разрешений
   DisplayMode[] modes = null;
 try {
   modes = org.lwjgl.opengl.Display.getAvailableDisplayModes();
 } catch (LWJGLException e) {
   e.printStackTrace();
 }

 for(DisplayMode mode : modes){
   System.out.println("> "+mode.getWidth()+" "+mode.getHeight()+" "+ mode.getBitsPerPixel());
  }
 }
}

1

Данный пример демонстрирует создание установку своих настроек , класс AppSettings он предназначен для хранения и установки настроек нашей игры или приложения ,  ну а далее описание методов

Установка ширины и высоты окна приложения.

setWidth(640);
setHeight(480);

Установка количества кадров в секунду (frame per second).

setFrameRate(120);

Включение вертикальной синхронизации , это такая технология которая синхронизирует частоту кадров с частотой обновления монитора , помогает избежать  вывода некоторых артефактов  на экране.

setVSync(false);

Установка глубины цвета , а точнее устанавливаем количество бит на пиксель по умолчанию 24.

setBitsPerPixel(24);

Даем понять движку какой версией OpenGL будет производится обработка графики.

setRenderer(AppSettings.LWJGL_OPENGL3);

Установка частоты обновления экрана в герцах , по умолчанию 60.

settings.setFrequency(60);

Установка сглаживания (anti-aliasing)  , эта технология позволяет сгладить эффекты зубчатости моделей на сцене , максимальное значение зависит от поддержки вашей видеокарте , на слабых видеокартах может сильно тормозить отображение , моя HD7790 поддерживает  х16.

setSamples(16);

Установка звуковой системы в движке , есть два варианта первый это использование библиотеки OpenAL и второй null это отключение использования звука.

setAudioRenderer(AppSettings.LWJGL_OPENAL);

Установка разрешения экрана в пикселях.

setResolution(resolution.width, resolution.height);

Получаем текущее разрешение экрана и установка разрешения.

Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
setResolution(resolution.width, resolution.height);

Включение полно-экранного режима , эта функция не работает при создании отдельного контекста отображения , как в нашем случае.

setFullscreen(true);

Если вы знаете разные мониторы могут поддерживать разные разрешения экрана и глубину цвета ,  ниже код показывает как получить список всех поддерживаемых разрешений вашего монитора.

DisplayMode[] modes = null;
 try {
   modes = org.lwjgl.opengl.Display.getAvailableDisplayModes();
 } catch (LWJGLException e) {
 e.printStackTrace();
 }

 for(DisplayMode mode : modes){
   System.out.println("> "+mode.getWidth()+" "+mode.getHeight()+" "+ mode.getBitsPerPixel());
 }

Этот пример демонстрирует не только установку настроек системы , а также мы здесь создаем свой контекст отображения , дабы не использовать стандартное окно настроек JME3 , я думаю все ясно модель сцены можете скачать здесь town.zip.

Спасибо за внимание !!!

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.