`
windybell
  • 浏览: 15590 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

运行时切换全屏/窗口大小

 
阅读更多
JME3没有直接提供改变屏幕大小的接口,我们可以通过settings来修改参数,然后调用Application的restart()方法来使这些参数生效。restart()方法源码是这么说的:
    /**
     * Restarts the context, applying any changed settings.
     * <p>
     * Changes to the {@link AppSettings} of this Application are not
     * applied immediately; calling this method forces the context
     * to restart, applying the new settings.
     */
    public void restart(){
        context.setSettings(settings);
        context.restart();
    }


我们对AppSettings的修改并不会立即生效,调用restart方法会强制应用程序重启,并迫使新的配置生效。

我写了一个简单的屏幕切换测试代码,可以正常运行:
package org.pstale.client.gui;

import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.math.Vector2f;
import com.jme3.system.AppSettings;

public class TestChangeScreen extends SimpleApplication {

	boolean fullscreen;
	
	@Override
	public void simpleInitApp() {
		fullscreen = settings.isFullscreen();
		
		inputManager.addMapping("r", new KeyTrigger(KeyInput.KEY_R));
		inputManager.addMapping("f", new KeyTrigger(KeyInput.KEY_F));
		inputManager.addListener(listener, "r", "f");
	}

	ActionListener listener = new ActionListener() {
		@Override
		public void onAction(String name, boolean isPressed, float tpf) {
			if (isPressed == false)
				return;

			// R键改变屏幕大小
			if ("r".equals(name)) {
				changeScreen();
			}

			// F键切换全屏
			if ("f".equals(name)) {
				fullScreen();
			}
		}

	};

	Vector2f[] dimension = new Vector2f[] { new Vector2f(800, 600), new Vector2f(1024, 768), new Vector2f(1280, 720) };
	int dCnt = 0;
	private void changeScreen() {
		Vector2f d = dimension[dCnt];
		dCnt++;
		if (dCnt >= dimension.length)
			dCnt = 0;
		
		changeSize(d.x, d.y);
	}
	
	/**
	 * 切换Screen Size
	 */
	private void changeSize(float x, float y) {
		settings.setWidth((int) x);
		settings.setHeight((int) y);
		restart();
	}

	/**
	 * 切换全屏
	 */
	private void fullScreen() {
		fullscreen = !fullscreen;
		settings.setFullscreen(fullscreen);
		restart();
	}

	public static void main(String[] args) {
		// 默认设置
		AppSettings settings = new AppSettings(true);
		settings.setWidth(1024);
		settings.setHeight(768);
		settings.setFullscreen(false);

		// 启动
		SimpleApplication app = new TestChangeScreen();
		app.setShowSettings(false);
		app.setSettings(settings);
		app.start();
	}

}


注意,上述代码在下面条件下会失效:使用JME3自带的配置窗口来初始化应用程序,并且没有勾选上FullScreen。
按F切换全屏的时候,会报下面的异常。原因是JME3在通过LWJGL创建应用程序时,没有生成全屏模式,结果无法切换。
严重: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
java.lang.RuntimeException: Unable to find fullscreen display mode matching settings
	at com.jme3.system.lwjgl.LwjglDisplay.createContext(LwjglDisplay.java:79)
	at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:177)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
	at java.lang.Thread.run(Unknown Source)

真是太奇怪了,我勾选了FullScreen就没这个问题,不用JME3的默认窗口来设置全屏也没问题,就是在这唯一一种情况下有问题,这算是JME3的一个bug吗?
0
2
分享到:
评论

相关推荐

    MFC运行时全屏显示,充满整个窗口

    // 获取屏幕工作区大小,确保全屏窗口不会被任务栏等遮挡 CRect rectScreen; ::SystemParametersInfo(SPI_GETWORKAREA, 0, &rectScreen, 0); // 设置窗口位置和大小以填充屏幕 SetWindowPos(NULL, rectScreen....

    c++中窗口的全屏化

    2. **FullScreenHandler.cpp**:这个文件很可能包含了处理全屏模式切换的逻辑,比如用户按下特定按键或点击菜单项时触发全屏/窗口模式的切换。它可能包括了`SetFullScreen`和`ExitFullScreen`等函数,这些函数会调用...

    全屏后 禁止窗口切换 代码

    标题中的“全屏后禁止窗口切换代码”是指在应用程序全屏模式下,通过编程手段禁用窗口切换和其他系统快捷键,以确保用户在特定应用中保持全屏无干扰的体验。这种技术通常应用于游戏或者一些需要高度专注的应用场景中...

    VC++6.0全屏切换的窗口示例

    全屏切换可以通过重载`OnSize`或`On_WM_SIZE`消息处理函数实现,当用户请求全屏时,窗口大小应设置为屏幕分辨率。 3. **屏幕分辨率获取**:在全屏切换前,需要获取当前显示器的分辨率。可以使用`GetSystemMetrics`...

    C++编程系列之实现全屏显示

    你需要重写`WndProc`函数来处理窗口消息,比如`WM_SIZE`消息,当窗口大小改变时,需要根据新的屏幕尺寸调整窗口大小以保持全屏状态。 4. **切换全屏/窗口模式** 为了允许用户在全屏和窗口模式之间切换,可以在程序...

    易语言源码全屏游戏窗口化.7z

    5. 切换回全屏:当用户需要返回全屏模式时,源码需要清除窗口,恢复原全屏设置,并重新激活全屏模式。 6. 错误处理和兼容性:编写这样的程序时,需要考虑不同游戏的兼容性,以及可能出现的异常情况,比如游戏未运行...

    易语言源码全屏游戏窗口化.zip

    窗口化全屏游戏主要是解决游戏在全屏模式下运行时可能遇到的问题,如分辨率限制、无法同时处理多任务等。以下将详细探讨易语言及其用于游戏窗口化的技术点。 1. **易语言基础**: - **语法特点**:易语言采用中文...

    QT全屏显示代码示例

    在这个示例中,`toggleFullScreen()`方法用于切换全屏状态,而`changeEvent()`则重载了父类的事件处理函数,当窗口状态改变(如进入或退出全屏)时,可以执行特定的操作。 总的来说,`QT全屏显示代码示例`可能涉及...

    随意调节你的activity的大小,activity 自定义窗口大小

    然而,有时候开发者可能希望实现自定义窗口大小的功能,以便为用户提供更灵活的交互体验。本篇文章将探讨如何实现“随意调节Activity的大小”,即Activity的自定义窗口大小。 首先,要理解Android的窗口管理机制。...

    全屏程序窗口化-软件下载

    它可能提供了自定义窗口大小、位置、分辨率等设置,以便更好地适应不同的全屏程序。 在压缩包文件名称列表中,“windowed tools”暗示了这个软件可能包含一系列用于窗口化的工具或者组件。用户在下载并解压后,可以...

    surfaceview+mediaplayer实现视频播放和动态设置全屏窗口切换。

    4. 全屏窗口切换: 要实现在非全屏和全屏之间的切换,首先需要在布局文件中为全屏模式准备一个备用布局。在用户触发全屏操作时,可以使用ViewGroup的removeView()和addView()方法将SurfaceView从当前布局移除并添加...

    vc全屏显示

    以下是一个简单的示例代码,展示如何在程序运行时切换到全屏模式: ```cpp #include // 获取屏幕分辨率 void GetScreenResolution(int& width, int& height) { RECT rect; GetWindowRect(GetDesktopWindow(), &...

    Android视频播放器 支持列表,完美切换全屏、小窗口的 .zip

    在Android平台上开发一款功能完善的视频播放器,支持列表播放、无缝切换全屏和小窗口模式,是提升用户体验的重要环节。本文将深入探讨实现这一目标所需的关键技术和知识点。 1. **视频解码与渲染** - **硬件加速**...

    full_wnd.zip_VC 全屏_full_窗口 VC

    3. **切换全屏模式**:在程序运行时,可以通过更改窗口样式和位置来实现全屏与窗口模式的切换。使用`SetWindowLong`修改窗口样式,`SetWindowPos`调整窗口位置和大小。 4. **处理消息**:在消息循环中,处理WM_SIZE...

    MASM32编程演示程序在窗口模式和全屏模式间切换

    为了切换到全屏模式,我们可以修改窗口的样式,去除边框、标题栏等非客户区元素,并将窗口的大小扩展到屏幕分辨率。这通常通过调用`SetWindowLong`和`SetWindowPos`函数来完成。相反,若要返回窗口模式,我们需要...

    cocos2d-x实现全屏

    參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 主要修改兩個檔案: CCEGLView.h ...

    VC 可以使游戏全屏运行的代码

    3. **窗口大小调整**:获取屏幕分辨率,通常是通过`GetSystemMetrics`函数获取SM_CXSCREEN和SM_CYSCREEN值,这些值代表屏幕的宽度和高度。然后将窗口的大小设置为屏幕大小,以覆盖整个显示器。 4. **窗口位置设置**...

    易语言源代码_全屏游戏窗口化.zip

    2. **屏幕分辨率和窗口大小调整**:全屏游戏往往设置为特定的分辨率,窗口化时需要适配用户当前的桌面分辨率。易语言中可以通过`GetSystemMetrics`获取屏幕尺寸,然后根据游戏原始分辨率和屏幕分辨率计算出合适的...

    全屏游戏窗口化.zip易语言程序源码资源下载

    3. 屏幕操作:全屏模式与窗口模式的切换,这可能涉及到屏幕分辨率的获取和设置,以及窗口坐标和大小的计算。 4. 游戏接口:如果源码涉及到与游戏的交互,那么可能包含特定游戏API的调用或者模拟键盘鼠标输入来实现...

    计算机软件-商业源码-全屏游戏或界面窗口化代码.zip

    2. **窗口管理**:从全屏到窗口的切换需要处理窗口的创建、大小调整、位置设置等。这通常涉及到操作系统级别的窗口API调用。 3. **图形渲染**:全屏和窗口化模式下的图形渲染方式可能会有所不同。在全屏模式下,...

Global site tag (gtag.js) - Google Analytics