application_states.html 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>Application States :: jMonkeyEngine Docs</title>
  7. <link rel="canonical" href="https://wiki.jmonkeyengine.org/docs/3.8/core/app/state/application_states.html">
  8. <link rel="prev" href="../update_loop.html">
  9. <link rel="next" href="../../scene/control/custom_controls.html">
  10. <meta name="generator" content="Antora 3.0.1">
  11. <link rel="stylesheet" href="../../../../../_/css/site.css">
  12. <meta property="og:image" content="https://wiki.jmonkeyengine.org/_/img/iconx128.png">
  13. <meta property="og:description" content="Application States">
  14. <meta property="og:title" content="jMonkeyEngine Docs">
  15. <link rel="stylesheet" href="../../../../../_/css/site-extra.css">
  16. <link rel="stylesheet" href="../../../../../_/css/vendor/docsearch.min.css">
  17. <!-- fetched from https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css -->
  18. <link rel="icon" href="../../../../../_/img/favicon.ico" type="image/x-icon">
  19. </head>
  20. <body class="article">
  21. <header class="header">
  22. <nav class="navbar">
  23. <div class="navbar-brand">
  24. <a class="navbar-item" href="https://wiki.jmonkeyengine.org">
  25. <img alt="" src="../../../../../_/img/jme-logo.png" height="32" type="image/x-icon">
  26. </a>
  27. <div class="navbar-item hide-for-print">
  28. <input id="search-input" type="text" placeholder="Search docs">
  29. </div>
  30. <button class="navbar-burger" data-target="topbar-nav">
  31. <span></span>
  32. <span></span>
  33. <span></span>
  34. </button>
  35. </div>
  36. <div id="topbar-nav" class="navbar-menu">
  37. <div class="navbar-end">
  38. <div class="navbar-item theme-switch-wrapper">
  39. <label class="theme-switch" for="checkbox">
  40. <input type="checkbox" id="checkbox" />
  41. <div class="slider round"></div>
  42. </label>
  43. </div>
  44. <a class="navbar-item" href="https://github.com/jmonkeyengine/wiki">Github</a>
  45. </div>
  46. </div>
  47. </nav>
  48. </header>
  49. <div class="body">
  50. <div class="nav-container" data-component="docs" data-version="3.4">
  51. <aside class="nav">
  52. <div class="panels">
  53. <div class="nav-panel-menu is-active" data-panel="menu">
  54. <nav class="nav-menu">
  55. <h3 class="title"><a href="../../../documentation.html">JME</a></h3>
  56. <ul class="nav-list">
  57. <li class="nav-item" data-depth="0">
  58. <ul class="nav-list">
  59. <li class="nav-item" data-depth="1">
  60. <a class="nav-link" href="../../../documentation.html">Getting Started</a>
  61. </li>
  62. <li class="nav-item" data-depth="1">
  63. <a class="nav-link" href="https://javadoc.jmonkeyengine.org/v3.4.1-stable">JavaDoc</a>
  64. </li>
  65. <li class="nav-item" data-depth="1">
  66. <a class="nav-link" href="../../../release.html">Release Guide</a>
  67. </li>
  68. </ul>
  69. </li>
  70. <li class="nav-item" data-depth="0">
  71. <ul class="nav-list">
  72. <li class="nav-item" data-depth="1">
  73. <button class="nav-item-toggle"></button>
  74. <a class="nav-link" href="../../../tutorials/beginner/beginner.html">Beginner Tutorials</a>
  75. <ul class="nav-list">
  76. <li class="nav-item" data-depth="2">
  77. <a class="nav-link" href="../../../tutorials/beginner/hello_simpleapplication.html">Hello SimpleApplication</a>
  78. </li>
  79. <li class="nav-item" data-depth="2">
  80. <a class="nav-link" href="../../../tutorials/beginner/hello_node.html">Hello Node</a>
  81. </li>
  82. <li class="nav-item" data-depth="2">
  83. <a class="nav-link" href="../../../tutorials/beginner/hello_asset.html">Hello Asset</a>
  84. </li>
  85. <li class="nav-item" data-depth="2">
  86. <a class="nav-link" href="../../../tutorials/beginner/hello_main_event_loop.html">Hello Update Loop</a>
  87. </li>
  88. <li class="nav-item" data-depth="2">
  89. <a class="nav-link" href="../../../tutorials/beginner/hello_input_system.html">Hello Input System</a>
  90. </li>
  91. <li class="nav-item" data-depth="2">
  92. <a class="nav-link" href="../../../tutorials/beginner/hello_material.html">Hello Material</a>
  93. </li>
  94. <li class="nav-item" data-depth="2">
  95. <a class="nav-link" href="../../../tutorials/beginner/hello_animation.html">Hello Animation</a>
  96. </li>
  97. <li class="nav-item" data-depth="2">
  98. <a class="nav-link" href="../../../tutorials/beginner/hello_picking.html">Hello Picking</a>
  99. </li>
  100. <li class="nav-item" data-depth="2">
  101. <a class="nav-link" href="../../../tutorials/beginner/hello_collision.html">Hello Collision</a>
  102. </li>
  103. <li class="nav-item" data-depth="2">
  104. <a class="nav-link" href="../../../tutorials/beginner/hello_terrain.html">Hello Terrain</a>
  105. </li>
  106. <li class="nav-item" data-depth="2">
  107. <a class="nav-link" href="../../../tutorials/beginner/hello_audio.html">Hello Audio</a>
  108. </li>
  109. <li class="nav-item" data-depth="2">
  110. <a class="nav-link" href="../../../tutorials/beginner/hello_effects.html">Hello Effects</a>
  111. </li>
  112. <li class="nav-item" data-depth="2">
  113. <a class="nav-link" href="../../../tutorials/beginner/hello_physics.html">Hello Physics</a>
  114. </li>
  115. </ul>
  116. </li>
  117. <li class="nav-item" data-depth="1">
  118. <button class="nav-item-toggle"></button>
  119. <span class="nav-text">Key Concepts</span>
  120. <ul class="nav-list">
  121. <li class="nav-item" data-depth="2">
  122. <a class="nav-link" href="../../../tutorials/concepts/best_practices.html">Best Practices</a>
  123. </li>
  124. <li class="nav-item" data-depth="2">
  125. <a class="nav-link" href="../../../tutorials/concepts/optimization.html">Optimization</a>
  126. </li>
  127. <li class="nav-item" data-depth="2">
  128. <a class="nav-link" href="../../../tutorials/concepts/faq.html">Frequently Asked Questions</a>
  129. </li>
  130. <li class="nav-item" data-depth="2">
  131. <a class="nav-link" href="../../../tutorials/concepts/math_for_dummies.html">Math for Dummies</a>
  132. </li>
  133. <li class="nav-item" data-depth="2">
  134. <a class="nav-link" href="../../../tutorials/concepts/math.html">Math overview</a>
  135. </li>
  136. <li class="nav-item" data-depth="2">
  137. <a class="nav-link" href="../../../tutorials/concepts/math_cheet_sheet.html">3D math "cheat sheet"</a>
  138. </li>
  139. <li class="nav-item" data-depth="2">
  140. <a class="nav-link" href="../../../tutorials/concepts/rotate.html">3-D Rotation</a>
  141. </li>
  142. <li class="nav-item" data-depth="2">
  143. <a class="nav-link" href="../../../tutorials/concepts/math_video_tutorials.html">Math video tutorial series</a>
  144. </li>
  145. <li class="nav-item" data-depth="2">
  146. <a class="nav-link" href="../../../tutorials/concepts/multi-media_asset_pipeline.html">Multi-Media Asset Pipeline</a>
  147. </li>
  148. <li class="nav-item" data-depth="2">
  149. <a class="nav-link" href="../../../tutorials/concepts/the_scene_graph.html">The Scene Graph</a>
  150. </li>
  151. <li class="nav-item" data-depth="2">
  152. <a class="nav-link" href="../../../tutorials/concepts/scenegraph_for_dummies.html">Scene Graph for Dummies</a>
  153. </li>
  154. <li class="nav-item" data-depth="2">
  155. <a class="nav-link" href="../../../tutorials/concepts/terminology.html">3D Graphics Terminology</a>
  156. </li>
  157. <li class="nav-item" data-depth="2">
  158. <a class="nav-link" href="../../../tutorials/concepts/transparency_sorting.html">Transparency Sorting</a>
  159. </li>
  160. </ul>
  161. </li>
  162. <li class="nav-item" data-depth="1">
  163. <button class="nav-item-toggle"></button>
  164. <span class="nav-text">Articles and How-to&#8217;s</span>
  165. <ul class="nav-list">
  166. <li class="nav-item" data-depth="2">
  167. <button class="nav-item-toggle"></button>
  168. <span class="nav-text">How to Model</span>
  169. <ul class="nav-list">
  170. <li class="nav-item" data-depth="3">
  171. <a class="nav-link" href="../../../tutorials/how-to/modeling/3dsmax/3dsmax.html">3dsmax</a>
  172. </li>
  173. <li class="nav-item" data-depth="3">
  174. <button class="nav-item-toggle"></button>
  175. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/blender.html">Blender</a>
  176. <ul class="nav-list">
  177. <li class="nav-item" data-depth="4">
  178. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/blender_buffer_clearing.html">Buffer Clearing</a>
  179. </li>
  180. <li class="nav-item" data-depth="4">
  181. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/blender_gltf.html">Export as GlTF</a>
  182. </li>
  183. <li class="nav-item" data-depth="4">
  184. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/blender_ogre_export.html">Export as Ogre XML</a>
  185. </li>
  186. <li class="nav-item" data-depth="4">
  187. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/blender_ogre_compatibility.html">Ogre Compatibility</a>
  188. </li>
  189. <li class="nav-item" data-depth="4">
  190. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/makehuman.html">MakeHuman</a>
  191. </li>
  192. <li class="nav-item" data-depth="4">
  193. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/makehuman_blender_ogrexml_toolchain.html">MakeHuman toolchain</a>
  194. </li>
  195. </ul>
  196. </li>
  197. </ul>
  198. </li>
  199. <li class="nav-item" data-depth="2">
  200. <button class="nav-item-toggle"></button>
  201. <span class="nav-text">How to Animate</span>
  202. <ul class="nav-list">
  203. <li class="nav-item" data-depth="3">
  204. <button class="nav-item-toggle"></button>
  205. <span class="nav-text">Mixamo</span>
  206. <ul class="nav-list">
  207. <li class="nav-item" data-depth="4">
  208. <a class="nav-link" href="../../../tutorials/how-to/modeling/blender/mixamo.html">Blender Models</a>
  209. </li>
  210. <li class="nav-item" data-depth="4">
  211. <button class="nav-item-toggle"></button>
  212. <span class="nav-text">Video</span>
  213. <ul class="nav-list">
  214. <li class="nav-item" data-depth="5">
  215. <a class="nav-link" href="https://youtu.be/jHgAgTWIers?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS">Part 1- Download Model</a>
  216. </li>
  217. <li class="nav-item" data-depth="5">
  218. <a class="nav-link" href="https://youtu.be/GQJSrOpNQwI?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS">Part 2- Rig and Animate</a>
  219. </li>
  220. <li class="nav-item" data-depth="5">
  221. <a class="nav-link" href="https://youtu.be/JzRe2Dxbcmc?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS">Part 3- Import to JME</a>
  222. </li>
  223. <li class="nav-item" data-depth="5">
  224. <a class="nav-link" href="https://youtu.be/8wwDRDJop7k?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS">Part 4- Play Animation</a>
  225. </li>
  226. </ul>
  227. </li>
  228. </ul>
  229. </li>
  230. </ul>
  231. </li>
  232. <li class="nav-item" data-depth="2">
  233. <a class="nav-link" href="../../../tutorials/how-to/debugging.html">Debugging with Wireframes</a>
  234. </li>
  235. <li class="nav-item" data-depth="2">
  236. <a class="nav-link" href="../../../tutorials/how-to/util/free_skymaps.html">How to create free skymaps</a>
  237. </li>
  238. <li class="nav-item" data-depth="2">
  239. <button class="nav-item-toggle"></button>
  240. <span class="nav-text">Java Tips</span>
  241. <ul class="nav-list">
  242. <li class="nav-item" data-depth="3">
  243. <a class="nav-link" href="../../../tutorials/how-to/java/localization.html">Localization</a>
  244. </li>
  245. <li class="nav-item" data-depth="3">
  246. <a class="nav-link" href="../../../tutorials/how-to/java/swing_canvas.html">Swing Canvas</a>
  247. </li>
  248. <li class="nav-item" data-depth="3">
  249. <a class="nav-link" href="../../../tutorials/how-to/java/logging.html">Logging</a>
  250. </li>
  251. <li class="nav-item" data-depth="3">
  252. <a class="nav-link" href="../../../tutorials/how-to/java/read_graphic_card_capabilites.html">Read Graphics Capabilities</a>
  253. </li>
  254. </ul>
  255. </li>
  256. <li class="nav-item" data-depth="2">
  257. <button class="nav-item-toggle"></button>
  258. <span class="nav-text">Articles</span>
  259. <ul class="nav-list">
  260. <li class="nav-item" data-depth="3">
  261. <button class="nav-item-toggle"></button>
  262. <span class="nav-text">Physically Based Rendering</span>
  263. <ul class="nav-list">
  264. <li class="nav-item" data-depth="4">
  265. <a class="nav-link" href="../../../tutorials/how-to/articles/pbr/pbr_part1.html">PBR – Part one</a>
  266. </li>
  267. <li class="nav-item" data-depth="4">
  268. <a class="nav-link" href="../../../tutorials/how-to/articles/pbr/pbr_part2.html">PBR – Part two</a>
  269. </li>
  270. <li class="nav-item" data-depth="4">
  271. <a class="nav-link" href="../../../tutorials/how-to/articles/pbr/pbr_part3.html">PBR – Part three</a>
  272. </li>
  273. </ul>
  274. </li>
  275. </ul>
  276. </li>
  277. </ul>
  278. </li>
  279. </ul>
  280. </li>
  281. <li class="nav-item" data-depth="0">
  282. <ul class="nav-list">
  283. <li class="nav-item" data-depth="1">
  284. <button class="nav-item-toggle"></button>
  285. <span class="nav-text">Core Engine</span>
  286. <ul class="nav-list">
  287. <li class="nav-item" data-depth="2">
  288. <a class="nav-link" href="../simpleapplication.html">SimpleApplication</a>
  289. </li>
  290. <li class="nav-item" data-depth="2">
  291. <a class="nav-link" href="../../system/appsettings.html">AppSettings</a>
  292. </li>
  293. </ul>
  294. </li>
  295. <li class="nav-item" data-depth="1">
  296. <button class="nav-item-toggle"></button>
  297. <span class="nav-text">Controlling Game Logic</span>
  298. <ul class="nav-list">
  299. <li class="nav-item" data-depth="2">
  300. <a class="nav-link" href="../update_loop.html">Update Loop</a>
  301. </li>
  302. <li class="nav-item is-current-page" data-depth="2">
  303. <a class="nav-link" href="application_states.html">Application States</a>
  304. </li>
  305. <li class="nav-item" data-depth="2">
  306. <button class="nav-item-toggle"></button>
  307. <a class="nav-link" href="../../scene/control/custom_controls.html">Custom Controls</a>
  308. <ul class="nav-list">
  309. <li class="nav-item" data-depth="3">
  310. <button class="nav-item-toggle"></button>
  311. <span class="nav-text">Video</span>
  312. <ul class="nav-list">
  313. <li class="nav-item" data-depth="4">
  314. <a class="nav-link" href="https://www.youtube.com/watch?v=MNDiZ9YHIpM">Control any scene node</a>
  315. </li>
  316. <li class="nav-item" data-depth="4">
  317. <a class="nav-link" href="https://www.youtube.com/watch?v=-OzRZscLlHY">Control a character</a>
  318. </li>
  319. <li class="nav-item" data-depth="4">
  320. <a class="nav-link" href="https://wiki.jmonkeyengine.org/Scenes/SDK-UsecaseDemo_1.zip">Video Source Code</a>
  321. </li>
  322. </ul>
  323. </li>
  324. </ul>
  325. </li>
  326. <li class="nav-item" data-depth="2">
  327. <a class="nav-link" href="../multithreading.html">Multithreading</a>
  328. </li>
  329. </ul>
  330. </li>
  331. <li class="nav-item" data-depth="1">
  332. <button class="nav-item-toggle"></button>
  333. <span class="nav-text">Scene Graph</span>
  334. <ul class="nav-list">
  335. <li class="nav-item" data-depth="2">
  336. <a class="nav-link" href="../../scene/traverse_scenegraph.html">Traverse SceneGraph</a>
  337. </li>
  338. <li class="nav-item" data-depth="2">
  339. <a class="nav-link" href="../../scene/spatial.html">Spatial: Node vs Geometry</a>
  340. </li>
  341. <li class="nav-item" data-depth="2">
  342. <button class="nav-item-toggle"></button>
  343. <a class="nav-link" href="../../scene/mesh.html">Mesh</a>
  344. <ul class="nav-list">
  345. <li class="nav-item" data-depth="3">
  346. <a class="nav-link" href="../../scene/custom_meshes.html">Custom Meshes</a>
  347. </li>
  348. <li class="nav-item" data-depth="3">
  349. <a class="nav-link" href="../../scene/shape/shape.html">Shape</a>
  350. </li>
  351. <li class="nav-item" data-depth="3">
  352. <a class="nav-link" href="../../scene/3d_models.html">3D Models</a>
  353. </li>
  354. </ul>
  355. </li>
  356. <li class="nav-item" data-depth="2">
  357. <a class="nav-link" href="../../asset/asset_manager.html">Asset Manager</a>
  358. </li>
  359. <li class="nav-item" data-depth="2">
  360. <a class="nav-link" href="../../export/save_and_load.html">Saving and Loading Nodes</a>
  361. </li>
  362. <li class="nav-item" data-depth="2">
  363. <a class="nav-link" href="../../collision/collision_and_intersection.html">Collision and Intersection</a>
  364. </li>
  365. <li class="nav-item" data-depth="2">
  366. <a class="nav-link" href="../../scene/control/level_of_detail.html">Level of Detail</a>
  367. </li>
  368. </ul>
  369. </li>
  370. <li class="nav-item" data-depth="1">
  371. <button class="nav-item-toggle"></button>
  372. <span class="nav-text">Animation, Scene</span>
  373. <ul class="nav-list">
  374. <li class="nav-item" data-depth="2">
  375. <a class="nav-link" href="../../animation/animation.html">Animation-Old</a>
  376. </li>
  377. <li class="nav-item" data-depth="2">
  378. <a class="nav-link" href="../../cinematic/cinematics.html">Cinematics (cutscenes, fake destruction physics)</a>
  379. </li>
  380. <li class="nav-item" data-depth="2">
  381. <a class="nav-link" href="../../cinematic/motionpath.html">MotionPaths and Waypoints</a>
  382. </li>
  383. </ul>
  384. </li>
  385. <li class="nav-item" data-depth="1">
  386. <button class="nav-item-toggle"></button>
  387. <span class="nav-text">Material, Light, Shadow</span>
  388. <ul class="nav-list">
  389. <li class="nav-item" data-depth="2">
  390. <a class="nav-link" href="../../material/how_to_use_materials.html">How to use Materials</a>
  391. </li>
  392. <li class="nav-item" data-depth="2">
  393. <a class="nav-link" href="../../material/j3m_material_files.html">.j3m Material Files</a>
  394. </li>
  395. <li class="nav-item" data-depth="2">
  396. <a class="nav-link" href="../../material/material_definitions.html">.j3md Material Definitions</a>
  397. </li>
  398. <li class="nav-item" data-depth="2">
  399. <a class="nav-link" href="../../material/materials_overview.html">.j3md Properties</a>
  400. </li>
  401. <li class="nav-item" data-depth="2">
  402. <a class="nav-link" href="../../shader/jme3_shaders.html">Shaders and JME3</a>
  403. </li>
  404. <li class="nav-item" data-depth="2">
  405. <a class="nav-link" href="../../shader/jme3_shadernodes.html">Shader Node System</a>
  406. </li>
  407. <li class="nav-item" data-depth="2">
  408. <a class="nav-link" href="../../shader/shader_video_tutorials.html">Shader Video Tutorials</a>
  409. </li>
  410. <li class="nav-item" data-depth="2">
  411. <a class="nav-link" href="../../light/light_and_shadow.html">Light and Shadow</a>
  412. </li>
  413. <li class="nav-item" data-depth="2">
  414. <a class="nav-link" href="../../texture/anisotropic_filtering.html">Anisotropic Filtering</a>
  415. </li>
  416. <li class="nav-item" data-depth="2">
  417. <a class="nav-link" href="../../system/jme3_srgbpipeline.html">Gamma Correction</a>
  418. </li>
  419. </ul>
  420. </li>
  421. <li class="nav-item" data-depth="1">
  422. <button class="nav-item-toggle"></button>
  423. <span class="nav-text">Audio, Video</span>
  424. <ul class="nav-list">
  425. <li class="nav-item" data-depth="2">
  426. <a class="nav-link" href="../../audio/audio.html">Playing Sounds</a>
  427. </li>
  428. <li class="nav-item" data-depth="2">
  429. <a class="nav-link" href="../../audio/audio_environment_presets.html">Audio Environment Presets</a>
  430. </li>
  431. <li class="nav-item" data-depth="2">
  432. <a class="nav-link" href="screenshots.html">Capture Screenshots</a>
  433. </li>
  434. <li class="nav-item" data-depth="2">
  435. <a class="nav-link" href="capture_audio_video_to_a_file.html">Capture Audio/Video</a>
  436. </li>
  437. </ul>
  438. </li>
  439. <li class="nav-item" data-depth="1">
  440. <button class="nav-item-toggle"></button>
  441. <span class="nav-text">Filter, Effect</span>
  442. <ul class="nav-list">
  443. <li class="nav-item" data-depth="2">
  444. <a class="nav-link" href="../../effect/effects_overview.html">Overview</a>
  445. </li>
  446. <li class="nav-item" data-depth="2">
  447. <a class="nav-link" href="../../effect/bloom_and_glow.html">Bloom and Glow</a>
  448. </li>
  449. <li class="nav-item" data-depth="2">
  450. <a class="nav-link" href="../../effect/particle_emitters.html">Particle Emitters</a>
  451. </li>
  452. </ul>
  453. </li>
  454. <li class="nav-item" data-depth="1">
  455. <button class="nav-item-toggle"></button>
  456. <span class="nav-text">Landscapes</span>
  457. <ul class="nav-list">
  458. <li class="nav-item" data-depth="2">
  459. <a class="nav-link" href="../../util/sky.html">Sky</a>
  460. </li>
  461. <li class="nav-item" data-depth="2">
  462. <a class="nav-link" href="../../terrain/terrain.html">Terrain (TerraMonkey)</a>
  463. </li>
  464. <li class="nav-item" data-depth="2">
  465. <a class="nav-link" href="../../collision/terrain_collision.html">Terrain Collision</a>
  466. </li>
  467. <li class="nav-item" data-depth="2">
  468. <a class="nav-link" href="../../effect/water.html">Simple Water</a>
  469. </li>
  470. <li class="nav-item" data-depth="2">
  471. <a class="nav-link" href="../../effect/post-processor_water.html">Post-Processor Water</a>
  472. </li>
  473. </ul>
  474. </li>
  475. <li class="nav-item" data-depth="1">
  476. <button class="nav-item-toggle"></button>
  477. <span class="nav-text">Camera</span>
  478. <ul class="nav-list">
  479. <li class="nav-item" data-depth="2">
  480. <a class="nav-link" href="../../renderer/camera.html">Camera</a>
  481. </li>
  482. <li class="nav-item" data-depth="2">
  483. <a class="nav-link" href="../../renderer/making_the_camera_follow_a_character.html">Follow a Character</a>
  484. </li>
  485. <li class="nav-item" data-depth="2">
  486. <a class="nav-link" href="../../renderer/remote-controlling_the_camera.html">Remote-Controlling</a>
  487. </li>
  488. <li class="nav-item" data-depth="2">
  489. <a class="nav-link" href="../../renderer/multiple_camera_views.html">Multiple Camera Views</a>
  490. </li>
  491. <li class="nav-item" data-depth="2">
  492. <a class="nav-link" href="../../renderer/jme3_renderbuckets.html">Render Buckets</a>
  493. </li>
  494. </ul>
  495. </li>
  496. <li class="nav-item" data-depth="1">
  497. <button class="nav-item-toggle"></button>
  498. <span class="nav-text">User Interaction</span>
  499. <ul class="nav-list">
  500. <li class="nav-item" data-depth="2">
  501. <a class="nav-link" href="../../input/input_handling.html">Input Handling</a>
  502. </li>
  503. <li class="nav-item" data-depth="2">
  504. <a class="nav-link" href="../../input/combo_moves.html">Combo Moves</a>
  505. </li>
  506. <li class="nav-item" data-depth="2">
  507. <a class="nav-link" href="../../input/mouse_picking.html">Mouse Picking</a>
  508. </li>
  509. </ul>
  510. </li>
  511. <li class="nav-item" data-depth="1">
  512. <button class="nav-item-toggle"></button>
  513. <a class="nav-link" href="../../gui/topic_gui.html">Graphical User Interface</a>
  514. <ul class="nav-list">
  515. <li class="nav-item" data-depth="2">
  516. <button class="nav-item-toggle"></button>
  517. <span class="nav-text">Nifty GUI</span>
  518. <ul class="nav-list">
  519. <li class="nav-item" data-depth="3">
  520. <a class="nav-link" href="../../gui/nifty_gui.html">Integration Tutorial</a>
  521. </li>
  522. <li class="nav-item" data-depth="3">
  523. <a class="nav-link" href="../../gui/nifty_gui_best_practices.html">Best Practices</a>
  524. </li>
  525. <li class="nav-item" data-depth="3">
  526. <a class="nav-link" href="../../gui/nifty_gui_scenarios.html">Scenarios</a>
  527. </li>
  528. </ul>
  529. </li>
  530. <li class="nav-item" data-depth="2">
  531. <a class="nav-link" href="../../ui/hud.html">Head-Up Display (HUD)</a>
  532. </li>
  533. </ul>
  534. </li>
  535. <li class="nav-item" data-depth="1">
  536. <button class="nav-item-toggle"></button>
  537. <span class="nav-text">Virtual Reality</span>
  538. <ul class="nav-list">
  539. <li class="nav-item" data-depth="2">
  540. <a class="nav-link" href="../../vr/virtualreality.html">Virtual Reality</a>
  541. </li>
  542. <li class="nav-item" data-depth="2">
  543. <a class="nav-link" href="../../vr/virtualrealitycontrollers.html">Virtual Reality Controllers</a>
  544. </li>
  545. </ul>
  546. </li>
  547. </ul>
  548. </li>
  549. <li class="nav-item" data-depth="0">
  550. <ul class="nav-list">
  551. <li class="nav-item" data-depth="1">
  552. <button class="nav-item-toggle"></button>
  553. <a class="nav-link" href="../../../physics/physics.html">Physics</a>
  554. <ul class="nav-list">
  555. <li class="nav-item" data-depth="2">
  556. <a class="nav-link" href="../../../physics/bullet_multithreading.html">Multi-Threaded Physics</a>
  557. </li>
  558. <li class="nav-item" data-depth="2">
  559. <a class="nav-link" href="../../../physics/collision/physics_listeners.html">Collision Detection</a>
  560. </li>
  561. <li class="nav-item" data-depth="2">
  562. <a class="nav-link" href="../../../physics/joint/hinges_and_joints.html">Hinges and Joints</a>
  563. </li>
  564. <li class="nav-item" data-depth="2">
  565. <a class="nav-link" href="../../../physics/control/walking_character.html">Walking Character</a>
  566. </li>
  567. <li class="nav-item" data-depth="2">
  568. <a class="nav-link" href="../../../physics/control/ragdoll.html">Ragdoll</a>
  569. </li>
  570. <li class="nav-item" data-depth="2">
  571. <a class="nav-link" href="../../../physics/control/vehicles.html">Vehicles</a>
  572. </li>
  573. <li class="nav-item" data-depth="2">
  574. <a class="nav-link" href="../../../physics/control/softbody.html">Softbody</a>
  575. </li>
  576. <li class="nav-item" data-depth="2">
  577. <a class="nav-link" href="../../../physics/bullet_pitfalls.html">Bullet Physics Pitfalls</a>
  578. </li>
  579. </ul>
  580. </li>
  581. </ul>
  582. </li>
  583. <li class="nav-item" data-depth="0">
  584. <ul class="nav-list">
  585. <li class="nav-item" data-depth="1">
  586. <button class="nav-item-toggle"></button>
  587. <span class="nav-text">Networking</span>
  588. <ul class="nav-list">
  589. <li class="nav-item" data-depth="2">
  590. <a class="nav-link" href="../../../networking/networking.html">Networking (SpiderMonkey)</a>
  591. </li>
  592. <li class="nav-item" data-depth="2">
  593. <a class="nav-link" href="../../../networking/headless_server.html">Headless Server</a>
  594. </li>
  595. <li class="nav-item" data-depth="2">
  596. <a class="nav-link" href="../../../networking/monkey_zone.html">Multi-Player Demo Code</a>
  597. </li>
  598. <li class="nav-item" data-depth="2">
  599. <a class="nav-link" href="../../../networking/networking_video_tutorials.html">Networking Video Tutorials</a>
  600. </li>
  601. </ul>
  602. </li>
  603. </ul>
  604. </li>
  605. <li class="nav-item" data-depth="0">
  606. <ul class="nav-list">
  607. <li class="nav-item" data-depth="1">
  608. <button class="nav-item-toggle"></button>
  609. <span class="nav-text">User Contributions</span>
  610. <ul class="nav-list">
  611. <li class="nav-item" data-depth="2">
  612. <a class="nav-link" href="../../../contributions/contributions.html">User Made Utilities</a>
  613. </li>
  614. <li class="nav-item" data-depth="2">
  615. <button class="nav-item-toggle"></button>
  616. <span class="nav-text">Shader</span>
  617. <ul class="nav-list">
  618. <li class="nav-item" data-depth="3">
  619. <a class="nav-link" href="../../../contributions/shader/shaderblow_project.html">ShaderBlow Project</a>
  620. </li>
  621. </ul>
  622. </li>
  623. <li class="nav-item" data-depth="2">
  624. <button class="nav-item-toggle"></button>
  625. <span class="nav-text">Landscapes</span>
  626. <ul class="nav-list">
  627. <li class="nav-item" data-depth="3">
  628. <a class="nav-link" href="../../../contributions/lanscapes/vegetationsystem/vegetationsystem.html">Vegetation System</a>
  629. </li>
  630. </ul>
  631. </li>
  632. <li class="nav-item" data-depth="2">
  633. <button class="nav-item-toggle"></button>
  634. <span class="nav-text">Networking</span>
  635. <ul class="nav-list">
  636. <li class="nav-item" data-depth="3">
  637. <a class="nav-link" href="../../../contributions/networking/open_game_finder.html">Open Game Finder</a>
  638. </li>
  639. </ul>
  640. </li>
  641. <li class="nav-item" data-depth="2">
  642. <button class="nav-item-toggle"></button>
  643. <span class="nav-text">Entity System</span>
  644. <ul class="nav-list">
  645. <li class="nav-item" data-depth="3">
  646. <a class="nav-link" href="#es/entitysystem.adoc">The Zay-ES Entity System</a>
  647. </li>
  648. </ul>
  649. </li>
  650. <li class="nav-item" data-depth="2">
  651. <button class="nav-item-toggle"></button>
  652. <span class="nav-text">Artificial Intelligence</span>
  653. <ul class="nav-list">
  654. <li class="nav-item" data-depth="3">
  655. <a class="nav-link" href="../../../contributions/ai/recast.html">Recast Navigation</a>
  656. </li>
  657. <li class="nav-item" data-depth="3">
  658. <a class="nav-link" href="../../../contributions/ai/building_recast.html">Updating and building Recast Native Bindings</a>
  659. </li>
  660. <li class="nav-item" data-depth="3">
  661. <a class="nav-link" href="../../../contributions/ai/monkey_brains.html">Monkey Brains</a>
  662. </li>
  663. <li class="nav-item" data-depth="3">
  664. <a class="nav-link" href="../../../contributions/ai/steer_behaviours.html">Steer Behaviours</a>
  665. </li>
  666. <li class="nav-item" data-depth="3">
  667. <a class="nav-link" href="../../../contributions/ai/jme3_ai.html">jME3 Artificial Intelligence</a>
  668. </li>
  669. </ul>
  670. </li>
  671. <li class="nav-item" data-depth="2">
  672. <button class="nav-item-toggle"></button>
  673. <a class="nav-link" href="../../../contributions/gui/topic_contributions_gui.html">GUI</a>
  674. <ul class="nav-list">
  675. <li class="nav-item" data-depth="3">
  676. <a class="nav-link" href="../../../contributions/contributions.html#lemur-gui-library">Lemur - a native jME3 GUI library with scene graph tools</a>
  677. </li>
  678. <li class="nav-item" data-depth="3">
  679. <a class="nav-link" href="../../../contributions/contributions.html#tonegodgui">tonegodGUI - a native jME3 GUI library</a>
  680. </li>
  681. <li class="nav-item" data-depth="3">
  682. <a class="nav-link" href="../../../contributions/contributions.html#immediate-graphical-user-interface">Immediate graphical user interface</a>
  683. </li>
  684. </ul>
  685. </li>
  686. <li class="nav-item" data-depth="2">
  687. <button class="nav-item-toggle"></button>
  688. <span class="nav-text">Tools</span>
  689. <ul class="nav-list">
  690. <li class="nav-item" data-depth="3">
  691. <a class="nav-link" href="../../../contributions/tools/navigation.html">Mercator Projection Tool (Marine Navigation)</a>
  692. </li>
  693. <li class="nav-item" data-depth="3">
  694. <a class="nav-link" href="../../../contributions/tools/charts.html">Visualizing Maps in JME3 (Marine Charts)</a>
  695. </li>
  696. </ul>
  697. </li>
  698. <li class="nav-item" data-depth="2">
  699. <button class="nav-item-toggle"></button>
  700. <span class="nav-text">Projects</span>
  701. <ul class="nav-list">
  702. <li class="nav-item" data-depth="3">
  703. <a class="nav-link" href="../../../contributions/projects/rise_of_mutants_project.html">Rise of Mutants Project</a>
  704. </li>
  705. </ul>
  706. </li>
  707. </ul>
  708. </li>
  709. </ul>
  710. </li>
  711. <li class="nav-item" data-depth="0">
  712. <ul class="nav-list">
  713. <li class="nav-item" data-depth="1">
  714. <button class="nav-item-toggle"></button>
  715. <a class="nav-link" href="../../../sdk/sdk.html">SDK</a>
  716. <ul class="nav-list">
  717. <li class="nav-item" data-depth="2">
  718. <button class="nav-item-toggle"></button>
  719. <span class="nav-text">Video Tutorials</span>
  720. <ul class="nav-list">
  721. <li class="nav-item" data-depth="3">
  722. <button class="nav-item-toggle"></button>
  723. <span class="nav-text">SDK Use Case Tutorials</span>
  724. <ul class="nav-list">
  725. <li class="nav-item" data-depth="4">
  726. <a class="nav-link" href="http://www.youtube.com/watch?v=-OzRZscLlHY">Demo 1 (Quixote demo)</a>
  727. </li>
  728. <li class="nav-item" data-depth="4">
  729. <a class="nav-link" href="http://www.youtube.com/watch?v=6-YWxD3JByE">Demo 2 (Models and Materials)</a>
  730. </li>
  731. </ul>
  732. </li>
  733. <li class="nav-item" data-depth="3">
  734. <button class="nav-item-toggle"></button>
  735. <span class="nav-text">SDK Tutorials</span>
  736. <ul class="nav-list">
  737. <li class="nav-item" data-depth="4">
  738. <a class="nav-link" href="http://www.youtube.com/watch?v=M1_0pbeyJzI">Basics</a>
  739. </li>
  740. <li class="nav-item" data-depth="4">
  741. <a class="nav-link" href="http://www.youtube.com/watch?v=nL7woH40i5c">Importing Models</a>
  742. </li>
  743. <li class="nav-item" data-depth="4">
  744. <a class="nav-link" href="http://www.youtube.com/watch?v=DUmgAjiNzhY">Dragging&amp;Dropping Nodes</a>
  745. </li>
  746. <li class="nav-item" data-depth="4">
  747. <a class="nav-link" href="http://www.youtube.com/watch?v=ntPAmtsQ6eM">Scene Composing</a>
  748. </li>
  749. <li class="nav-item" data-depth="4">
  750. <a class="nav-link" href="http://www.youtube.com/watch?v=zgPV3W6dD4s">Terrain with Collision Shape</a>
  751. </li>
  752. <li class="nav-item" data-depth="4">
  753. <a class="nav-link" href="http://www.youtube.com/watch?v=Feu3-mrpolc">Working with Materials</a>
  754. </li>
  755. <li class="nav-item" data-depth="4">
  756. <a class="nav-link" href="http://www.youtube.com/watch?v=MNDiZ9YHIpM">Custom Controls</a>
  757. </li>
  758. <li class="nav-item" data-depth="4">
  759. <a class="nav-link" href="http://www.youtube.com/watch?v=oZnssg8TBWQ">WebStart Deployment</a>
  760. </li>
  761. <li class="nav-item" data-depth="4">
  762. <a class="nav-link" href="http://www.youtube.com/watch?v=D7JM4VMKqPc">Animation and Effect TrackEditing</a>
  763. </li>
  764. </ul>
  765. </li>
  766. </ul>
  767. </li>
  768. <li class="nav-item" data-depth="2">
  769. <button class="nav-item-toggle"></button>
  770. <span class="nav-text">Getting Started</span>
  771. <ul class="nav-list">
  772. <li class="nav-item" data-depth="3">
  773. <a class="nav-link" href="../../../sdk/update_center.html">Updating jMonkeyEngine SDK</a>
  774. </li>
  775. <li class="nav-item" data-depth="3">
  776. <a class="nav-link" href="../../../sdk/troubleshooting.html">Troubleshooting</a>
  777. </li>
  778. </ul>
  779. </li>
  780. <li class="nav-item" data-depth="2">
  781. <button class="nav-item-toggle"></button>
  782. <span class="nav-text">Java Development Features</span>
  783. <ul class="nav-list">
  784. <li class="nav-item" data-depth="3">
  785. <a class="nav-link" href="../../../sdk/project_creation.html">Project Creation</a>
  786. </li>
  787. <li class="nav-item" data-depth="3">
  788. <a class="nav-link" href="../../../sdk/code_editor.html">Code Editor and Palette</a>
  789. </li>
  790. <li class="nav-item" data-depth="3">
  791. <a class="nav-link" href="../../../sdk/version_control.html">File Version Control</a>
  792. </li>
  793. <li class="nav-item" data-depth="3">
  794. <a class="nav-link" href="../../../sdk/debugging_profiling_testing.html">Debug, Profile, Test</a>
  795. </li>
  796. <li class="nav-item" data-depth="3">
  797. <button class="nav-item-toggle"></button>
  798. <a class="nav-link" href="../../../sdk/application_deployment.html">Application Deployment</a>
  799. <ul class="nav-list">
  800. <li class="nav-item" data-depth="4">
  801. <a class="nav-link" href="../../../sdk/default_build_script.html">Default Build Script</a>
  802. </li>
  803. <li class="nav-item" data-depth="4">
  804. <a class="nav-link" href="../../../sdk/android.html">Android</a>
  805. </li>
  806. <li class="nav-item" data-depth="4">
  807. <a class="nav-link" href="../../../sdk/android_cheat_sheet.html">Android Cheat Sheet</a>
  808. </li>
  809. <li class="nav-item" data-depth="4">
  810. <a class="nav-link" href="../../../sdk/ios.html">iOS</a>
  811. </li>
  812. </ul>
  813. </li>
  814. </ul>
  815. </li>
  816. <li class="nav-item" data-depth="2">
  817. <button class="nav-item-toggle"></button>
  818. <span class="nav-text">Unique Features</span>
  819. <ul class="nav-list">
  820. <li class="nav-item" data-depth="3">
  821. <button class="nav-item-toggle"></button>
  822. <a class="nav-link" href="../../../sdk/model_loader_and_viewer.html">Import, View, Convert Models</a>
  823. <ul class="nav-list">
  824. <li class="nav-item" data-depth="4">
  825. <a class="nav-link" href="../../../sdk/asset_packs.html">Asset Packs</a>
  826. </li>
  827. </ul>
  828. </li>
  829. <li class="nav-item" data-depth="3">
  830. <a class="nav-link" href="../../../sdk/scene_explorer.html">The SceneExplorer</a>
  831. </li>
  832. <li class="nav-item" data-depth="3">
  833. <a class="nav-link" href="../../../sdk/scene_composer.html">Composing a Scene</a>
  834. </li>
  835. <li class="nav-item" data-depth="3">
  836. <a class="nav-link" href="../../../sdk/terrain_editor.html">Terrain Editor</a>
  837. </li>
  838. <li class="nav-item" data-depth="3">
  839. <a class="nav-link" href="../../../sdk/sample_code.html">Sample Code</a>
  840. </li>
  841. <li class="nav-item" data-depth="3">
  842. <a class="nav-link" href="../../../sdk/material_editing.html">Material Editing</a>
  843. </li>
  844. <li class="nav-item" data-depth="3">
  845. <a class="nav-link" href="../../../sdk/font_creation.html">Creating Bitmap Fonts</a>
  846. </li>
  847. <li class="nav-item" data-depth="3">
  848. <button class="nav-item-toggle"></button>
  849. <a class="nav-link" href="https://hub.jmonkeyengine.org/t/effecttrack-and-audiotrack-editing-in-the-sdk/23378">Audio and Effect Track Editing</a>
  850. <ul class="nav-list">
  851. <li class="nav-item" data-depth="4">
  852. <a class="nav-link" href="https://www.youtube.com/watch?v=D7JM4VMKqPc">Video: Effect and AudioTrack editing in jMonkeyEngine 3 sdk</a>
  853. </li>
  854. </ul>
  855. </li>
  856. <li class="nav-item" data-depth="3">
  857. <a class="nav-link" href="../../../sdk/filters.html">Post-Processor Filter Editor and Viewer</a>
  858. </li>
  859. <li class="nav-item is-current-page" data-depth="3">
  860. <a class="nav-link" href="application_states.html">Application States</a>
  861. </li>
  862. <li class="nav-item" data-depth="3">
  863. <a class="nav-link" href="../../scene/control/custom_controls.html">Custom Controls</a>
  864. </li>
  865. <li class="nav-item" data-depth="3">
  866. <a class="nav-link" href="../../../sdk/vehicle_creator.html">Vehicle Creator</a>
  867. </li>
  868. </ul>
  869. </li>
  870. <li class="nav-item" data-depth="2">
  871. <button class="nav-item-toggle"></button>
  872. <span class="nav-text">Advanced Usage</span>
  873. <ul class="nav-list">
  874. <li class="nav-item" data-depth="3">
  875. <a class="nav-link" href="../../../sdk/build_platform.html">Building jMonkeyEngine SDK</a>
  876. </li>
  877. <li class="nav-item" data-depth="3">
  878. <a class="nav-link" href="../../../sdk/use_own_jme.html#.adoc">Using your own (modified) version of jME3 in jMonkeyEngine SDK</a>
  879. </li>
  880. <li class="nav-item" data-depth="3">
  881. <a class="nav-link" href="../../../sdk/increasing_heap_memory.html">Increasing Heap Memory</a>
  882. </li>
  883. <li class="nav-item" data-depth="3">
  884. <a class="nav-link" href="../../../sdk/log_files.html">Log Files</a>
  885. </li>
  886. </ul>
  887. </li>
  888. <li class="nav-item" data-depth="2">
  889. <button class="nav-item-toggle"></button>
  890. <span class="nav-text">Available external plugins</span>
  891. <ul class="nav-list">
  892. <li class="nav-item" data-depth="3">
  893. <a class="nav-link" href="../../../contributions/contributions.html">Contributions</a>
  894. </li>
  895. <li class="nav-item" data-depth="3">
  896. <a class="nav-link" href="../../../sdk/neotexture.html">Neo Texture Editor for procedural textures</a>
  897. </li>
  898. <li class="nav-item" data-depth="3">
  899. <a class="nav-link" href="http://www.youtube.com/watch?v=yS9a9o4WzL8">Video: Mesh Tool &amp; Physics Editor</a>
  900. </li>
  901. </ul>
  902. </li>
  903. <li class="nav-item" data-depth="2">
  904. <button class="nav-item-toggle"></button>
  905. <a class="nav-link" href="../../../sdk/development.html">Developing plugins for jMonkeyEngine SDK</a>
  906. <ul class="nav-list">
  907. <li class="nav-item" data-depth="3">
  908. <a class="nav-link" href="../../../sdk/development/setup.html">Creating a plugin</a>
  909. </li>
  910. <li class="nav-item" data-depth="3">
  911. <a class="nav-link" href="../../../sdk/development/general.html">Creating components</a>
  912. </li>
  913. <li class="nav-item" data-depth="3">
  914. <a class="nav-link" href="../../../sdk/development/scene.html">The Main Scene</a>
  915. </li>
  916. <li class="nav-item" data-depth="3">
  917. <a class="nav-link" href="../../../sdk/development/sceneexplorer.html">The Scene Explorer</a>
  918. </li>
  919. <li class="nav-item" data-depth="3">
  920. <a class="nav-link" href="../../../sdk/development/projects_assets.html">Projects and Assets</a>
  921. </li>
  922. <li class="nav-item" data-depth="3">
  923. <a class="nav-link" href="../../../sdk/development/extension_library.html">Create a library plugin from a jar file</a>
  924. </li>
  925. <li class="nav-item" data-depth="3">
  926. <a class="nav-link" href="../../../sdk/development/model_loader.html">Create a new or custom model filetype and loader</a>
  927. </li>
  928. </ul>
  929. </li>
  930. </ul>
  931. </li>
  932. </ul>
  933. </li>
  934. </ul>
  935. </nav>
  936. </div>
  937. <div class="nav-panel-explore" data-panel="explore">
  938. <div class="context">
  939. <span class="title">JME</span>
  940. <span class="version">3.4</span>
  941. </div>
  942. <ul class="components">
  943. <li class="component is-current">
  944. <span class="title">JME</span>
  945. <ul class="versions">
  946. <li class="version">
  947. <a href="../../../../3.8/documentation.html">3.8</a>
  948. </li>
  949. <li class="version is-current">
  950. <a href="../../../documentation.html">3.4</a>
  951. </li>
  952. <li class="version">
  953. <a href="../../../../3.3/documentation.html">3.3</a>
  954. </li>
  955. <li class="version">
  956. <a href="../../../../3.2/documentation.html">3.2</a>
  957. </li>
  958. </ul>
  959. </li>
  960. <li class="component">
  961. <span class="title">Wiki Contribution</span>
  962. <ul class="versions">
  963. <li class="version">
  964. <a href="../../../../../docs-wiki/3.8/wiki_contributor.html">3.8</a>
  965. </li>
  966. </ul>
  967. </li>
  968. <li class="component">
  969. <span class="title">Wiki UI</span>
  970. <ul class="versions">
  971. <li class="version">
  972. <a href="../../../../../wiki-ui/index.html">master</a>
  973. </li>
  974. </ul>
  975. </li>
  976. </ul>
  977. </div>
  978. </div>
  979. </aside>
  980. </div>
  981. <main class="article">
  982. <div class="toolbar" role="navigation">
  983. <button class="nav-toggle"></button>
  984. <nav class="breadcrumbs" aria-label="breadcrumbs">
  985. <ul>
  986. <li><a href="../../../documentation.html">JME</a></li>
  987. <li>Controlling Game Logic</li>
  988. <li><a href="application_states.html">Application States</a></li>
  989. </ul>
  990. </nav>
  991. <div class="page-versions">
  992. <button class="version-menu-toggle" title="Show other versions of page">3.4</button>
  993. <div class="version-menu">
  994. <a class="version" href="../../../../3.8/core/app/state/application_states.html">3.8</a>
  995. <a class="version is-current" href="application_states.html">3.4</a>
  996. <a class="version" href="../../../../3.3/core/app/state/application_states.html">3.3</a>
  997. <a class="version" href="../../../../3.2/core/app/state/application_states.html">3.2</a>
  998. </div>
  999. </div>
  1000. <div class="edit-this-page"><a href="https://github.com/jMonkeyEngine/wiki/edit/v3.4/docs/modules/core/pages/app/state/application_states.adoc">Edit this Page</a></div>
  1001. </div>
  1002. <div class="content">
  1003. <article class="doc">
  1004. <h1 class="page">Application States</h1>
  1005. <div id="preamble">
  1006. <div class="sectionbody">
  1007. <div class="paragraph">
  1008. <p>The <code>com.jme3.app.state.AppState</code> class is a customizable jME3 interface that allows you to control the global game logic, the overall game mechanics. (To control the behaviour of a Spatial, see <a href="../../scene/control/custom_controls.html" class="xref page">Custom Controls</a> instead. Controls and AppStates can be used together.)</p>
  1009. </div>
  1010. </div>
  1011. </div>
  1012. <div class="sect1">
  1013. <h2 id="overview"><a class="anchor" href="#overview"></a>Overview</h2>
  1014. <div class="sectionbody">
  1015. <div class="sect2">
  1016. <h3 id="use-case-examples"><a class="anchor" href="#use-case-examples"></a>Use Case Examples</h3>
  1017. <div class="paragraph">
  1018. <p>There are situations during your game development where you think:</p>
  1019. </div>
  1020. <div class="ulist">
  1021. <ul>
  1022. <li>
  1023. <p>Mouse and key inputs are handled differently in-game versus in the main menu. Can I group a set of input handler settings, and activate and deactivate them all in one step?</p>
  1024. </li>
  1025. <li>
  1026. <p>I have the in-game scene, and a character editor, and a Captain&#8217;s Quarters screen. Can I group a set of nodes and behaviours, and swap them in and out in one step?</p>
  1027. </li>
  1028. <li>
  1029. <p>When I pause the game, I want the character&#8217;s &#8220;idle&#8221; animation to continue, but all other loops and game events should stop. How do I define what happens when the game is paused/unpaused?</p>
  1030. </li>
  1031. <li>
  1032. <p>I have a conditional block that takes up a lot of space in my simpleUpdate() loop. Can I wrap up this block of code, and switch it on and off in one step?</p>
  1033. </li>
  1034. <li>
  1035. <p>Can I package everything that belongs in-game, and everything that belongs to the menu screen, and switch between these two &#8220;big&#8221; states in one step?</p>
  1036. </li>
  1037. </ul>
  1038. </div>
  1039. <div class="paragraph">
  1040. <p>You can! This is what AppStates are there for. An AppState class is subset of (or an extension to) your application. Every AppState class has access to all fields in your main application (AssetManager, ViewPort, StateManager, InputManager, RootNode, GuiNode, etc) and hooks into the main update loop. An AppState can contain:</p>
  1041. </div>
  1042. <div class="ulist">
  1043. <ul>
  1044. <li>
  1045. <p>a subset of class fields, functions, methods (game state data and accessors),</p>
  1046. </li>
  1047. <li>
  1048. <p>a subset of <abbr title="Graphical User Interface">GUI</abbr> elements and their listeners,</p>
  1049. </li>
  1050. <li>
  1051. <p>a subset of input handlers and mappings,</p>
  1052. </li>
  1053. <li>
  1054. <p>a subset of nodes that you load and attach to the rootNode,</p>
  1055. </li>
  1056. <li>
  1057. <p>a subset of conditional actions that you branch to in the simpleUpdate() loop,</p>
  1058. </li>
  1059. <li>
  1060. <p>a subset of other AppStates and Controls</p>
  1061. </li>
  1062. <li>
  1063. <p>… or combinations thereof.</p>
  1064. </li>
  1065. </ul>
  1066. </div>
  1067. </div>
  1068. <div class="sect2">
  1069. <h3 id="supported-features"><a class="anchor" href="#supported-features"></a>Supported Features</h3>
  1070. <div class="paragraph">
  1071. <p>Each AppState lets you define what happens to it in the following situations:</p>
  1072. </div>
  1073. <div class="ulist">
  1074. <ul>
  1075. <li>
  1076. <p><strong>The AppState is initialized:</strong> You load and initialize game data, InputHandlers, AppStates and Controls and attach nodes.<br>
  1077. The AppState executes its own simpleInitApp() method when it is attached, so to speak.</p>
  1078. </li>
  1079. <li>
  1080. <p><strong>The AppState has been enabled (unpaused):</strong> This toggles a boolean isEnabled() to true. Here you attach nodes and listeners that should become active while it&#8217;s running.</p>
  1081. </li>
  1082. <li>
  1083. <p><strong>While the AppState is running/paused:</strong> You can poll isEnabled() to define paused and unpaused game behaviour in the update() loop. In update(), you poll and modify the game state, modify the scene graph, and trigger events. Test if <code>!isEnabled()</code>, and write code that skips the running sections of this AppState&#8217;s <code>update()</code> loop.<br>
  1084. Each AppState has its own update loop, which hooks into the main simpleUpdate() loop (callback).</p>
  1085. </li>
  1086. <li>
  1087. <p><strong>The AppState has been disabled (paused):</strong> This toggles a boolean isEnabled() to false. Here you switch all objects to their specific &#8220;paused&#8221; behaviour.</p>
  1088. </li>
  1089. <li>
  1090. <p><strong>The AppState is cleaned up:</strong> Here you decide what happens when the AppState is detached. Save this AppState&#8217;s game state, unregister Controls and InputHandlers, detach related AppStates, detach nodes from the rootNode, etc.</p>
  1091. </li>
  1092. </ul>
  1093. </div>
  1094. <div class="admonitionblock tip">
  1095. <table>
  1096. <tr>
  1097. <td class="icon">
  1098. <i class="fa icon-tip" title="Tip"></i>
  1099. </td>
  1100. <td class="content">
  1101. <div class="paragraph">
  1102. <p>AppStates are extremely handy to swap out, or pause/unpause whole sets of other AppStates. For example, an InGameState (loads in-game <abbr title="Graphical User Interface">GUI</abbr>, activates click-to-shoot input mappings, inits game content, starts game loop) versus MainScreenState (stops game loop, saves and detaches game content, switches to menu screen <abbr title="Graphical User Interface">GUI</abbr>, switches to click-to-select input mappings).</p>
  1103. </div>
  1104. </td>
  1105. </tr>
  1106. </table>
  1107. </div>
  1108. </div>
  1109. <div class="sect2">
  1110. <h3 id="usage"><a class="anchor" href="#usage"></a>Usage</h3>
  1111. <div class="paragraph">
  1112. <p>There are two ways to implement AppStates, extend either AbstractAppState or BaseAppState. The differences will be explained in greater detail later.</p>
  1113. </div>
  1114. <div class="paragraph">
  1115. <p>To implement game logic:</p>
  1116. </div>
  1117. <div class="olist arabic">
  1118. <ol class="arabic">
  1119. <li>
  1120. <p>Create one AbstractAppState or BaseAppState instance for each set of game mechanics.</p>
  1121. </li>
  1122. <li>
  1123. <p>Implement game behaviour in the AppState&#8217;s update() method.</p>
  1124. <div class="ulist">
  1125. <ul>
  1126. <li>
  1127. <p>You can pass custom data as arguments in the constructor.</p>
  1128. </li>
  1129. <li>
  1130. <p>The AppState has access to everything inside the app&#8217;s scope via the Application <code>app</code> object.</p>
  1131. </li>
  1132. </ul>
  1133. </div>
  1134. </li>
  1135. <li>
  1136. <p>Create and attach the AppState to the AppStateManager (<code>stateManager.attach(myAppState);</code>) and initialize it.</p>
  1137. </li>
  1138. <li>
  1139. <p>Enable and disable (unpause and pause) the AppStates that you need during the game.</p>
  1140. </li>
  1141. <li>
  1142. <p>Detach the AppState from the AppStateManager (<code>stateManager.detach(myAppState);</code>) and clean it up.</p>
  1143. </li>
  1144. </ol>
  1145. </div>
  1146. <div class="paragraph">
  1147. <p>When you add several AppStates to one Application and activate them, their initialize() methods and update() loops are executed in the order in which the AppStates were added to the AppStateManager.</p>
  1148. </div>
  1149. </div>
  1150. <div class="sect2">
  1151. <h3 id="code-samples"><a class="anchor" href="#code-samples"></a>Code Samples</h3>
  1152. <div class="paragraph">
  1153. <p>JME3 comes with a BulletAppState that implements Physical behaviour (using the jBullet library). You, for example, could write an Artificial Intelligence AppState to control all your enemy units. Existing examples in the code base include:</p>
  1154. </div>
  1155. <div class="ulist">
  1156. <ul>
  1157. <li>
  1158. <p><a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java">BulletAppState</a> controls physical behaviour in PhysicsControl&#8217;ed Spatials.</p>
  1159. </li>
  1160. <li>
  1161. <p><a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/app/state/TestAppStates.java">TestAppStates.java</a> an example of a custom AppState</p>
  1162. <div class="ulist">
  1163. <ul>
  1164. <li>
  1165. <p><a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/app/state/RootNodeState.java">RootNodeState.java</a></p>
  1166. </li>
  1167. </ul>
  1168. </div>
  1169. </li>
  1170. </ul>
  1171. </div>
  1172. </div>
  1173. </div>
  1174. </div>
  1175. <div class="sect1">
  1176. <h2 id="appstate"><a class="anchor" href="#appstate"></a>AppState</h2>
  1177. <div class="sectionbody">
  1178. <div class="paragraph">
  1179. <p>The AppState interface lets you initialize sets of objects, and hook a set of continuously executing code into the main loop.</p>
  1180. </div>
  1181. <table class="tableblock frame-all grid-all stretch">
  1182. <colgroup>
  1183. <col style="width: 25%;">
  1184. <col style="width: 75%;">
  1185. </colgroup>
  1186. <thead>
  1187. <tr>
  1188. <th class="tableblock halign-left valign-top">AppState Method</th>
  1189. <th class="tableblock halign-left valign-top">Usage</th>
  1190. </tr>
  1191. </thead>
  1192. <tbody>
  1193. <tr>
  1194. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1195. <p>initialize(asm,app)</p>
  1196. </div></div></td>
  1197. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1198. <p>When this AppState is added to the game, the RenderThread initializes the AppState and then calls this method. You can modify the scene graph from here (e.g. attach nodes). To get access to the main app, call:</p>
  1199. </div>
  1200. <div class="listingblock">
  1201. <div class="content">
  1202. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">super.initialize(stateManager, app);
  1203. this.app = (SimpleApplication) app;</code></pre>
  1204. </div>
  1205. </div></div></td>
  1206. </tr>
  1207. <tr>
  1208. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1209. <p>cleanup()</p>
  1210. </div></div></td>
  1211. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1212. <p>This method is executed after you remove the AppState from the game. Here you implement clean-up code for when this state is detached. You can modify the scene graph from here (e.g. detach nodes).</p>
  1213. </div></div></td>
  1214. </tr>
  1215. <tr>
  1216. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1217. <p>update(float tpf)</p>
  1218. </div></div></td>
  1219. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1220. <p>Here you implement the behaviour that you want to hook into the simpleUpdate() loop while this state is attached to the game. You can modify the scene graph from here.</p>
  1221. </div></div></td>
  1222. </tr>
  1223. <tr>
  1224. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1225. <p>isInitialized()</p>
  1226. </div></div></td>
  1227. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1228. <p>Your implementations of this interface should return the correct respective boolean value. (See AbstractAppState)</p>
  1229. </div></div></td>
  1230. </tr>
  1231. <tr>
  1232. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1233. <p>setEnabled(true)<br>
  1234. setEnabled(false)</p>
  1235. </div></div></td>
  1236. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1237. <p>Temporarily enables or disables an AppState. (See AbstractAppState)</p>
  1238. </div></div></td>
  1239. </tr>
  1240. <tr>
  1241. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1242. <p>isEnabled()</p>
  1243. </div></div></td>
  1244. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1245. <p>Test whether AppState is enabled or disabled. Your implementation should consider the boolean. (See AbstractAppState)</p>
  1246. </div></div></td>
  1247. </tr>
  1248. <tr>
  1249. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1250. <p>stateAttached(asm)<br>
  1251. stateDetached(asm)</p>
  1252. </div></div></td>
  1253. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1254. <p>The AppState knows when it is attached to, or detached from, the AppStateManager, and triggers these two methods. Don&#8217;t modify the scene graph from here! (Typically not used.)</p>
  1255. </div></div></td>
  1256. </tr>
  1257. <tr>
  1258. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1259. <p>render(RenderManager rm)</p>
  1260. </div></div></td>
  1261. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1262. <p>Renders the state, plus your optional customizations. (Typically not used.)</p>
  1263. </div></div></td>
  1264. </tr>
  1265. <tr>
  1266. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1267. <p>postRender()</p>
  1268. </div></div></td>
  1269. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1270. <p>Called after all rendering commands are flushed, including your optional customizations. (Typically not used.)</p>
  1271. </div></div></td>
  1272. </tr>
  1273. </tbody>
  1274. </table>
  1275. </div>
  1276. </div>
  1277. <div class="sect1">
  1278. <h2 id="abstractappstate"><a class="anchor" href="#abstractappstate"></a>AbstractAppState</h2>
  1279. <div class="sectionbody">
  1280. <div class="paragraph">
  1281. <p>The <a href="https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/app/state/AbstractAppState.java">AbstractAppState</a> class already implements some common methods (<code>isInitialized(), setEnabled(), isEnabled()</code>) and makes creation of custom AppStates a bit easier. When you extend AbstractAppState, we recommend you override the remaining AppState methods: <code>initialize(), setEnabled(), cleanup()</code>.</p>
  1282. </div>
  1283. <div class="paragraph">
  1284. <p>Definition:</p>
  1285. </div>
  1286. <div class="listingblock">
  1287. <div class="content">
  1288. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">public class MyAppState extends AbstractAppState {
  1289. private SimpleApplication app;
  1290. private Node x = new Node("x"); // some custom class fields...
  1291. public Node getX(){ return x; } // some custom methods...
  1292. @Override
  1293. public void initialize(AppStateManager stateManager, Application app) {
  1294. super.initialize(stateManager, app);
  1295. this.app = (SimpleApplication)app; // cast to a more specific class
  1296. // init stuff that is independent of whether state is PAUSED or RUNNING
  1297. this.app.getRootNode().attachChild(getX()); // modify scene graph...
  1298. this.app.doSomething(); // call custom methods...
  1299. }
  1300. @Override
  1301. public void cleanup() {
  1302. super.cleanup();
  1303. // unregister all my listeners, detach all my nodes, etc...
  1304. this.app.getRootNode().detachChild(getX()); // modify scene graph...
  1305. this.app.doSomethingElse(); // call custom methods...
  1306. }
  1307. @Override
  1308. public void setEnabled(boolean enabled) {
  1309. // Pause and unpause
  1310. super.setEnabled(enabled);
  1311. if(enabled){
  1312. // init stuff that is in use while this state is RUNNING
  1313. this.app.getRootNode().attachChild(getX()); // modify scene graph...
  1314. this.app.doSomethingElse(); // call custom methods...
  1315. } else {
  1316. // take away everything not needed while this state is PAUSED ...
  1317. }
  1318. }
  1319. // Note that update is only called while the state is both attached and enabled.
  1320. @Override
  1321. public void update(float tpf) {
  1322. // do the following while game is RUNNING
  1323. this.app.getRootNode().getChild("blah").scale(tpf); // modify scene graph...
  1324. x.setUserData(...); // call some methods...
  1325. }
  1326. }</code></pre>
  1327. </div>
  1328. </div>
  1329. </div>
  1330. </div>
  1331. <div class="sect1">
  1332. <h2 id="baseappstate"><a class="anchor" href="#baseappstate"></a>BaseAppState</h2>
  1333. <div class="sectionbody">
  1334. <div class="paragraph">
  1335. <p>A new <a href="https://javadoc.jmonkeyengine.org/v3.4.1-stable/com/jme3/app/state/BaseAppState.html">BaseAppState</a> class was introduced as part of the <a href="https://hub.jmonkeyengine.org/t/jmonkeyengine-3-1-alpha-4-released/35478">updates</a> being made to the AppState interface. AbstractAppState is the most minimal of the minimal implementations of the AppState interface. You essentially still need to do everything yourself, including getting the funky enable/disable/initialized/terminate logic right. Now you just extend BaseAppState and you get onEnable() and onDisable() already worked out for you.</p>
  1336. </div>
  1337. <div class="paragraph">
  1338. <p>Definition:</p>
  1339. </div>
  1340. <div class="listingblock">
  1341. <div class="content">
  1342. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">public class MyBaseAppState extends BaseAppState {
  1343. @Override
  1344. protected void initialize(Application app) {
  1345. //It is technically safe to do all initialization and cleanup in the
  1346. //onEnable()/onDisable() methods. Choosing to use initialize() and
  1347. //cleanup() for this is a matter of performance specifics for the
  1348. //implementor.
  1349. //TODO: initialize your AppState, e.g. attach spatials to rootNode
  1350. }
  1351. @Override
  1352. protected void cleanup(Application app) {
  1353. //TODO: clean up what you initialized in the initialize method,
  1354. //e.g. remove all spatials from rootNode
  1355. }
  1356.   //onEnable()/onDisable() can be used for managing things that should
  1357. //only exist while the state is enabled. Prime examples would be scene
  1358. //graph attachment or input listener attachment.
  1359. @Override
  1360. protected void onEnable() {
  1361. //Called when the state is fully enabled, ie: is attached and
  1362. //isEnabled() is true or when the setEnabled() status changes after the
  1363. //state is attached.
  1364. }
  1365.   @Override
  1366. protected void onDisable() {
  1367. //Called when the state was previously enabled but is now disabled
  1368. //either because setEnabled(false) was called or the state is being
  1369. //cleaned up.
  1370. }
  1371. @Override
  1372. public void update(float tpf) {
  1373. //TODO: implement behavior during runtime
  1374. }
  1375. }</code></pre>
  1376. </div>
  1377. </div>
  1378. <div class="paragraph">
  1379. <p>Notable BaseAppState changes are as follows:</p>
  1380. </div>
  1381. <div class="ulist">
  1382. <ul>
  1383. <li>
  1384. <p>You no longer need to call super.initialize(stateManager, app) because it is now called by BaseAppState upon initialization for you.</p>
  1385. </li>
  1386. <li>
  1387. <p>You no longer have to cast SimpleApplication to have access to AssetManager, AppStateManager, and you can even get a State directly. The getters getApplication(), getAssetManager(), getState(type) and their methods are available to you immediately. However, you still have to cast SimpleApplication to get rootNode.</p>
  1388. </li>
  1389. <li>
  1390. <p>You no longer call super during cleanup, its done for you now.</p>
  1391. </li>
  1392. <li>
  1393. <p>It&#8217;s now safe to do all initialization and cleanup in the onEnable()/onDisable() methods.</p>
  1394. </li>
  1395. <li>
  1396. <p>Cleanup and setEnabled now have logging built in.</p>
  1397. </li>
  1398. </ul>
  1399. </div>
  1400. <div class="paragraph">
  1401. <p>You use BaseAppState as you would AbstractAppState, other than mentioned above, and which one you use is entirely up to you. However, BaseAppState makes your life easier and is the recommended one to use now.</p>
  1402. </div>
  1403. <div class="paragraph">
  1404. <p>See <a href="https://javadoc.jmonkeyengine.org/v3.4.1-stable/com/jme3/app/state/BaseAppState.html">BaseAppState</a> for more information.</p>
  1405. </div>
  1406. </div>
  1407. </div>
  1408. <div class="sect1">
  1409. <h2 id="pausing-and-unpausing"><a class="anchor" href="#pausing-and-unpausing"></a>Pausing and Unpausing</h2>
  1410. <div class="sectionbody">
  1411. <div class="paragraph">
  1412. <p>You define what an AppState does when Paused or Unpaused, in the <code>setEnabled()</code> and <code>update()</code> methods. Call <code>myState.setEnabled(false)</code> on all states that you want to pause. Call <code>myState.setEnabled(true)</code> on all states that you want to unpause.</p>
  1413. </div>
  1414. </div>
  1415. </div>
  1416. <div class="sect1">
  1417. <h2 id="appstatemanager"><a class="anchor" href="#appstatemanager"></a>AppStateManager</h2>
  1418. <div class="sectionbody">
  1419. <div class="paragraph">
  1420. <p>The com.jme3.app.state.AppStateManager holds the list of AppStates for an application. AppStateManager ensures that active AppStates can modify the scene graph, and that the update() loops of active AppStates is executed. There is one AppStateManager per application. You typically attach several AppStates to one AppStateManager, but the same state can only be attached once.</p>
  1421. </div>
  1422. <table class="tableblock frame-all grid-all stretch">
  1423. <colgroup>
  1424. <col style="width: 50%;">
  1425. <col style="width: 50%;">
  1426. </colgroup>
  1427. <thead>
  1428. <tr>
  1429. <th class="tableblock halign-left valign-top">AppStateManager Method</th>
  1430. <th class="tableblock halign-left valign-top">Usage</th>
  1431. </tr>
  1432. </thead>
  1433. <tbody>
  1434. <tr>
  1435. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1436. <p>hasState(myState)</p>
  1437. </div></div></td>
  1438. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1439. <p>Is AppState object 'myState' attached?</p>
  1440. </div></div></td>
  1441. </tr>
  1442. <tr>
  1443. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1444. <p>getState(MyAppState.class)</p>
  1445. </div></div></td>
  1446. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1447. <p>Returns the first attached state that is an instance of a subclass of <code>MyAppState.class</code>.</p>
  1448. </div></div></td>
  1449. </tr>
  1450. </tbody>
  1451. </table>
  1452. <div class="paragraph">
  1453. <p>The AppStateManager&#8217;s <code>render(), postRender(), cleanup()</code> methods are internal, ignore them, users never call them directly.</p>
  1454. </div>
  1455. <div class="ulist">
  1456. <ul>
  1457. <li>
  1458. <p>If a detached AppState is attached then initialize() will be called on the following render pass.</p>
  1459. </li>
  1460. <li>
  1461. <p>If an attached AppState is detached then cleanup() will be called on the following render pass.</p>
  1462. </li>
  1463. <li>
  1464. <p>If you attach an already-attached AppState then the second attach is a no-op and will return false.</p>
  1465. </li>
  1466. <li>
  1467. <p>If you both attach and detach an AppState within one frame then neither initialize() or cleanup() will be called, although if either is called both will be.</p>
  1468. </li>
  1469. <li>
  1470. <p>If you both detach and then re-attach an AppState within one frame then on the next update pass its cleanup() and initialize() methods will be called in that order.</p>
  1471. </li>
  1472. </ul>
  1473. </div>
  1474. </div>
  1475. </div>
  1476. <div class="sect1">
  1477. <h2 id="best-practices"><a class="anchor" href="#best-practices"></a>Best Practices</h2>
  1478. <div class="sectionbody">
  1479. <div class="sect2">
  1480. <h3 id="communication-among-appstates"><a class="anchor" href="#communication-among-appstates"></a>Communication Among AppStates</h3>
  1481. <div class="paragraph">
  1482. <p>You can only access other AppStates (read from and write to them) from certain places: From a Control&#8217;s update() method, from an AppState&#8217;s update() method, and from the SimpleApplication&#8217;s simpleUpdate() loop. Don&#8217;t mess with the AppState from other places, because from other methods you have no control over the order of modifications; the game can go out of sync because you can&#8217;t know when (during which half-finished step of another state change) your modification will be performed.</p>
  1483. </div>
  1484. <div class="paragraph">
  1485. <p>You can use custom accessors to get data from AppStates, to set data in AppStates, or to trigger methods in AppStates.</p>
  1486. </div>
  1487. <div class="listingblock">
  1488. <div class="content">
  1489. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">this.app.getStateManager().getState(MyAppState.class).doSomeCustomStuffInThisState();</code></pre>
  1490. </div>
  1491. </div>
  1492. </div>
  1493. <div class="sect2">
  1494. <h3 id="initialize-familiar-class-fields"><a class="anchor" href="#initialize-familiar-class-fields"></a>Initialize Familiar Class Fields</h3>
  1495. <div class="paragraph">
  1496. <p>To access class fields of the SimpleApplication the way you are used to, initialize them to local variables, as shown in the following AppState template:</p>
  1497. </div>
  1498. <div class="listingblock">
  1499. <div class="content">
  1500. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private SimpleApplication app;
  1501. private Node rootNode;
  1502. private AssetManager assetManager;
  1503. private AppStateManager stateManager;
  1504. private InputManager inputManager;
  1505. private ViewPort viewPort;
  1506. private BulletAppState physics;
  1507. public class MyAppState extends AbstractAppState {
  1508. @Override
  1509. public void initialize(AppStateManager stateManager, Application app) {
  1510. super.initialize(stateManager, app);
  1511. this.app = (SimpleApplication) app; // can cast Application to something more specific
  1512. this.rootNode = this.app.getRootNode();
  1513. this.assetManager = this.app.getAssetManager();
  1514. this.stateManager = this.app.getStateManager();
  1515. this.inputManager = this.app.getInputManager();
  1516. this.viewPort = this.app.getViewPort();
  1517. this.physics = this.stateManager.getState(BulletAppState.class);
  1518. }
  1519. }</code></pre>
  1520. </div>
  1521. </div>
  1522. </div>
  1523. </div>
  1524. </div>
  1525. <nav class="pagination">
  1526. <span class="prev"><a href="../update_loop.html">Update Loop</a></span>
  1527. <span class="next"><a href="../../scene/control/custom_controls.html">Custom Controls</a></span>
  1528. </nav>
  1529. </article>
  1530. <aside class="toc sidebar" data-title="Contents" data-levels="2">
  1531. <div class="toc-menu"></div>
  1532. </aside>
  1533. </div>
  1534. </main>
  1535. </div>
  1536. <footer class="footer">
  1537. <p>Copyright 2020 jMonkeyEngine Wiki Contributors. Licensed BSD-3.</p>
  1538. </footer>
  1539. <script src="../../../../../_/js/vendor/docsearch.min.js"></script>
  1540. <!-- fetched from https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js -->
  1541. <script>
  1542. var search = docsearch({
  1543. apiKey: 'a736b6d93de805e26ec2f49b55013fbd',
  1544. indexName: 'jmonkeyengine',
  1545. inputSelector: '#search-input',
  1546. autocompleteOptions: { hint: false, keyboardShortcuts: ['s'] },
  1547. algoliaOptions: { hitsPerPage: 10 }
  1548. }).autocomplete
  1549. search.on('autocomplete:closed', function () { search.autocomplete.setVal() })
  1550. function focusSearchInput () { document.querySelector('#search-input').focus() }
  1551. if (document.querySelector('.home-link.is-current')) window.addEventListener('load', focusSearchInput)
  1552. </script>
  1553. <script src="../../../../../_/js/site.js"></script>
  1554. <script async src="../../../../../_/js/vendor/highlight.js"></script>
  1555. </body>
  1556. </html>