<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam

        來源:懂視網 責編:小采 時間:2020-11-09 07:43:18
        文檔

        jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam

        jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam:注:本系列教程全部翻譯完之后可能會以 PDF 的形式發布。 如果有什么錯誤可以留言或 EMAIL : kakashi9bi@gmail.com 給我。 jME 版本 : jME_2.0.1_Stable 開發工具: MyEclipse8.5 操作系統: Window7/Vista 這個向導中,我們將為 Flag
        推薦度:
        導讀jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam:注:本系列教程全部翻譯完之后可能會以 PDF 的形式發布。 如果有什么錯誤可以留言或 EMAIL : kakashi9bi@gmail.com 給我。 jME 版本 : jME_2.0.1_Stable 開發工具: MyEclipse8.5 操作系統: Window7/Vista 這個向導中,我們將為 Flag

        注:本系列教程全部翻譯完之后可能會以 PDF 的形式發布。 如果有什么錯誤可以留言或 EMAIL : kakashi9bi@gmail.com 給我。 jME 版本 : jME_2.0.1_Stable 開發工具: MyEclipse8.5 操作系統: Window7/Vista 這個向導中,我們將為 Flag Rush 構建基

        注:本系列教程全部翻譯完之后可能會以PDF的形式發布。

        如果有什么錯誤可以留言或EMAIL:kakashi9bi@gmail.com給我。

        jME版本:jME_2.0.1_Stable

        開發工具:MyEclipse8.5

        操作系統:Window7/Vista

        這個向導中,我們將為Flag Rush構建基礎。我們將通過自己實現繼承BaseGame。我們將使用BaseGame做為父類,但之后可能改為其它的游戲類型,因為BaseGame簡單地盡可能快地進行update和render。我們或許不必或不想使用這種類型的循環。然而,現在BaseGame是一個循環無關的類。在以后,改變BaseGame將不是重點,因為只是傳入update和render方法的值不同而已。

        我們將開始創建一個繼承自BaseGame的新類。你會注意到有6個需要實現的方法:update、render、initSystem、initGame和reinit。現在,只需要為它們創建一個存根方法,我們將在后面將自己的邏輯填充進去。

        import com.jme.app.BaseGame;

        publicclass Lesson2 extends BaseGame{

        publicstaticvoid main(String[] args) {

        }

        protectedvoid cleanup() {

        }

        protectedvoid initGame() {

        }

        protectedvoid initSystem() {

        }

        protectedvoid reinit() {

        }

        protectedvoid render(float arg0) {

        }

        protectedvoid update(float arg0) {

        }

        }

        2.1、Main

        那么,讓我們從最初開始。我們在這里將再次創建main方法。它很像前一個向導的main方法,除了一個關鍵的地方不同。這次我們將顯示FlagRush的迷人的新logo。AbstractGame定義了一對setConfigShowMode方法,其中的一個接受一個URL類用于加載Image。因此,我們將加載FlagRush.png(迷人的logo)并把它傳給這個方法。現在,當PropertiesDialog被顯示時,它將顯示新的Logo。

        publicstaticvoid main(String[] args) {

        Lesson2 app = new Lesson2();

        java.net.URL url =

        app.getClass().getClassLoader()

        .getResource("jmetest/data/images/FlagRush.png");

        app.setConfigShowMode(ConfigShowMode.AlwaysShow,url);

        app.start();

        }

        現在,當PropertiesDialog出現時,它將像下面這個一樣(你應該在項目中新建一個package——jmetest.data.images,然后里面有一張叫FlagRush.png的圖片):

        2.2、InitSystem

        現在,你能運行你的應用程序,但它僅僅是顯示PropertiesDialog,除此之外不會做更多的工作。我們下一步將實現initSystem方法。這個方法在進入主循環之前由BaseGame調用。這正是我們設置window和display的地方。我們將保存width,height,depth,frequency和fullscreen標志。我們將在后面使用這些值,假如用戶想改變分辨率的時候。所以,首先,讓我們創建變量去保存這些值:

        publicclass Lesson2 extends BaseGame{

        privateintwidth,height;

        privateintfreq,depth;

        privatebooleanfullscreen;

        ……………………….

        我們也需要在我們的程序中保存Camera,所以我們也應該為那創建一個變量。

        //我們的camera對象,用于觀看scene

        private Camera cam;

        最后將初始化的一項是Timer,Timer將允許我們獲取我們的幀率。所以,同樣的,這將是一個實例變量。

        protected Timer timer;

        現在我們已經準備好我們的實例變量,并且我們將在initSystem中初始化它們。

        protectedvoid initSystem() {

        //保存屬性信息

        width = settings.getWidth();

        height = settings.getHeight();

        depth = settings.getDepth();

        freq = settings.getFrequency();

        fullscreen = settings.isFullscreen();

        try{

        display = DisplaySystem.getDisplaySystem(

        settings.getRenderer()

        );

        display.createWindow(

        width, height, depth, freq, fullscreen

        );

        cam = display.getRenderer().createCamera(width, height);

        }catch(JmeException e){

        e.printStackTrace();

        System.exit(-1);

        }

        //設置背景為黑色

        display.getRenderer().setBackgroundColor(ColorRGBA.black);

        //初始化攝像機

        cam.setFrustumPerspective(

        45.0f,

        (float)width/(float)height,

        1f,

        1000f

        );

        Vector3f loc = new Vector3f(0.0f,0.0f,25.0f);

        Vector3f left = new Vector3f(-1.0f,0.0f,0.0f);

        Vector3f up = new Vector3f(0.0f,1.0f,0.0f);

        Vector3f dir = new Vector3f(0.0f,0.0f,-1.0f);

        //將攝像機移到正確位置和方向

        cam.setFrame(loc, left, up, dir);

        //我們改變自己的攝像機位置和視錐的標志

        cam.update();

        //獲取一個高分辨率用于FPS更新

        timer = Timer.getTimer();

        display.getRenderer().setCamera(cam);

        KeyBindingManager.getKeyBindingManager().set(

        "exit",

        KeyInput.KEY_ESCAPE

        );

        }

        這是一個長的方法,所以,我們將一點一點討論它。

        //保存屬性信息

        width = settings.getWidth();

        height = settings.getHeight();

        depth = settings.getDepth();

        freq = settings.getFrequency();

        fullscreen = settings.isFullscreen();

        首先,我們保存從properties對象(properties是由AbstractGame創建的)獲取的值。通過保存這些值,當用戶以后從系統菜單改變屏幕設置的時候,我們可以很容易地修改它們中的一個或全部值。

        try{

        display = DisplaySystem.getDisplaySystem(

        settings.getRenderer()

        );

        display.createWindow(

        width, height, depth, freq, fullscreen

        );

        cam = display.getRenderer().createCamera(width, height);

        }catch(JmeException e){

        e.printStackTrace();

        System.exit(-1);

        }

        下一步,我們獲取新的DisplaySystem,并通過先前獲得的屏幕參數創建一個本地窗口。我們接著使用DisplaySystem去創建一個Camera對象。你將注意到那用一個try/catch塊包圍。如果我們嘗試創建一個系統沒能力繪制的窗口,異常將在這里出現。目前,它只會退出,但之后,我們將讓這個顯示得更友好,并通知用戶。

        //設置背景為黑色

        display.getRenderer().setBackgroundColor(ColorRGBA.black);

        我們接著設置了窗口的背景顏色。當沒有其它數據被渲染的時候,這是顯示的默認顏色。我選擇黑色,這是因為它和我們后面將使用的任何文本形成鮮明的對比。不管怎樣,這都不是重點,因為當一切正常工作時,屏幕上通常覆蓋其它的數據。

        //初始化攝像機

        cam.setFrustumPerspective(

        45.0f,

        (float)width/(float)height,

        1f,

        1000f

        );

        Vector3f loc = new Vector3f(0.0f,0.0f,25.0f);

        Vector3f left = new Vector3f(-1.0f,0.0f,0.0f);

        Vector3f up = new Vector3f(0.0f,1.0f,0.0f);

        Vector3f dir = new Vector3f(0.0f,0.0f,-1.0f);

        //將攝像機移到正確位置和方向

        cam.setFrame(loc, left, up, dir);

        //我們改變自己的攝像機位置和視錐的標志

        cam.update();

        display.getRenderer().setCamera(cam);

        下一步,我設置了camera。我想要一個標準的camera,正常情況下是右手坐標系統(向上是正Y,向右是正X和向屏幕里面是-Z)。我同時設置了透視圖為45度視角。這個是大多數游戲里面的公認標準,而它將應用于Flag Rush。在camera數據設置之后,我們調用update,這將設置所有的OpenGL組件,例如視點(下文以ViewPort代替)和Frustum。

        //獲取一個高分辨率用于FPS更新

        timer = Timer.getTimer();

        這里只是初始化Timer,從本地Timer獲取(例如LWJGLTimer)。

        KeyBindingManager.getKeyBindingManager().set(

        "exit",

        KeyInput.KEY_ESCAPE

        );

        最后,我們創建一個新的InputSystem,將它綁定到我們的KeyBindingManager并設置一個輸入行為(Input action)。在這個框架中我們只關心一個按鍵——Escape。在這個例子中,我們設置action“exit”給Escape鍵。KeyBindingManager是一個單例類,它使用單一的get調用,關注了所有InputSystem組件的初始化。

        現在,如果你運行系統你將真正獲得一個屏幕顯示。它將充滿黑色(我們設置的背景顏色),沒有任何東西。

        2.3、InitGame

        現在,我們擁有一個窗口和OpenGL上下文環境,我們將加載我們的游戲數據(如上面前個向導的Sphere)

        protectedvoid initGame() {

        scene = new Node("Scene Graph Node");

        //創建我們的球體

        Sphere s = new Sphere("sphere", 30, 30, 25);

        s.setLocalTranslation(new Vector3f(0, 0, -40));

        s.setModelBound(new BoundingBox());

        s.updateModelBound();

        ts = display.getRenderer().createTextureState();

        ts.setEnabled(true);

        ts.setTexture(

        TextureManager.loadTexture(

        Lesson2.class.getClassLoader()

        .getResource("res/logo.png"),

        Texture.MinificationFilter.Trilinear,

        Texture.MagnificationFilter.Bilinear

        )

        );

        s.setRenderState(ts);

        scene.attachChild(s);

        //更新scene用于渲染

        scene.updateGeometricState(0.0f, true);

        scene.updateRenderState();

        }

        我們現在保存我們自己的Scene Graph結點,我已經選擇把它命名為scene,但實際上怎樣命名都是沒關系。因為這是scene的根節點,它也是一個實例變量而它和其他實例變量一樣被聲明:

        private Node scene;

        這個Node接著被實例化。接著我們創建了一個Sphere和TextureState(就像上一個的向導)。Sphere接著被attach到scene。這個看起來將和我們上一個向導所做的很相似。然而,現在,我們還調用updateGeometricState和updateRenderState。這些方法為SceneGraph updates調用。updateGeometricState是必須的,不管場景圖(Scene Graph)結構在何時改變(設置一個新的,改變另一個的參數,等等),在我們的例子中,我增加了一個sphere到到scene。不管RenderState在什么時候以何種方式發生改變,updateRenderState都應該被調用(比如創建一個新的RenderState、改變它的參數等等),在我們的例子中,我們增加了TextureState。

        我們現在擁有游戲中的數據,但它仍然沒被渲染到屏幕。

        2.4、Render和update

        既然我們已經初始化了窗口并加載了數據,如果能看到它將更好。那就是render方法的到來。BaseGame調用update并根據它的能力盡可能快地render。render的調用需要處理所有繪畫調用,而update應該處理任何的游戲邏輯。在我們的例子中,我們想要update做一點游戲邏輯,退出游戲。為了簡單退出游戲,我們將設置finished布爾值為true。

        /*

        * 在update期間,我們只需尋找Escape按鈕

        * 并更新timer去獲取幀率

        */

        protectedvoid update(float interpolation) {

        //更新timer去獲取幀率

        timer.update();

        interpolation = timer.getTimePerFrame();

        //當Escape被按下時,我們退出游戲

        if(KeyBindingManager.getKeyBindingManager()

        .isValidCommand("exit")

        ){

        finished = true;

        }

        }

        你也將注意到update獲取最新的timer讀數并為此設置插值(interpolation)。BaseGame通常在調用update時發送-1,所以我們將繼續并重用這個值去保存每幀真正的時間。

        接下來,我們將渲染。

        /*

        * 繪制場景圖

        */

        protectedvoid render(float interpolation) {

        //清除屏幕

        display.getRenderer().clearBuffers();

        display.getRenderer().draw(scene);

        }

        這個直截了當。我們使用clearBuffers清除屏幕。我們接著畫了scene,這是包含我們Sphere的樹。

        你現在能運行程序并看到:

        正是和前一課的顯示一樣,只不過沒了燈光。

        2.5、reinit和cleanup

        最后我們將覆蓋的2個方法是reinit和cleanup。當窗口需要重建時,Reinit應該被調用,就像參數發生了變化。而在關閉的時候調用cleanup。

        /*

        * 如果分辨率改變將被調用

        */

        protectedvoid reinit() {

        display.recreateWindow(width, height, depth, freq, fullscreen);

        }

        我們在這里所做的就只是傳遞新的值給DisplaySystem處理。僅此而已。

        /*

        * 清除texture

        */

        protectedvoid cleanup() {

        ts.deleteAll();

        }

        這簡單確保了texture被刪除。這不是特別必須的,因為OpenGL在它退出時將處理這個。但“寧可事先謹慎有余,切莫事后追悔莫及”。

        2.6、總結

        很好,就是那樣。我們現在有一個很基本、可工作的框架。通過創建我們自己的應用程序類型,我們能完全保持對我們場景中一切的控制。隨著向導的繼續,我們將很明確地增強并構建基于這個類的程序。

        2.7、源碼

        import com.jme.app.BaseGame;

        import com.jme.bounding.BoundingBox;

        import com.jme.image.Texture;

        import com.jme.input.KeyBindingManager;

        import com.jme.input.KeyInput;

        import com.jme.math.Vector3f;

        import com.jme.renderer.Camera;

        import com.jme.renderer.ColorRGBA;

        import com.jme.scene.Node;

        import com.jme.scene.shape.Sphere;

        import com.jme.scene.state.TextureState;

        import com.jme.system.DisplaySystem;

        import com.jme.system.JmeException;

        import com.jme.util.TextureManager;

        import com.jme.util.Timer;

        publicclass Lesson2 extends BaseGame{

        privateintwidth,height;

        privateintfreq,depth;

        privatebooleanfullscreen;

        //我們的camera對象,用于觀看scene

        private Camera cam;

        protected Timer timer;

        private Node scene;

        private TextureState ts;

        publicstaticvoid main(String[] args) {

        Lesson2 app = new Lesson2();

        java.net.URL url = app.getClass().getClassLoader().getResource("res/logo.png");

        app.setConfigShowMode(ConfigShowMode.AlwaysShow,url);

        app.start();

        }

        /*

        * 清除texture

        */

        protectedvoid cleanup() {

        ts.deleteAll();

        }

        protectedvoid initGame() {

        scene = new Node("Scene Graph Node");

        //創建我們的球體

        Sphere s = new Sphere("sphere", 30, 30, 25);

        s.setLocalTranslation(new Vector3f(0, 0, -40));

        s.setModelBound(new BoundingBox());

        s.updateModelBound();

        ts = display.getRenderer().createTextureState();

        ts.setEnabled(true);

        ts.setTexture(

        TextureManager.loadTexture(

        Lesson2.class.getClassLoader().getResource("res/logo.png"),

        Texture.MinificationFilter.Trilinear,

        Texture.MagnificationFilter.Bilinear

        )

        );

        s.setRenderState(ts);

        scene.attachChild(s);

        //更新scene用于渲染

        scene.updateGeometricState(0.0f, true);

        scene.updateRenderState();

        }

        protectedvoid initSystem() {

        //保存屬性信息

        width = settings.getWidth();

        height = settings.getHeight();

        depth = settings.getDepth();

        freq = settings.getFrequency();

        fullscreen = settings.isFullscreen();

        try{

        display = DisplaySystem.getDisplaySystem(

        settings.getRenderer()

        );

        display.createWindow(

        width, height, depth, freq, fullscreen

        );

        cam = display.getRenderer().createCamera(width, height);

        }catch(JmeException e){

        e.printStackTrace();

        System.exit(-1);

        }

        //設置背景為黑色

        display.getRenderer().setBackgroundColor(ColorRGBA.black);

        //初始化攝像機

        cam.setFrustumPerspective(

        45.0f,

        (float)width/(float)height,

        1f,

        1000f

        );

        Vector3f loc = new Vector3f(0.0f,0.0f,25.0f);

        Vector3f left = new Vector3f(-1.0f,0.0f,0.0f);

        Vector3f up = new Vector3f(0.0f,1.0f,0.0f);

        Vector3f dir = new Vector3f(0.0f,0.0f,-1.0f);

        //將攝像機移到正確位置和方向

        cam.setFrame(loc, left, up, dir);

        //我們改變自己的攝像機位置和視錐的標志

        cam.update();

        //獲取一個高分辨率用于FPS更新

        timer = Timer.getTimer();

        display.getRenderer().setCamera(cam);

        KeyBindingManager.getKeyBindingManager().set(

        "exit",

        KeyInput.KEY_ESCAPE

        );

        }

        /*

        * 如果分辨率改變將被調用

        */

        protectedvoid reinit() {

        display.recreateWindow(width, height, depth, freq, fullscreen);

        }

        /*

        * 繪制場景圖

        */

        protectedvoid render(float interpolation) {

        //清除屏幕

        display.getRenderer().clearBuffers();

        display.getRenderer().draw(scene);

        }

        /*

        * 在update期間,我們只需尋找Escape按鈕

        * 并更新timer去獲取幀率

        */

        protectedvoid update(float interpolation) {

        //更新timer去獲取幀率

        timer.update();

        interpolation = timer.getTimePerFrame();

        //當Escape被按下時,我們退出游戲

        if(KeyBindingManager.getKeyBindingManager()

        .isValidCommand("exit")

        ){

        finished = true;

        }

        }

        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam

        jMonkeyEngine譯文FlagRush2從你的應用程序中移除SimpleGam:注:本系列教程全部翻譯完之后可能會以 PDF 的形式發布。 如果有什么錯誤可以留言或 EMAIL : kakashi9bi@gmail.com 給我。 jME 版本 : jME_2.0.1_Stable 開發工具: MyEclipse8.5 操作系統: Window7/Vista 這個向導中,我們將為 Flag
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩精品无码永久免费网站| 亚洲日韩av无码中文| 国产精品免费看久久久香蕉| 国产hs免费高清在线观看| 日韩亚洲人成在线综合| 永久免费AV无码网站在线观看| 亚洲熟妇成人精品一区| 永久免费av无码网站大全| 污视频网站免费在线观看| 亚洲国产高清在线一区二区三区| 免费手机在线看片| 国产亚洲老熟女视频| 在线观看片免费人成视频无码| 亚洲高清在线播放| 黄色网址免费观看| 中文字幕在线日亚洲9| 免费大香伊蕉在人线国产| 香港经典a毛片免费观看看| 中文字幕无码精品亚洲资源网| 精品免费tv久久久久久久| 亚洲视频免费观看| 香蕉视频在线观看免费国产婷婷| 五月天国产成人AV免费观看| 中文字幕亚洲图片| 1000部拍拍拍18勿入免费视频软件 | 精品国产免费观看久久久 | 国产无遮挡色视频免费观看性色 | a色毛片免费视频| 久久亚洲精品中文字幕| 免费的涩涩视频在线播放| 成人在线免费视频| 亚洲精品高清国产麻豆专区| 成人毛片免费视频| 中文字幕在线免费播放| 亚洲人成在久久综合网站| 免费中文字幕一级毛片| 国产精品免费福利久久| 亚洲AV成人片无码网站| 亚洲av无码一区二区三区乱子伦 | 两个人的视频高清在线观看免费| 国产精品亚洲专区在线播放|