<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5311456549682003353</id><updated>2024-09-08T23:39:47.513-07:00</updated><category term="news"/><category term="wip"/><category term="playable"/><category term="Reindeer Rearing"/><category term="finished"/><category term="jmonkey"/><category term="tutorial"/><category term="Gothic"/><category term="how to"/><category term="Bogie"/><category term="Dungeon Hoard"/><category term="ludum dare"/><category term="un-named project"/><category term="Ceres"/><category term="Spooky"/><category term="Dawn"/><category term="Sheep Tutorial"/><category term="itch.io"/><category term="ogmj3"/><title type='text'>Mr U Games</title><subtitle type='html'>Check out some fun games!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default?start-index=26&amp;max-results=25'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-4105962702486913508</id><published>2020-01-01T18:41:00.002-08:00</published><updated>2020-01-01T18:41:50.222-08:00</updated><title type='text'>Welcome 2020</title><content type='html'>Hello, I hope you had a good new years! I had a good holiday season but again I didn&#39;t get as much done as I had wanted.&lt;br /&gt;
&lt;br /&gt;
I put alot of effort into learning Lemur&#39;s style system which is really cool but has a high learning curve. When I implemented my ui elements for Reindeer Rearing the first time in Lemur I wound up making many sub-classes of the default components. This looked good and worked as expected, but it was alot of work and alot of copied code. Using lemur&#39;s styling it looks like I can minimize this duplicated code almost entirely. Here&#39;s my current placeholder ui until I can re-work in the pixel art from before:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqiZle6skXEvlMzuzzjy32fpZEPIbIysZGyN1n20d9FxEErZJZpRAyvp2I6bLwP_FNl7VDJN4UGC_rM6iZPux4yKEOVOM3avmP1q7nJa3iD5bOXE_eWiuoOUlwG3qUi-BvYps6eEZubHqf/s1600/MenuExample.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;625&quot; data-original-width=&quot;800&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqiZle6skXEvlMzuzzjy32fpZEPIbIysZGyN1n20d9FxEErZJZpRAyvp2I6bLwP_FNl7VDJN4UGC_rM6iZPux4yKEOVOM3avmP1q7nJa3iD5bOXE_eWiuoOUlwG3qUi-BvYps6eEZubHqf/s320/MenuExample.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
I was able to implement the chime sound effect when buttons are pressed in 7 lines in the style, which is automatically re-used for every button. In the original Reindeer Rearing the simple chime effect was 4 lines of code every time I created a button.&lt;br /&gt;
&lt;br /&gt;
I am also completely re-working all of the mini games. I am aiming to get them to feel more responsive and overall more polished. At the moment they are all simple debug shapes or output text so there isn&#39;t much to show, so I hope to have some of the artwork moved over or replaced by my next post.&lt;br /&gt;
&lt;br /&gt;
That&#39;s pretty much all I have for today. I&#39;ll try to have more artwork and maybe some usefull code snippets next time. Consider that a resolution ;)</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/4105962702486913508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2020/01/welcome-2020.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4105962702486913508'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4105962702486913508'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2020/01/welcome-2020.html' title='Welcome 2020'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqiZle6skXEvlMzuzzjy32fpZEPIbIysZGyN1n20d9FxEErZJZpRAyvp2I6bLwP_FNl7VDJN4UGC_rM6iZPux4yKEOVOM3avmP1q7nJa3iD5bOXE_eWiuoOUlwG3qUi-BvYps6eEZubHqf/s72-c/MenuExample.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-5726866072275484650</id><published>2019-12-03T17:43:00.001-08:00</published><updated>2019-12-03T17:43:23.098-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bogie"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><title type='text'>Bogie Weapons and the return of Reindeer Rearing</title><content type='html'>Hello, I hope you had a great November. My November was very productive. I had a solid week off from work due to the holiday and I dedicated most of that time to working on various projects!&lt;br /&gt;
&lt;br /&gt;
Bogie is churning along nice and steady. I continue to bash away at physics to get them as consistent and predictable as possible. I was able to boil down the aircraft flight model into several easily modifieable and understandable tables and the results are very pleasing. The underlying math for the flight model is not likely to change dramatically from here on.&lt;br /&gt;
&lt;br /&gt;
After I got the flight model in a useable position I started playing with weapons. I now have working machine guns and guided missiles, all weapon code is still rather early though and likely to change alot.&lt;br /&gt;
&lt;br /&gt;
I was able to implement asynchonous loading and loading screens with progress bars! This was a first for me so I am pretty happy to discover how simple it could be.&lt;br /&gt;
&lt;br /&gt;
December is here, and that means I decided to revisit Reindeer Rearing. I wound up leaving RR in it&#39;s broken state 2 years ago when I realized I was trying to build on top of a broken base. I decided to give the project a complete re-write while using the assets I had already created. Hopefully I can have this finished before Christmas.&lt;br /&gt;
&lt;br /&gt;
That&#39;s all for my November update. I apologize for the lack of pictures but nearly everything I have finished is either completely behind the scenes or just being drawn with debug lines atm. I will do my best to have some screenshots for my next update!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/5726866072275484650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/12/bogie-weapons-and-return-of-reindeer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5726866072275484650'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5726866072275484650'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/12/bogie-weapons-and-return-of-reindeer.html' title='Bogie Weapons and the return of Reindeer Rearing'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-5084831294756590826</id><published>2019-10-29T18:47:00.001-07:00</published><updated>2019-10-29T18:47:58.417-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bogie"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="ludum dare"/><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Physics are fun! Also Ludum Dare 45</title><content type='html'>Hello everyone, I hope you&#39;re having a fun Halloween time! I&#39;ve spent most of the last few weeks working on costumes for the family, but I&#39;ve also managed to squeeze in some programming, and even another fun project that my wife suggested and is co-producing!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQUCzh0DfqAH3j0lsHlfzHncxOYtQy7GD3qmsIrLg73EC4KOOYNkfk-N3VH_KwOZVb5hjoUkOeJJDBxFPctFtuv8nlWDIrLwLps55XPsQ4H2HRxMzhD5f3BMOu2YpocNgRsaE9x2_lFn8V/s1600/LDJame45_TITLE.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;640&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQUCzh0DfqAH3j0lsHlfzHncxOYtQy7GD3qmsIrLg73EC4KOOYNkfk-N3VH_KwOZVb5hjoUkOeJJDBxFPctFtuv8nlWDIrLwLps55XPsQ4H2HRxMzhD5f3BMOu2YpocNgRsaE9x2_lFn8V/s320/LDJame45_TITLE.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Early this month was Ludum Dare 45! I thoroughly enjoy attempting this jam and I was looking forward to giving it another run. The theme was &quot;Start with nothing&quot; and I set a restriction to NOT make another 2d sidescroller action game. Instead I started with the idea &quot;Open a shop in a back alley as a homeless person.&quot; I do wish to take a moment and say I recognize the sensitivity of this topic. Many cities in the US are facing a major problem with homelessness, and I strongly feel the position of many citizens and governments are actively making the situation worse. This helped shape the tone of my game to focus on the desperation of such a situation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every morning random garbage spawns in 2 back alleys. You must collect this garbage and attempt to talk to people to find anyone willing to give you money in exchange for this garbage. &quot;One man&#39;s garbage is another mans treasure.&quot; If you are unable to raise $10 by nightfall you will not have enough money for food and water, and will not survive the night. To make things even harder every item is made up of a grid which takes up space in your inventory. Your inventory is pathetically small at 2x5, with items being 1x1, 1x2, 2x1 or 2x2 in size.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuUf1LFNkPLyvnWxNtfjCLqMJ98384sphEwwejMIi4QokCYmlDy_ENQPYXdUfrmD9NDAlYpE4GcHkUK348HrRP2xDbQ8YwbKwqy7H7VjvyKdceh7WKVv8fp2PizTTCtWpDTFYRbK3FcXFz/s1600/LDJam45_008.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;640&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuUf1LFNkPLyvnWxNtfjCLqMJ98384sphEwwejMIi4QokCYmlDy_ENQPYXdUfrmD9NDAlYpE4GcHkUK348HrRP2xDbQ8YwbKwqy7H7VjvyKdceh7WKVv8fp2PizTTCtWpDTFYRbK3FcXFz/s320/LDJam45_008.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Just because you manage to fit an item in your jacket doesn&#39;t mean you&#39;ll be able to sell it. People are not willing to stop and chat with a homeless person and will largely ignore you. If you don&#39;t have exactly what someone wants, when they want it they&#39;ll continue on their way and get the item from somewhere else.&lt;br /&gt;
&lt;br /&gt;
This game took me right up to the deadline to finish and is missing many features I had hoped to implement. That said if you are interested I have posted a playable version to &lt;a href=&quot;https://mruniversegames.itch.io/garbage-dealer&quot;&gt;Itch&lt;/a&gt; and the source code is available on &lt;a href=&quot;https://github.com/qs-dragon/GarbageShop&quot;&gt;Github&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been really focused on working through physics and collisions for Project Bogie. I know I want rather large environments and a system that integrates well with my entity-data structure, so I figured I could tackle most of the collisions from scratch. This is working pretty much as well as I had hoped, with some parts going very smoothly and others being kind of a pain, but progress is being made every week and I can&#39;t complain about that!&lt;br /&gt;
&lt;br /&gt;
The flight physics I want to try are loosely based off real aerodynamic lift models. I am boiling the flight dynamics I wish to see in each aircraft into as few tables as possible. I am not trying to make a simulator so everything is being focused on feel.&lt;br /&gt;
&lt;br /&gt;
I should note that I do not plan on including any real world vehicles. Everything will be fictional and slightly futuristic. I find the aesthetic for Crimson Skies very appealing.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi36FgRiSzsCoiOEwS0m4IqH4FyBR4qmAkLChRENup3J2dr9IWXvDnZc6FXdsLIFeK_wJIutEwAB46E8C0QzGuv53ou43Oaskyv9HQnegnJ_I6kbx_0AeHft6NSSUM35sFFavfqgosfZdRQ/s1600/Bogie_ColDebug.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Debug boxes showing the OcTree, a heightfield broken into multiple parts and a couple of box colliders&quot; border=&quot;0&quot; data-original-height=&quot;508&quot; data-original-width=&quot;640&quot; height=&quot;252&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi36FgRiSzsCoiOEwS0m4IqH4FyBR4qmAkLChRENup3J2dr9IWXvDnZc6FXdsLIFeK_wJIutEwAB46E8C0QzGuv53ou43Oaskyv9HQnegnJ_I6kbx_0AeHft6NSSUM35sFFavfqgosfZdRQ/s320/Bogie_ColDebug.png&quot; title=&quot;&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Collisions are causing a bit of a headache. Object to object collisions were surprisingly straight forward to implement and I am very happy with the results. Terrain is currently problematic and I have gone through several iterations to find what works the best. I do not need incredibly accurate terrain collisions to get a functional prototype working, I do need one that works consistently. This is likely going to be my focus for the next week or so.&lt;br /&gt;
&lt;br /&gt;
Until next time!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/5084831294756590826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/10/physics-are-fun-also-ludum-dare-45.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5084831294756590826'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5084831294756590826'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/10/physics-are-fun-also-ludum-dare-45.html' title='Physics are fun! Also Ludum Dare 45'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQUCzh0DfqAH3j0lsHlfzHncxOYtQy7GD3qmsIrLg73EC4KOOYNkfk-N3VH_KwOZVb5hjoUkOeJJDBxFPctFtuv8nlWDIrLwLps55XPsQ4H2HRxMzhD5f3BMOu2YpocNgRsaE9x2_lFn8V/s72-c/LDJame45_TITLE.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-5626348818984858154</id><published>2019-09-23T17:40:00.002-07:00</published><updated>2019-10-29T18:48:19.310-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bogie"/><category scheme="http://www.blogger.com/atom/ns#" term="Ceres"/><title type='text'>Another Hold, Another New Venture</title><content type='html'>Game design is hard, solo game design is even harder. Sometimes you start with the greatest ideas and rush in to happily create what you think is awesome. Sometimes you get 80% of the way to a playable prototype and realize that awesome idea is really just some sparkly mud.&lt;br /&gt;
&lt;br /&gt;
I&#39;m putting Ceres on hold (probably indefinitely) since after getting as far as I did, I realized it was just plain not fun.&lt;br /&gt;
&lt;br /&gt;
Now I&#39;m working on another project under the name &quot;Bogie&quot; for now. This is a genre I&#39;ve always wanted to try making a game for! As of writing this I don&#39;t have much more than cubes flying around in what feels like the direction I hope to take the project, but I&#39;m also tackling some engine level problems that I&#39;ve had crop up in previous projects. This is making for a much slower start than on Gothic or Ceres, but the end result will be several new libraries I will be able to re-use in the future which are solid and well tested.&lt;br /&gt;
&lt;br /&gt;
Sometimes life hands you lemons, other times you try to grow lemons and realize you planted a thorn bush. I know I haven&#39;t had a playable project in awhile, but that&#39;s ok. Every day I&#39;m working to make the next playable thing the best playable thing I can make!&lt;br /&gt;
&lt;br /&gt;
Thanks for coming by and reading. If you&#39;re looking for something fun to do there are some playable games linked on the right, or check out my &quot;Interested in making games?&quot; section and try making something fun!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/5626348818984858154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/09/another-hold-another-new-venture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5626348818984858154'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5626348818984858154'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/09/another-hold-another-new-venture.html' title='Another Hold, Another New Venture'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-960416842264392</id><published>2019-07-18T06:24:00.003-07:00</published><updated>2019-07-18T06:25:33.060-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ceres"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Project Ceres</title><content type='html'>My one side project kind of exploded.&lt;br /&gt;
&lt;br /&gt;
It started as a &quot;Multiplayer Asteroids&quot; kind of game and turned into what is currently dubbed &quot;Project Ceres&quot; (real name determined but to be revealed at a later date). At it&#39;s core it&#39;s still about blowing up random asteroids.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFOlVI2RhRxSurVBcXW9Lqw0wUIimRsjQTzpT-0bFllyr7Bb8xAtTeJ8nBvfnJJu3FQjsbMlo51kcl00R88usrJMOebAgCQXy5G4BWcbyl3OtLNrxj-Rb7cKPpwzgUxaMPmZeb7qUUvzH/s1600/Screenshot+from+2019-07-18+09-19-06.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img alt=&quot;I wish I was better at art...&quot; border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFOlVI2RhRxSurVBcXW9Lqw0wUIimRsjQTzpT-0bFllyr7Bb8xAtTeJ8nBvfnJJu3FQjsbMlo51kcl00R88usrJMOebAgCQXy5G4BWcbyl3OtLNrxj-Rb7cKPpwzgUxaMPmZeb7qUUvzH/s400/Screenshot+from+2019-07-18+09-19-06.png&quot; title=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The objective for now is to blow up asteroids which will drop little power ups. You need to return these power ups to the spawn area for additional points. Rinse and repeat until you explode, at which point your score gets reset and you can try all over again!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQvBBmcFylgs1RPtmYR-wNmi3TcgMUC8G2Pa3uv5oX2gVzBV_M9hIcL0iPF233KAQTOwEuEEq1C4dfparDKRvG9zfPE_-0MinyDHPii5z_XWI9vimzsGLRWVfnYt_RWxE0D0Hwx_Pzkjg/s1600/Screenshot+from+2019-07-18+09-19-20.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; outline-width: 0px !important; user-select: auto !important;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIQvBBmcFylgs1RPtmYR-wNmi3TcgMUC8G2Pa3uv5oX2gVzBV_M9hIcL0iPF233KAQTOwEuEEq1C4dfparDKRvG9zfPE_-0MinyDHPii5z_XWI9vimzsGLRWVfnYt_RWxE0D0Hwx_Pzkjg/s400/Screenshot+from+2019-07-18+09-19-20.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I am feeling close to finished with the core gameplay. In the end it wound up a lot less fun than I had hoped. I am not likely to polish it much beyond the minimum needed for it to be playable as I already have a queue of new projects I&#39;d like to try.</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/960416842264392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/07/project-ceres.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/960416842264392'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/960416842264392'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/07/project-ceres.html' title='Project Ceres'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFOlVI2RhRxSurVBcXW9Lqw0wUIimRsjQTzpT-0bFllyr7Bb8xAtTeJ8nBvfnJJu3FQjsbMlo51kcl00R88usrJMOebAgCQXy5G4BWcbyl3OtLNrxj-Rb7cKPpwzgUxaMPmZeb7qUUvzH/s72-c/Screenshot+from+2019-07-18+09-19-06.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-3362745071604369455</id><published>2019-03-25T17:07:00.001-07:00</published><updated>2019-03-25T17:07:24.287-07:00</updated><title type='text'>Alot of progress, not much to show</title><content type='html'>Hello, I just wanted to pop in real quick with an update. I&#39;ve been making a lot of progress on fixing up Gothic. It&#39;s had some pretty major changes but most of which will be largely invisible. The biggest challenge I&#39;m facing now is a decision to re-write the real time aspects into turn based gameplay. This decision came after I tried 3 or 4 different economies in a row and just wasn&#39;t happy with any of them. I think the turn based approach makes player actions more meaningful and fits with more traditional artillery games. The turns will be much like Worms except the player can set up multiple turrets to all fire at the end of the turn while also building and repairing structures. Managing your population will be an important resource to maintain peak performance.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve started a couple of other side projects as well to keep my motivation up, but I won&#39;t talk about them to much as they&#39;re both pretty small in scope and will likely not be seen for awhile. One is not a game and is a challenge I like to return to every couple of years to try different approaches to solving. If I wind up with something worth showing I&#39;ll make this freely available with source code so everyone can fiddle with it. The other side project was a random idea I had while trying to convince a friend to play with jMonkey Engine. Again, not certain how far I&#39;ll pursue it but for now it&#39;s giving me a short break from staring at the same catapults every day.&lt;br /&gt;
&lt;br /&gt;
Not much else to report. Thanks for stopping by!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/3362745071604369455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/03/alot-of-progress-not-much-to-show.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3362745071604369455'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3362745071604369455'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/03/alot-of-progress-not-much-to-show.html' title='Alot of progress, not much to show'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-7962248759354355190</id><published>2019-01-06T13:25:00.000-08:00</published><updated>2019-01-06T13:25:58.165-08:00</updated><title type='text'>Ludum Dare 43</title><content type='html'>I realized I never made a post about my participation in Ludum Dare 43 where I finished my newest project, Slime Venture!&lt;br /&gt;
&lt;br /&gt;
The theme for the latest Ludum Dare was &quot;Sacrifices must be made&quot; and what better thing to sacrifice than your own body or the bodies of similar creatures? I decided early on to stick with my theme of 2d platformers as I have become very familiar with the systems involved and I new I could get a functional prototype done quickly. I didn&#39;t dedicate the whole weekend to the compo so I wasn&#39;t willing to tackle something entirely new.&lt;br /&gt;
&lt;br /&gt;
Credit to my wife for suggesting slimes, which were a great choice as I didn&#39;t have to put much effort into assets. Simple colored cubes while not much to look at were fully functional and believable. The bright colors also made it easy to differentiate the slimes from each other and the background.&lt;br /&gt;
&lt;br /&gt;
JMonkeyEngine is of course my go to 3d engine with Java as the primary language. I decided midway through the project to also incorporate Groovy script to supplement Java and give me an easy way to test features without needing to compile. This also taught me that when Netbeans&#39; Gradle plugin compiles a project with a sub-project containing your assets, those assets are copied and stored in a separate folder. After an hour of head scratching I figured this out and made a simple work around to access files directly for testing only.&lt;br /&gt;
&lt;br /&gt;
I used dyn4j for the physics and collisions. Integrating the physics into JME is easy and consistent.&lt;br /&gt;
&lt;br /&gt;
Zay-ES was used to take advantage of an entity-component system. While I don&#39;t feel as strongly about ECS as I used to (At one point I couldn&#39;t fathom making a game without one) I do still feel they are very useful and when implemented correctly greatly speed up prototyping. The art is in finding a balance between to many and to few components for any given situation and really fleshing out your systems on paper. Remember, your systems ultimately drive what components you make and not the other way around!&lt;br /&gt;
&lt;br /&gt;
Lemur UI is my favorite GUI system for JME. It lacks some features but is so easy to work with that I rarely run into an issue I can&#39;t resolve.&lt;br /&gt;
&lt;br /&gt;
The game loop is very simple: Every level has a spawn point that sets the player&#39;s avatar to a slime with a given size and color. Every level needs to specify a trigger to activate level end. The only trigger I used for the Jam was a simple detection zone that would detect the player entities id if the player was inside the zone. There was no visual editor for levels and they are all described via groovy script calling java functions to build the various set pieces.&lt;br /&gt;
&lt;br /&gt;
Slimes all have a size (1-5) and a color (blue or green in the prototype). Slimes who are a larger size will consume slimes of a smaller size. This is true for slimes of the same color, so beware you can still be eaten by &quot;friendly&quot; looking slimes! If you consume a slime that is your color and smaller than you, you grow 1 size. If you consume a slime that is a different color and 1 size smaller than you, you shrink 1 size. Smaller slimes move faster and jump higher than big slimes. Most levels features obstacles that were to small for large slimes to pass through, so you would need to shrink yourself enough to squeeze through. Other levels would require you to eat slimes in a certain order to be the correct size to finish the level.&lt;br /&gt;
&lt;br /&gt;
All in all this Ludum Dare was tons of fun. I didn&#39;t dedicate my entire weekend, and altogether probably spent 12 hours working on this project. By setting the scope very small and dedicating more time to interacting with my wife and kid I had a much easier time focusing on programming when I did sit down to work.</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/7962248759354355190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2019/01/ludum-dare-43.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/7962248759354355190'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/7962248759354355190'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2019/01/ludum-dare-43.html' title='Ludum Dare 43'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-6066350086672970803</id><published>2018-12-31T13:40:00.003-08:00</published><updated>2018-12-31T13:40:24.545-08:00</updated><title type='text'>Happy New Years!</title><content type='html'>I hope you had a wonderful holiday season and are welcoming in the new year! Here&#39;s a little update on the state of my projects.&lt;br /&gt;
&lt;br /&gt;
I worked a lot of overtime at my day job this month so I wasn&#39;t able to completely re-write Reindeer Rearing like I had hoped, but I was able to greatly reduce the ram usage by cutting out a largely redundant system I was using to handle sprites. I was able to touch on all of the mini games at least a little under the hood to make them better self contained and more reliable. I haven&#39;t experienced any crashes through testing but if you find any bugs don&#39;t be afraid to message me! Lastly I re worked how the toy builder mini game handles the different toys. What was before 7 textures and a data file has been reduced to a single texture! This isn&#39;t a texture sheet either, to add new toys is as simple as drawing their finished sprite. The game will automatically split this sprite into 3 pieces and color it black when it&#39;s loaded. The sprites are currently all hard-coded but in the future I&#39;d like to support user files to add to a sprite list.&lt;br /&gt;
&lt;br /&gt;
Now that the holiday season is wrapping up I look forward to the next item on my list, Project Gothic. Gothic is still the most viewed/downloaded game on my itch and it desperately deserves to be re-worked into a more functional and finished project. I have no time frame on when I plan to move updates for Gothic, except that I will be converting the project over to a Gradle project tomorrow and I&#39;ll start whittling away at it after that. Gothic is the focus until I deem it in a polished state!&lt;br /&gt;
&lt;br /&gt;
While Gothic is my #1 focus I find I tend to work better if I have a side project going for when I hit roadblocks. The side project while I work on Gothic is going to be Slime Venture! I fully intend to polish Slime Venture into a finished project now that the Jam is over. It was well received and I believe has a very firm framework that held up very well during the short period I put it together. It won&#39;t be my primary focus for the next couple of months but I will be revisiting the level generation and menus to make it a better game in my spare time. I will also be making some finished assets for it to practice with Blender animations and prep for more detailed work that Gothic will require.&lt;br /&gt;
&lt;br /&gt;
I wish you the happiest new year!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/6066350086672970803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/12/happy-new-years.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6066350086672970803'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6066350086672970803'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/12/happy-new-years.html' title='Happy New Years!'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-7907552939054324955</id><published>2018-11-04T18:45:00.002-08:00</published><updated>2018-11-04T18:45:41.026-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gothic"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><category scheme="http://www.blogger.com/atom/ns#" term="Spooky"/><title type='text'>Spooky Progress and More News</title><content type='html'>So I had originally hoped to have Spooky finished by Halloween. That didn&#39;t happen. I&#39;ve actually become quiet invested in making a suite of 2d platforming tools within JME which has resulted in Spooky taking a LOT longer than originally anticipated, and also means the scope of Spooky is probably getting bigger than originally planned as well. Making games is fun!&lt;br /&gt;
&lt;br /&gt;
I have the foundation for a much more robust Sprite system than I&#39;ve done before, and I&#39;ve implemented Tile Maps with a custom collision system that is looking very promising. The platforming aspects of Spooky are something I&#39;ve wanted to do in games for a long time, but I always used pre-made physics systems. Using physics is great for some games, but in games where you want more deterministic responses to collisions and the environment they tend to make simple things more difficult. Hopefully this makes Spooky&#39;s controls much tighter and more responsive than Dungeon Hordes were.&lt;br /&gt;
&lt;br /&gt;
The month of November will likely not see any major updates to Gothic as I had expressed last time. I still really want to sit down and work through all my poorly realized net code and incomplete understanding of ES systems to make Gothic the game it deserves to be. For now it has been moved from &quot;Probably in November&quot; to &quot;Maybe in January&quot;. Not the best news but that&#39;s where it&#39;s at.&lt;br /&gt;
&lt;br /&gt;
Reindeer Rearing will still very likely see updates come December. A large amount of work I am doing for Spooky should be directly applicable to Reindeer Rearing. I&#39;m honestly excited about the chance to clean things up and really fix some of the more game breaking bugs I had left due to time constraints. (Reindeer Rearing was originally made for a Jam).&lt;br /&gt;
&lt;br /&gt;
My current schedule looks something like this: Continue working on Spooky with the hopes of getting a vertical slice level by the end of the month. Once December starts wherever I am at with Spooky will go on hold until I can at least clean up Reindeer Rearing and tackle some of the bigger bugs as well as re-do the sprite system to be in line with Spooky&#39;s sprite system. Once RR has seen enough polish to warrant another update, go back to Spooky.&lt;br /&gt;
&lt;br /&gt;
Next update will have some screenshots no matter how ugly they are!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/7907552939054324955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/11/spooky-progress-and-more-news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/7907552939054324955'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/7907552939054324955'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/11/spooky-progress-and-more-news.html' title='Spooky Progress and More News'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-750346133948492162</id><published>2018-10-04T12:56:00.000-07:00</published><updated>2018-10-04T12:56:42.060-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dawn"/><category scheme="http://www.blogger.com/atom/ns#" term="Gothic"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><category scheme="http://www.blogger.com/atom/ns#" term="Sheep Tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="Spooky"/><title type='text'>A Scheduling Update</title><content type='html'>Hello again! it&#39;s been a couple of months so I figured I should make a post saying what I&#39;ve been up to and my current road map.&lt;br /&gt;
&lt;br /&gt;
First off, I disappeared again after getting another job. Finding good ones is hard, but this one will likely stick for awhile. My hours are a lot better and I have had a LOT more time to work on things, of course I also have my kid, so that&#39;s where a lot of that time went!&lt;br /&gt;
&lt;br /&gt;
I also built a new computer from scratch. This was a much needed upgrade though it did result in a couple of weeks where I didn&#39;t have access to my usual desktop environment. It also lead to me switching from Windows to Linux. I still have a copy of Windows 10 that I mostly use for playing games, I am about 90% on Linux Mint now. This means I have less distractions since most games are a reboot away so I can focus on tasks better.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been working on my programming projects so here&#39;s the quick rundown:&lt;br /&gt;
&lt;br /&gt;
Project Dawn (from WAY back when I first tried making a game in unity) has been re-booted entirely and I&#39;ve actually made a lot of progress. It&#39;s a 3rd person spaceship game somewhere in between the X games and EVE Online. I probably won&#39;t mention more than that for a long time since that&#39;s a very large project and even though I&#39;ve been burning through my checklist it&#39;s still a very long ways from being playable.&lt;br /&gt;
&lt;br /&gt;
Sheep Tutorial is kind of on hiatus for now. I lost some of my source files when I transferred (an issue with getting Linux to play nice with ntfs file systems caused by my relative lack of Linux experience) but it&#39;s not abandoned, just waiting for a long weekend where I can sit down and get back up to speed.&lt;br /&gt;
&lt;br /&gt;
For the month of October I am working on a project called Spooky! It&#39;s planned to be a 2d platformer I am planning to launch on October 31st. More info will come as I make progress worth showing.&lt;br /&gt;
&lt;br /&gt;
If all goes well with Spooky and I get relatively close to my release without any major issues, November will be dedicated to going back and really re-working Gothic. I&#39;ve noticed it&#39;s probably my highest trafficked project and I really sort of dumped it without giving it a proper round of polish. I won&#39;t make any major promises outside of cleaning up the UI and re-working alot of systems that were largely hacked together.&lt;br /&gt;
&lt;br /&gt;
Lastly, December will be Reindeer Rearing&#39;s month of love. I plan on thoroughly re-working it&#39;s systems and giving it a solid round of polish it definitely deserves.&lt;br /&gt;
&lt;br /&gt;
Well that&#39;s pretty much all I have for right now. I hope to have some screenshots and better news to share shortly!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/750346133948492162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/10/a-scheduling-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/750346133948492162'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/750346133948492162'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/10/a-scheduling-update.html' title='A Scheduling Update'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-1869340222704743745</id><published>2018-07-17T17:16:00.000-07:00</published><updated>2018-07-17T17:31:55.389-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Simple Arcade Game 4: User Input and Spatial Controls</title><content type='html'>Welcome back to our simple arcade game tutorial where we look into what it takes to make a very simple, flock herding game using jMonkeyEngine. Today we are going to start adding logic to our game. We are going to start with a simple way to steer the white cube we made last time by reading user input, and applying the movements to our game objects via Controls.&lt;br /&gt;
&lt;br /&gt;
First, let&#39;s look at our GameState class. Our GameState extends AbstractAppState and overrides the Initialize method. We also have a custom method to spawn our player object. We are going to add a few more lines in our Initialize method to handle user input.&lt;br /&gt;
&lt;br /&gt;
First let&#39;s grab the SimpleApplications input manager. The input manager needs to have Mappings added which we will later listen for, so let&#39;s define some static mapping names so they are easy to find later. We then take our InputManager and add our mappings to specific key bindings. For keyboard keys we use a KeyTrigger and grab the keycode from the KeyInput class.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class GameState extends AbstractAppState{
    //We make the input mappings public and static so they are easy to find later
&lt;i&gt;&lt;b&gt;    &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;&lt;b&gt;public static final String PLAYER_FORWARD = &quot;Forward_Move&quot;;
    public static final String PLAYER_BACKWARD = &quot;Backward_Move&quot;;
    public static final String PLAYER_LEFT = &quot;Left_Move&quot;;
    public static final String PLAYER_RIGHT = &quot;Right_Move&quot;;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    private Spatial player;
    private Node scene;

    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        SimpleApplication application = (SimpleApplication)app;
        AssetManager am = application.getAssetManager();
        Node rootNode = application.getRootNode();
        scene = new Node(&quot;Game_Scene&quot;);
        rootNode.attachChild(scene);
        
        player = createPlayer(am);
        scene.attachChild(player);
        
        &lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;b&gt;//configure user input
&lt;/b&gt;&lt;i&gt;&lt;b&gt;        &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;&lt;b&gt;InputManager input = application.getInputManager();
        input.addMapping(PLAYER_FORWARD, new KeyTrigger(KeyInput.KEY_UP));
        input.addMapping(PLAYER_BACKWARD, new KeyTrigger(KeyInput.KEY_DOWN));
        input.addMapping(PLAYER_LEFT, new KeyTrigger(KeyInput.KEY_LEFT));
        input.addMapping(PLAYER_RIGHT, new KeyTrigger(KeyInput.KEY_RIGHT));&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    }
    
    ...
}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
If you run the game now and start pressing the cursor buttons... nothing happens! We still need to register a listener for these mappings. Let&#39;s make GameState implement ActionListener so anything we want to do with player input can be done very easily.&lt;br /&gt;
&lt;br /&gt;
The ActionListener interface has a single method we need to override, the onAction(String name, boolean isPressed, float tpf) method. When we register a listener to the key input, the onAction method gets called from ALL keybindings we register. Therefor, we need to sort through all possible inputs with if or switch statements. I prefer if statements because it is easier to assign blocking vs non blocking keybindings.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class GameState extends AbstractAppState &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;implements ActionListener&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;{
    ...

    @Override
    public void initialize(AppStateManager stateManager, Application app) {

        ...
        
        &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;//disable the default flycam
        &lt;/span&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;application.getStateManager().getState(FlyCamAppState.class).setEnabled(false);&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;

        //configure user input
        InputManager input = application.getInputManager();
        input.addMapping(PLAYER_FORWARD, new KeyTrigger(KeyInput.KEY_UP));
        input.addMapping(PLAYER_BACKWARD, new KeyTrigger(KeyInput.KEY_DOWN));
        input.addMapping(PLAYER_LEFT, new KeyTrigger(KeyInput.KEY_LEFT));
        input.addMapping(PLAYER_RIGHT, new KeyTrigger(KeyInput.KEY_RIGHT));
        //here we register GameState as a listener with the input manager and assign
        //it all the mappings we want to listen to&lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;input.addListener(this, PLAYER_FORWARD, PLAYER_BACKWARD, PLAYER_LEFT, PLAYER_RIGHT);&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    }
    
    ...

   &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;@Override
    public void onAction(String name, boolean isPressed, float tpf) {
        System.out.println(name+&quot; was pressed&quot;);
        //We WANT the forward button press to block a backward button press, so we use if/else
        if(name.equals(PLAYER_FORWARD)){
            
        } else if(name.equals(PLAYER_BACKWARD)){
            
        }
        //we DON&#39;T want the forward or backward buttons to block left and right buttons
        if(name.equals(PLAYER_LEFT)){
            
        } else if(name.equals(PLAYER_RIGHT)){
            
        }
    }&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
}
&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now if you press play you can use the arrow keys to print the name of the binding you are currently pressing to the console. You may also notice the camera moving when you use the arrow keys, this is because SimpleApplication creates a FlyCam by default. It&#39;s easy enough to turn off by adding another line to our Initialize Method.&lt;br /&gt;
&lt;br /&gt;
We have our user input registered with our input manager, now how do we get this to control our cube? The simple answer, Controls. Let&#39;s make a new package &lt;b&gt;com.mrugames.unit &lt;/b&gt;and create a new class, &lt;b&gt;Mob.java&lt;/b&gt;. Mobs in game design lingo are simply mobile entities, or anything that moves. That is exactly what our mob control is going to do, move whatever it is attached to at a specific speed every frame. Make our Mob class extend AbstractControl and override the 2 abstract methods controlUpdate(float tpf) and controlRender(RenderManager rm, ViewPort vp). We won&#39;t be using control render in our mob class, but it is a good place to put render specific code.&lt;br /&gt;
&lt;br /&gt;
For our Mob class we want to store the maximum speed the mob can move as well as the current input direction for the mob. We will assume the input direction is a number between 0 and 1. Every frame that the input direction is greater than 0, we move the mob by it&#39;s maxSpeed*inputDirection*tpf (time per frame).&lt;br /&gt;
&lt;br /&gt;
The Control class has a convenient &quot;spatial&quot; field which you can use to access the Spatial the control is attached to. Spatials also have a convenient &quot;move&quot; method which takes a Vector3f argument.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;http: licenses=&quot;&quot; www.gnu.org=&quot;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;b&gt;&lt;i&gt;public class Mob extends AbstractControl{
    public float maxSpeed = 1f;
    public Vector2f dir = new Vector2f(0,0);

    @Override
    protected void controlUpdate(float tpf) {
        //every frame that dir is greater than 0, move in the direction of dir by
        //our max speed
        if(dir.lengthSquared() &amp;gt; 0){
            //spatial is a protected field inherited from AbstractControl
            spatial.move(dir.x*maxSpeed*tpf, dir.y*maxSpeed*tpf, 0);
        }
    }

    @Override
    protected void controlRender(RenderManager rm, ViewPort vp) {
        
    }
}&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
&lt;/span&gt;&lt;/http:&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now that we have our Mob control, we need to attach it to our player Spatial. We can then access our Mob control in our ActionListener to set the Mob.dir to match the players input.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #dd7700; font-family: &amp;quot;andale mono&amp;quot; , &amp;quot;lucida console&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;fixed&amp;quot; , monospace;&quot;&gt;public class GameState extends AbstractAppState &lt;/span&gt;&lt;span style=&quot;color: #dd7700; font-family: &amp;quot;andale mono&amp;quot; , &amp;quot;lucida console&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;fixed&amp;quot; , monospace;&quot;&gt;implements ActionListener&lt;/span&gt;&lt;span style=&quot;color: #dd7700; font-family: &amp;quot;andale mono&amp;quot; , &amp;quot;lucida console&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;fixed&amp;quot; , monospace;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;    

    ...

    private Spatial createPlayer(AssetManager am){
        Mesh mesh = new Box(0.5f,0.5f,1f);
        Geometry geo = new Geometry(&quot;Player&quot;, mesh);
        Material mat = new Material(am, &quot;Common/MatDefs/Misc/Unshaded.j3md&quot;);
        geo.setMaterial(mat);
        &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;//Add a new Mob control to the player&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;geo.addControl(new Mob());&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        return geo;
    }    

    ...

    @Override
    public void onAction(String name, boolean isPressed, float tpf) {
        &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;Mob playerMob = player.getControl(Mob.class);&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;//We WANT the forward button press to block a backward button press, so we use if/else&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        if(name.equals(PLAYER_FORWARD)){
            &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;if(isPressed){
                //Called the frame the button was pressed down
                playerMob.dir.y =1 ;
            } else{
                //Called the frame the button was released
                playerMob.dir.y = 0;
            }&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        } else if(name.equals(PLAYER_BACKWARD)){
            &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;if(isPressed){
                playerMob.dir.y = -1;
            } else{
                playerMob.dir.y = 0;
            }&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        }
        &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;//we DON&#39;T want the forward or backward buttons to block left and right buttons&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        if(name.equals(PLAYER_LEFT)){
            &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;if(isPressed){
                playerMob.dir.x = -1;
            } else{
                playerMob.dir.x = 0;
            }&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        } else if(name.equals(PLAYER_RIGHT)){
            &lt;/span&gt;&lt;b style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;if(isPressed){
                playerMob.dir.x = 1;
            } else{
                playerMob.dir.x = 0;
            }&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        }
    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
As you see there are some simple tricks we use to process the player input. The ifPressed variable will be true the frame that the player activates the mapping, and false on the frame that the mapping is deactivated. This makes on/off functionality easy. If you need to be notified every frame that a mapping is being activated, take a look at the AnalogListener class. We will cover the AnalogListener in more detail later.&lt;br /&gt;
&lt;br /&gt;
Go ahead and press play! You&#39;ll see our little cube drift around the screen corresponding to your button presses.</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/1869340222704743745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/07/simple-arcade-game-4-user-input-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/1869340222704743745'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/1869340222704743745'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/07/simple-arcade-game-4-user-input-and.html' title='Simple Arcade Game 4: User Input and Spatial Controls'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-965484506317568861</id><published>2018-07-02T16:45:00.000-07:00</published><updated>2018-07-17T17:27:52.295-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Simple Arcade Game 3: Scenegraph</title><content type='html'>Hello again and welcome to another jMonkey Engine tutorial! Today we are going to take a detailed look at probably the most important aspect of jMonkey Engine, it&#39;s Scenegraph.&lt;br /&gt;
&lt;br /&gt;
A great overview of how jme uses it&#39;s scenegraph is available &lt;a href=&quot;https://wiki.jmonkeyengine.org/jme3/the_scene_graph.html&quot;&gt;here&lt;/a&gt;, but I&#39;ll run a brief overview for those who want to dive right in.&lt;br /&gt;
&lt;br /&gt;
The Scene in jme is made up of Spatials, mostly Nodes and Geometries. Nodes do not have any visual elements, but can have children elements. Geometries have meshes and materials and will be rendered, these are the elements you actually see! All spatials must be connected to the RootNode, which is the top most node in the scene. You can easily make complex or large scale models with many moving parts by mixing Nodes and Geometries.&lt;br /&gt;
&lt;br /&gt;
The most important thing to remember: &lt;u&gt;DO NOT EXTEND NODE, GEOMETRY OR SPATIAL&lt;/u&gt;. Instead you should store your game data seperately, in the Spatial&#39;s UserData container, or as a Control which is attached to a spatial.&lt;br /&gt;
&lt;br /&gt;
UserData can be any Object and is easily written by using Spatial.setUserData(String key, Object data), and later retrieved using Spatial.getUserData(String key).&lt;br /&gt;
&lt;br /&gt;
Controls are a lot like AppStates, except they only work on the spatial they are attached to. We will go over Controls in a later tutorial, but if you are interested in making your own controls now they are easily attached to a spatial using Spatial.addControl(Control control), and retrieved by using Spatial.getControl(Class&amp;lt;T&amp;gt; controlType) where T extends Control.&lt;br /&gt;
&lt;br /&gt;
We are going to make a new appstate for our game, let&#39;s call it &quot;GameState&quot;. We need to override the &quot;initialize&quot; method as this is where we will be modifying our scene.&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;b&gt;&lt;i&gt;public class GameState extends AbstractAppState{
    private Spatial player;
    private Node scene;

    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        SimpleApplication application = (SimpleApplication)app;
        AssetManager am = application.getAssetManager();
        Node rootNode = application.getRootNode();
        scene = new Node(&quot;Game_Scene&quot;);
        rootNode.attachChild(scene);
    }
    
}&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Lets go ahead and cast the Application app to a SimpleApplication so we can access our RootNode and the AssetManager. We should also define a Spatial object that will reference the Players spatial so we can easily find it later. We also define a Node for the Scene. Create a new Node with a string argument for the node&#39;s name and attach it to the root node via the Node.attachChild() method. We will be attaching all the game objects to the game scene instead of the root node to keep them separated and easy to work with!&lt;br /&gt;
&lt;br /&gt;
Now let&#39;s define a new method to create our player object. We will eventually be using a Dragon model, but for now let&#39;s simple spawn a box to represent our player. First we define a new method, createPlayer(AssetManager am). We are going to pass the assetManager from our Application object to this method to allow the use of pre-defined material definitions which really speed this process.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class GameState extends AbstractAppState{

    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        SimpleApplication application = (SimpleApplication)app;
        AssetManager am = application.getAssetManager();
        Node rootNode = application.getRootNode();
        scene = new Node(&quot;Game_Scene&quot;);
        rootNode.attachChild(scene);

&lt;b&gt;&lt;i&gt;       &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b; font-style: italic;&quot;&gt; player = createPlayer(am);
        scene.attachChild(player);&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;i&gt;
    &lt;/i&gt;}&lt;i&gt;

   &lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6b26b; font-style: italic;&quot;&gt; private Spatial createPlayer(AssetManager am){
        Mesh mesh = new Box(0.5f,0.5f,1f);
        Geometry geo = new Geometry(&quot;Player&quot;, mesh);
        Material mat = new Material(am, &quot;Common/MatDefs/Misc/Unshaded.j3md&quot;);
        geo.setMaterial(mat);
        return geo;
    }&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Spawning a model is as simple as creating a geometry, giving it a mesh and a material. Here we use the Box shape to create our mesh. With 3 floating point arguments we construct a box that extends into the x, y and z axis by the given amount. This will give us a box that is actually 1x1x2. Simply pass the mesh to the Geometry as an argument along with a String name to attach the mesh to the geometry.&lt;br /&gt;
&lt;br /&gt;
Next we create the material. Here we are using a Material Definition which is how jmonkey defines what pixel and vertex shaders control the material. We are using the built-in material definition for Unshaded objects by simply defining the path to the j3md file. You can view other material definitions included in the jme3 library in the jme3-core.jar/Common/MatDefs. Call Geometry.setMaterial() and we are finished.&lt;br /&gt;
&lt;br /&gt;
In the initialize method add the 2 lines player = createPlayer(am) and scene.attachChild(player).&lt;br /&gt;
&lt;br /&gt;
This is enough to have our GameState spawn a player object and attach it to the GameScene node, which in turn is attached to the RootNode and will be rendered. Now we need to attach the GameState to the AppStateManager, let&#39;s do this in our MainMenu state so in the future we can have a button start the game.&lt;br /&gt;
&lt;br /&gt;
Open our MainMenu appstate and add the following lines.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class MainMenu extends AbstractAppState {
&lt;b&gt;&lt;i&gt;    &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6b26b; font-style: italic; font-weight: bold;&quot;&gt;private AppStateManager stateManager;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
    &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f6b26b; font-style: italic; font-weight: bold;&quot;&gt;private float countDown = 3f;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    private BitmapText text;

    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
&lt;b&gt;&lt;i&gt;        &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;this.stateManager = stateManager;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        
        ...
    }
    
&lt;b&gt;&lt;i&gt;    &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;@Override
    public void update(float tpf) {
        if((countDown -= tpf) &amp;lt;= 0){
            stateManager.detach(this);
            stateManager.attach(new GameState());
        }
    }&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    
    ...
}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
First we need to define 2 new fields, stateManager and countDown. The state manager is passed via the initialize() method when the AppState is attached to the AppStateManager. Go ahead and assign this via &quot;this.stateManager = stateManager&quot; so we can access it later.&lt;br /&gt;
&lt;br /&gt;
Then in our update loop we are going to count down from 3. Once our countdown is equal to or less than 0, we will remove MainMenu from our AppStateManager and attach a new GameState. Do this by simple subtracting tpf from countDown once a frame and checking with a basic if statement. Remember, in a video game you NEVER want to use wait() as this will completely lock your thread from doing other things. Making simple timers like the one above is easy and guarantees that your other appstates have a chance to&amp;nbsp; run their updates while we wait.&lt;br /&gt;
&lt;br /&gt;
Now if you press Play you will see our lovely Main Menu for approximately 3 seconds before being taken to our game state, and spawning in a simple, white cube!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/965484506317568861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/07/simple-arcade-game-3-scenegraph.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/965484506317568861'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/965484506317568861'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/07/simple-arcade-game-3-scenegraph.html' title='Simple Arcade Game 3: Scenegraph'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-756889097305842806</id><published>2018-06-02T11:15:00.000-07:00</published><updated>2018-07-02T18:35:04.197-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Universal Sound Board side project</title><content type='html'>I&#39;ve been quiet the past month and a half, but I haven&#39;t stopped working. I&#39;m still working on the tutorial series for jme3 and I&#39;ll hopefully get the next article up in the next couple of weeks. In the meantime I made a fun little soundboard app!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/qs-dragon/UniversalSoundBoard&quot;&gt;Universal Sound Board&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Instead of making a keybinding for every sound file you want to play (ctrl-h for hello.wav, ctrl-g for goodbye.wav) with this soundboard you can make custom &quot;key combos&quot; that lead to your desired sound. Turn on the key-capture with a user defined key (ctrl-v by default) and enter the combo for your sound. This lets you make as many sounds as you want in easy to remember combos! ctrl-v, h for hello, ctrl-v ty for thank you. The possibilities are endless.&lt;br /&gt;
&lt;br /&gt;
The only restriction is you cannot assign a sound &quot;passed&quot; another sound. If you have &quot;h&quot; as hello, you couldn&#39;t make &quot;hg&quot; as goodbye, since it&#39;ll start playing &quot;hello&quot; first! I suggest you make your combos at least 1 or 2 letters deep to prevent them from stepping on eachother. g-h and g-g could be &quot;hello&quot; and &quot;goodbye&quot; respectively, and you could still use &quot;h&quot; seperately, or as the start of even more combos.&lt;br /&gt;
&lt;br /&gt;
I hope some of you find this interesting and make some fun soundboards. Install a virtual audio cable for twice the fun ;)</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/756889097305842806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/06/universal-sound-board-side-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/756889097305842806'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/756889097305842806'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/06/universal-sound-board-side-project.html' title='Universal Sound Board side project'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-8031269370259014926</id><published>2018-04-13T17:05:00.001-07:00</published><updated>2018-07-17T17:26:42.273-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Simple Arcade Game 2: Intro to Appstates</title><content type='html'>Welcome back to another lesson in making a simple arcade game in jMonkey Engine. last time we got the jme sdk installed and created our project. Today we will look at jMonkeys powerful appstates, input handling and a first glance at the scenegraph.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s open up our project and take a look at the example class that was provided.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed #999999; color: #dd7700; font-family: &amp;quot;andale mono&amp;quot; , &amp;quot;lucida console&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;fixed&amp;quot; , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;public class Main extends SimpleApplication {

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

    @Override
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1);
        Geometry geom = new Geometry(&quot;Box&quot;, b);

        Material mat = new Material(assetManager, &quot;Common/MatDefs/Misc/Unshaded.j3md&quot;);
        mat.setColor(&quot;Color&quot;, ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom);
    }

    @Override
    public void simpleUpdate(float tpf) {
        //TODO: add update code
    }

    @Override
    public void simpleRender(RenderManager rm) {
        //TODO: add render code
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The first part is our java main method. This is called by the jvm, and here we create our jmonkey application.&lt;br /&gt;
&lt;br /&gt;
Next is the SimpleApplication method, simpleInitApp(). This is called after the application is created and has finished starting up all of jmonkey&#39;s dependencies, but before simpleUpdate and simpleRender. Here you can initialize the game state, create game objects and modify the scene graph. By default it creates a box mesh, wraps it in a geometry, assigns a blue material to the geometry and attaches the geometry to the scene graph. We&#39;ll discuss geometries and the scene graph in more detail later.&lt;br /&gt;
&lt;br /&gt;
Next up is the simpleUpdate method from SimpleApplication. SimpleUpdate is called once every frame and is where you should store game logic that happens over time. Frames are called as fast as possible, and while your game is small it&#39;s very possible to see 4000+ frames called every second. The argument &quot;tpf&quot; (Time Per Frame) is used to provide you with the amount of time, in seconds, the previous frame took to execute. This value is what you will use to move objects smoothly and consistently.&lt;br /&gt;
&lt;br /&gt;
The last method created by default is the simpleRender method. We will not be using the simpleRender method for our simple arcade game and it is safe to simply remove it for now. SimpleRender is called after the simpleUpdate method and can be used to modify how the scene is rendered through the RenderManager. It is not safe to modify the scenegraph from this method.&lt;br /&gt;
&lt;br /&gt;
You may be tempted to start writing your game logic and putting it all in the nice simpleUpdate method, and you wouldn&#39;t be wrong to do so. Super small games can easily exist entirely within one class and you could get away with using your SimpleApplication for most of your game logic, but did you know there&#39;s a better way?&lt;br /&gt;
&lt;br /&gt;
JMonkey provides us with a concept called &quot;App States&quot;. An appstate is a confined version of simpleInit and simpleUpdate which can be attached to a simple application and every frame all of your appstates will be executed before calling simpleUpdate.&lt;br /&gt;
&lt;br /&gt;
Why would you want to use an appstate? The answer is simple, you can seperate un related code, easily pause/unpause or remove game logic simply by attaching or removing your appstates. You can have a main menu appstate, which you disable when you start your game appstate. Your game appstate could create several additional app states to process the game state. When you press the pause button you can easily pause only the game appstate while activating a new pause menu appstate and so on. Appstates make game design easy and robust and are one of jmonkey&#39;s most powerful features. Let&#39;s go ahead and create a main menu state right now!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxGVfQR8UZ6pOWn32p6_N7uAREI_J9kVCBE-k3Sd1V8Lbz-K305i_0f84TsqX2dCMmPy1bQ6SsA4Cnp_q2wEtzaShvVOJJWVvDTe8cknjBe9IpQ6S-vXieD8pGMx88hilELFxcV6JQn3Zt/s1600/NewOther.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;334&quot; data-original-width=&quot;500&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxGVfQR8UZ6pOWn32p6_N7uAREI_J9kVCBE-k3Sd1V8Lbz-K305i_0f84TsqX2dCMmPy1bQ6SsA4Cnp_q2wEtzaShvVOJJWVvDTe8cknjBe9IpQ6S-vXieD8pGMx88hilELFxcV6JQn3Zt/s320/NewOther.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In the sdk right click the package that contains your Main class and select &quot;New/Other.&quot; From there select JME3 Classes category and under File Type choose &quot;New AppState.&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0TZkUV-jEaO82qLqyEjZumLTA9XAIlnv-ClgTBP1AF0eaUQKcVqF3n6EMYbCfkoOTiL1JehxlGKW1AnIpxeAPOdVNRn4imBuhF32Zkue22uNcdZXqkrbI8taHdVTwKhHCrcBR5Y7ugAqg/s1600/NewAppstate.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;503&quot; data-original-width=&quot;716&quot; height=&quot;224&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0TZkUV-jEaO82qLqyEjZumLTA9XAIlnv-ClgTBP1AF0eaUQKcVqF3n6EMYbCfkoOTiL1JehxlGKW1AnIpxeAPOdVNRn4imBuhF32Zkue22uNcdZXqkrbI8taHdVTwKhHCrcBR5Y7ugAqg/s320/NewAppstate.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
Let&#39;s name our new appstate &quot;MainMenu&quot; and click finish. You should have a class named &quot;MainMenu&quot; with the following code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed #999999; color: #dd7700; font-family: &amp;quot;andale mono&amp;quot; , &amp;quot;lucida console&amp;quot; , &amp;quot;monaco&amp;quot; , &amp;quot;fixed&amp;quot; , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;public class MainMenu extends AbstractAppState {
    
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        //TODO: initialize your AppState, e.g. attach spatials to rootNode
        //this is called on the OpenGL thread after the AppState has been attached
    }
    
    @Override
    public void update(float tpf) {
        //TODO: implement behavior during runtime
    }
    
    @Override
    public void cleanup() {
        super.cleanup();
        //TODO: clean up what you initialized in the initialize method,
        //e.g. remove all spatials from rootNode
        //this is called on the OpenGL thread after the AppState has been detached
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Looks familiar doesn&#39;t it? You have an initialize method which is called before any update method the frame the appstate gets added to your application. Next is the update method, called once a frame before the SimpleApplication&#39;s update.&lt;br /&gt;
&lt;br /&gt;
The last method is a new one, cleanup(). Cleanup is called before any update on the frame after an appstate has been removed from the application. This is how you can remove any objects associated with your appstate from the scenegraph.&lt;br /&gt;
&lt;br /&gt;
Now lets have this appstate display something when we activate it!&lt;br /&gt;
&lt;br /&gt;
Out of the box JME doesn&#39;t have the most robust built in gui library, but it does have plenty to get us started. We&#39;ll make use of the BitmapFont and BitmapText classes to display a simple label on the screen.&lt;br /&gt;
&lt;br /&gt;
First let&#39;s add a private field to MainMenu to hold a reference to our BitmapText object. Then we need to load the default font file provided with jme. To load assets we&#39;ll use the Applications asset manager. BitmapFont has a method, &quot;createLabel&quot; that will create a jme spatial we can attach to the scene graph. To display the text we need to attach it to SimpleApplications default gui node. We&#39;ll need to cast app to accomplish this.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class MainMenu extends AbstractAppState {
    &lt;span style=&quot;color: black; font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;&lt;b&gt;private BitmapText text;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;

    @Override
    public void initialize(AppStateManager stateManager, Application app){
        //jME has a built in font which can be loaded from &quot;Interface/Fonts/Default.fnt&quot;
        &lt;/span&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;i&gt;&lt;b&gt;BitmapFont font = app.getAssetManager().loadFont(&quot;Interface/Fonts/Default.fnt&quot;);
        text = font.createLabel(&quot;Hello jMonkey Engine!&quot;);&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;((SimpleApplication)app).getGuiNode().attachChild(text);&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This will attach our text to the origin point of the Gui Node. We&#39;ll go more in depth with the scene graph next time, for now you only need to know there are 2 scenes included with SimpleApplication, the Gui scene and the Root scene.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s hop back to our Main class and create an instance of our appstate. Go ahead and delete everything in simpleInitApp(), we don&#39;t want the blue cube anymore.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
public class Main extends SimpleApplication {

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

    @Override
    public void simpleInitApp() {
        &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;MainMenu menu = new MainMenu();
        stateManager.attach(menu);&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
        &lt;/span&gt;&lt;strike&gt;&lt;span style=&quot;color: #783f04;&quot;&gt;Box b = new Box(1, 1, 1);
        Geometry geom = new Geometry(&quot;Box&quot;, b);

        Material mat = new Material(assetManager, &quot;Common/MatDefs/Misc/Unshaded.j3md&quot;);
        mat.setColor(&quot;Color&quot;, ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom);&lt;/span&gt;&lt;/strike&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;
    }

    @Override
    public void simpleUpdate(float tpf) {
        //TODO: add update code
    }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now if you hit play, you don&#39;t see anything. This is because of how jmonkey handles the gui scene. Our text is spawning at 0,0 and going DOWN, which pushes it off of our screen! not good, let&#39;s fix it! Go back to the MainMenu appstate and let&#39;s move the text.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #292929; border: 1px dashed rgb(153, 153, 153); font-family: &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;public class MainMenu extends AbstractAppState {
    private BitmapText text;
    
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        
        BitmapFont font = app.getAssetManager().loadFont(&quot;Interface/Fonts/Default.fnt&quot;);
        text = font.createLabel(&quot;Hello jMonkey Engine!&quot;);
        
        &lt;/span&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;//set the text to the center of the screen
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;Camera cam = app.getCamera();&lt;/span&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;int width = cam.getWidth();&lt;/span&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;int height = cam.getHeight();&lt;/span&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;float x = (width/2)-(text.getLineWidth()/2);&lt;/span&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;float y = (height/2)+(text.getLineHeight()/2);&lt;/span&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;
        &lt;/b&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;text.setLocalTranslation(x, y, 0);
&lt;/span&gt;
&lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;        ((SimpleApplication)app).getGuiNode().attachChild(text);
    }
    
    @Override
    public void update(float tpf) {
        //TODO: implement behavior during runtime
    }
    
    &lt;/span&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;@Override
    public void cleanup() {&lt;b&gt;
        &lt;/b&gt;&lt;/span&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;super.cleanup();&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: #dd7700; font-weight: bold;&quot;&gt;
        &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #f6b26b;&quot;&gt;text.removeFromParent();&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #dd7700;&quot;&gt;&lt;b&gt;
&lt;/b&gt;    }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Wait, that&#39;s a lot of new code! It&#39;s ok, first we need our applications resolution, the easiest way to get this is from our camera&#39;s width and height. Next we find the center. The gui origin is the bottom left, and text grows from the top down. Lastly we need to set the translation with setLocalTranslation.&lt;br /&gt;
&lt;br /&gt;
Now is also a good time to remove the text from the scenegraph in our cleanup method, this way when the appstate is closed the text will go with it!&lt;br /&gt;
&lt;br /&gt;
Now try pressing play. Your message should be nicely visible in the center of the screen!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0sU7djpLkPIU0J2w7Ze4I1iRC11ws_N5OdxX3yPe0MKms0HSnGzJIXJnnGpuRLjVWrj-aqGoPGwcLXG5foXlpprSaPngDdgZUh_LIbM6bmqMfM0kfVjnxpLThILLM66pJNFUl6PIiHmEY/s1600/FinalProduct.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;507&quot; data-original-width=&quot;642&quot; height=&quot;252&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0sU7djpLkPIU0J2w7Ze4I1iRC11ws_N5OdxX3yPe0MKms0HSnGzJIXJnnGpuRLjVWrj-aqGoPGwcLXG5foXlpprSaPngDdgZUh_LIbM6bmqMfM0kfVjnxpLThILLM66pJNFUl6PIiHmEY/s320/FinalProduct.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
That&#39;s the basics to Appstates, you can create them, attach and detach them to add and remove game behaviors. There is also a convenient setEnabled() method you can use to pause an appstate you don&#39;t want to remove completely. We&#39;ll be making extensive use of appstates to get our simple arcade game running well!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/8031269370259014926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/04/simple-arcade-game-2-simple-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/8031269370259014926'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/8031269370259014926'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/04/simple-arcade-game-2-simple-application.html' title='Simple Arcade Game 2: Intro to Appstates'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxGVfQR8UZ6pOWn32p6_N7uAREI_J9kVCBE-k3Sd1V8Lbz-K305i_0f84TsqX2dCMmPy1bQ6SsA4Cnp_q2wEtzaShvVOJJWVvDTe8cknjBe9IpQ6S-vXieD8pGMx88hilELFxcV6JQn3Zt/s72-c/NewOther.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-4243621511419691769</id><published>2018-03-31T09:16:00.000-07:00</published><updated>2018-04-05T12:58:38.167-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how to"/><category scheme="http://www.blogger.com/atom/ns#" term="jmonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Simple Arcade Game 1: Installing JME</title><content type='html'>Welcome to part 1 of making a simple arcade game in jMonkey Engine! In this series we are going to look at making a simple top down game about herding sheep. The focus of these tutorials will be primarily on learning how to use JME to accomplish simple game mechanics and get you started on a project of your own. We&#39;ll cover topics such as app states, controls, the scene graph, transforms in 3d space, the asset pipeline and any other topics that crop up while we are finishing this simple game. Before we can dive into writing our first game, we need to get jMonkey Engine to run!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
JME is a java library, and of course you will need a version of jdk found &lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/index.html&quot;&gt;here&lt;/a&gt;. I&#39;ll assume you have at least jdk8 installed for these tutorials.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The simplest way to work with jMonkey Engine is to install the latest community SDK. The JME SDK is a customized version of the Netbeans IDE with some very helpful features that will make working with JME much simpler. It is possible to use your own IDE, or even a text editor and compile on your own, but for this series I will assume you are using the provided SDK and it&#39;s helpful JME integrations.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Go ahead and download the&amp;nbsp;&lt;a href=&quot;https://github.com/jMonkeyEngine/sdk/releases&quot;&gt;jMonkey SDK here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you are wondering why my screenshots look different, it&#39;s because I use the awesome &quot;DarkMonkey&quot; plugin available under &quot;Tools/Plugins&quot; You may want to look through what plugins are available and see if there are any that interest you or might make development easier.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div&gt;
Once you have the SDK installed you will need to create a new project. In the top left go to &quot;File/New Project...&quot; under Categories choose &quot;JME3&quot; and under Projects choose &quot;Basic Game.&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit05aWod4OJjwN2YNZ2q66ox8A4g7FIMatBZy3KD7Mqj2nafs93NFb-MDenjcsIUOgLZJybQqfufc8raK5tDdP0X9Y-U45L-oTzp1FJW1J2dgMjAS-rDWQXt199vgpY1zOrMtOoMBLpkik/s1600/newproj.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;600&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit05aWod4OJjwN2YNZ2q66ox8A4g7FIMatBZy3KD7Mqj2nafs93NFb-MDenjcsIUOgLZJybQqfufc8raK5tDdP0X9Y-U45L-oTzp1FJW1J2dgMjAS-rDWQXt199vgpY1zOrMtOoMBLpkik/s320/newproj.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWISvlXFmgRxJg8HNp8ZELewn3ZiyPgGjCNIGr1dgBb3AxDP9e7q-MGEZzmVCMpK0_Bkle7km8uyOXFvyiZVW-W2KhqBbHcbZr5BKx26Py-wdR2GlIWeo5hO0aOLjI-Tuqx8tcsR8SKZiv/s1600/cat.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;506&quot; data-original-width=&quot;727&quot; height=&quot;222&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWISvlXFmgRxJg8HNp8ZELewn3ZiyPgGjCNIGr1dgBb3AxDP9e7q-MGEZzmVCMpK0_Bkle7km8uyOXFvyiZVW-W2KhqBbHcbZr5BKx26Py-wdR2GlIWeo5hO0aOLjI-Tuqx8tcsR8SKZiv/s320/cat.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Click Next and choose a name for the project and a folder to store all the project files in. I am naming this project &quot;SheepTut&quot; and storing it in a folder on my secondary drive. Be sure you have access to the folder you choose as you will be adding and removing files often.&lt;br /&gt;
&lt;br /&gt;
Now you have your project created, it should be visible on the left under the &quot;Projects&quot; tab. If for some reason you don&#39;t see the projects tab, go to &quot;Windows/Projects&quot; or press &quot;CTRL-1&quot; to open a new projects tab. I keep this docked on the left side for convenience. If you open up all of the project folders you should see something like this:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvGYbskzkkObdpRlhUQMdm7dvwtSNT69dmb2CY14L548K89qOV6wl0MJK2BnIryehe4blL3WCt16aakMG1TXtE3f8JPe3d-M9wByPERYJReJMeHv4jWf0nLwrkFR7vW2JdP3r2cyPhveci/s1600/ProjectOverview.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;690&quot; data-original-width=&quot;335&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvGYbskzkkObdpRlhUQMdm7dvwtSNT69dmb2CY14L548K89qOV6wl0MJK2BnIryehe4blL3WCt16aakMG1TXtE3f8JPe3d-M9wByPERYJReJMeHv4jWf0nLwrkFR7vW2JdP3r2cyPhveci/s320/ProjectOverview.jpg&quot; width=&quot;155&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If your source packages and libraries look different, right click in a blank area in the Projects tab and select &quot;View Java Packages As...&quot; and select &quot;Reduced Tree.&quot;&lt;br /&gt;
&lt;br /&gt;
So what are we looking at here? Well first is the Project Assets folder. This folder will be packaged inside the .jar file when you build the project and is where you will be storing all of your game assets, 3d models, textures, sound files, etc. It comes pre-filled with some sub-folders which are all empty by default. This is fine, we&#39;ll be adding our own files soon enough.&lt;br /&gt;
&lt;br /&gt;
Next is the Source Packages. These are all of your Java class files and where you will actually be building your game. Right now it has 1 package called &quot;mygame&quot; with 1 Main class. Feel free to create a new package if you would prefer something more descriptive. Java convention states packages should be named after their &quot;reverse internet domain name&quot; so I&#39;ll go ahead and create a new package called &quot;com.mrugames.&quot; and click and drag the Main class into my new package.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QPkDHH8_rrkzrBndiOV6AxpOXbZMvQFAFyO6SN7PcOAB4aKkiWPkjqDubY2EKP5e4ZsTJT0yhYFB0b5Q88rpuM8WaL5LbpLcIKErRaSxfnrREAPUjVDZBE8w4ASbIIAJytIPQ2YoSdXh/s1600/NewPackage.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;266&quot; data-original-width=&quot;436&quot; height=&quot;195&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QPkDHH8_rrkzrBndiOV6AxpOXbZMvQFAFyO6SN7PcOAB4aKkiWPkjqDubY2EKP5e4ZsTJT0yhYFB0b5Q88rpuM8WaL5LbpLcIKErRaSxfnrREAPUjVDZBE8w4ASbIIAJytIPQ2YoSdXh/s320/NewPackage.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When clicking and dragging a java class it will ask if you wish to refactor, click yes to let the SDK handle formatting the class to it&#39;s new package.&lt;br /&gt;
&lt;br /&gt;
The next thing listed in your project tab is the Libraries. This contains all the jMonkey Engine libraries you will need to run your game, as well as your JDK libraries for the version of Java that is installed. If you wish to change the JDK simply right click on your project, go to properties and under Source/Binary file select the JDK you wish to use. If you do not see the version of JDK you were hoping to use and it is installed on your system, then go to Tools/Java Platforms, Add Platform and follow the wizard to locate your JDK.&lt;br /&gt;
&lt;br /&gt;
The last folder listed is called &quot;Important Files.&quot; This contains your build file which you will probably not need to edit. The SDK should be able to modify this file for you as needed through project properties. If you do find yourself needing to modify the build script, this is the quickest way to find it.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Now that you are familiar with the jMonkey project, let&#39;s open the Main class that was generated an run it! Simply double click Main.java and you will be greeted with a class that extends Simple Application and has 4 methods, a main(), a simpleInitApp(), a simpleUpdate() and a simpleRender(). You should be able to press Run Project(F6) and be greeted by the jMonkeyEngine splash screen!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaITzYeFEH4il_9zjimZI9lgzdM_BWk9mQfsx45c7eeBJhC37zqq6A0fjKMwMUF9UQNh2xSOw6qiycNxMNnGuLDFtIIFbeh-M1DcQv4ATXpmHmrvqvB-pnIlrgjT8j8GgAXNskhpUZRk-4/s1600/Play.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;600&quot; height=&quot;213&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaITzYeFEH4il_9zjimZI9lgzdM_BWk9mQfsx45c7eeBJhC37zqq6A0fjKMwMUF9UQNh2xSOw6qiycNxMNnGuLDFtIIFbeh-M1DcQv4ATXpmHmrvqvB-pnIlrgjT8j8GgAXNskhpUZRk-4/s320/Play.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiukIwg5daTTlHT3KYCwlzvxGlsqNVK1IglmfmzKP0axfFS-P-0T6lhlk5gLr5FHKDC0ifvtcXN5iH2i2cez3SbUp7vxB-QdigiQzdAmP_rVEP6jiaZbu3CQF9-8n1Lk1xZtE_AOMawcVIr/s1600/Splash.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;635&quot; data-original-width=&quot;512&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiukIwg5daTTlHT3KYCwlzvxGlsqNVK1IglmfmzKP0axfFS-P-0T6lhlk5gLr5FHKDC0ifvtcXN5iH2i2cez3SbUp7vxB-QdigiQzdAmP_rVEP6jiaZbu3CQF9-8n1Lk1xZtE_AOMawcVIr/s320/Splash.jpg&quot; width=&quot;258&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Press continue to finally run your first jMonkey Engine game:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsFgKi1kB-9iPgtMbhr7_ZHB4TuKuhHSyGRB011xxqCU9glSb8cAl8WJuW9yHrmzN2VWTjVIgmjemILQu_dOK5NHwosh_QdUtpi8CRaE2uLzeuLL1T8w5GCSUrNfeZECa31TV7YDDM4phu/s1600/blucub.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;504&quot; data-original-width=&quot;639&quot; height=&quot;252&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsFgKi1kB-9iPgtMbhr7_ZHB4TuKuhHSyGRB011xxqCU9glSb8cAl8WJuW9yHrmzN2VWTjVIgmjemILQu_dOK5NHwosh_QdUtpi8CRaE2uLzeuLL1T8w5GCSUrNfeZECa31TV7YDDM4phu/s320/blucub.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Congrats! You managed to get jMonkey Engine SDK to run and created your first project! If you had any difficulties getting this far feel free to leave a comment either here, on this blog or at the &lt;a href=&quot;https://hub.jmonkeyengine.org/&quot;&gt;jMonkey Engine forum&lt;/a&gt; where either myself or someone from the super helpful community can point you in the right direction.&lt;br /&gt;
&lt;br /&gt;
Next time we will take a closer look at the Simple Application class, the BaseAppState class and how jMonkey handles frame updates!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/4243621511419691769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/03/simple-arcade-game-1-installing-jme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4243621511419691769'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4243621511419691769'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/03/simple-arcade-game-1-installing-jme.html' title='Simple Arcade Game 1: Installing JME'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit05aWod4OJjwN2YNZ2q66ox8A4g7FIMatBZy3KD7Mqj2nafs93NFb-MDenjcsIUOgLZJybQqfufc8raK5tDdP0X9Y-U45L-oTzp1FJW1J2dgMjAS-rDWQXt199vgpY1zOrMtOoMBLpkik/s72-c/newproj.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-5357667181097120223</id><published>2018-02-28T19:46:00.002-08:00</published><updated>2018-07-02T18:18:10.012-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>The need for sheep</title><content type='html'>&lt;br /&gt;
Hello, today I&#39;m going to talk about a little project I&#39;ve been working on to address something that&#39;s severely lacking from my favorite game engine, tutorials! That&#39;s right, I&#39;ve been working on a super simple project with the intent on turning it into a short tutorial series!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qHbIIXlLIxAzFP-NEWN_ar4Mh5-3BbJfnfPB1sWYfPWBbopWMEC0VhaLboveDGh-qrGvU1FMCFnJDSC2xzWcPbBtYZRd2dQANYDjJ13rdq7j4h0Q0BOP7kp3OAXMoyzajfPhqTkrq3V9/s1600/FieldApp2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;640&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qHbIIXlLIxAzFP-NEWN_ar4Mh5-3BbJfnfPB1sWYfPWBbopWMEC0VhaLboveDGh-qrGvU1FMCFnJDSC2xzWcPbBtYZRd2dQANYDjJ13rdq7j4h0Q0BOP7kp3OAXMoyzajfPhqTkrq3V9/s320/FieldApp2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Now some of you may be familiar with another blog I started once upon a time, &lt;a href=&quot;http://adventuresinjme.blogspot.com/2013/07/gui-101.html&quot;&gt;Adventures in jMonkey Engine&lt;/a&gt;. (WOW, was that really 5 years ago?) Back then I barely understood java let alone jMonkey as a game engine. I started the blog with the intent of &quot;learning&quot; both java and jme through teaching it. I wound up giving up on after I hit a major roadblock on my rc car game project which ended in my taking a hiatus from game development for several months and generally forgetting I had that blog at all.&lt;br /&gt;
&lt;br /&gt;
Back to the present, my wife recently told me she wants to learn java and help me make games! She has absolutely 0 experience with java and programming in general, but she loves video games, which is honestly all I think you really need nowadays.&lt;br /&gt;
&lt;br /&gt;
I decided to make some new tutorials that approach jMonkey&#39;s way of doing things and really showing how to utilize the different aspects of the game engine. I&#39;ll focus on setting up the jMonkey IDE and focusing on best practices for creating games in jme. There are a few tutorials out there already but a lot of them are old or are long videos with no voice over and showing a highlighted mouse waving in front of what is being demonstrated. jMonkey doesn&#39;t have many tutorials that could be compared to what more mainstream engines have such as Unity&#39;s &quot;how to make an fps&quot; tutorials.&lt;br /&gt;
&lt;br /&gt;
So I&#39;m finishing up a small demonstration game which I will then break into pieces and put together a &quot;how to make a game in jme&quot; series which will be uploaded to this blog and maybe youtube(not sure). Here&#39;s a couple screenshots showing where the game is now. It&#39;s still a little early so some assets will change but the core gameplay is set!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcU4CpSwhQ1Q8j-J5WUFmHbDfmsrpkCyKgbU27fpNABpsaLNBpRfSADGo2rKnI_ymq2eL3hTVM4CyYP1mMx1907k9Mq8FIqSbV8bBlUT3YLvg-IqC4DCMUaAGrAYrMTOCtSxdM8ZZkYcXb/s1600/FieldApp4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;640&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcU4CpSwhQ1Q8j-J5WUFmHbDfmsrpkCyKgbU27fpNABpsaLNBpRfSADGo2rKnI_ymq2eL3hTVM4CyYP1mMx1907k9Mq8FIqSbV8bBlUT3YLvg-IqC4DCMUaAGrAYrMTOCtSxdM8ZZkYcXb/s320/FieldApp4.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Well that&#39;s all for today, just letting you all know what I&#39;ve been doing and giving you something to look forward to!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/5357667181097120223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/02/the-need-for-sheep.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5357667181097120223'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/5357667181097120223'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/02/the-need-for-sheep.html' title='The need for sheep'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qHbIIXlLIxAzFP-NEWN_ar4Mh5-3BbJfnfPB1sWYfPWBbopWMEC0VhaLboveDGh-qrGvU1FMCFnJDSC2xzWcPbBtYZRd2dQANYDjJ13rdq7j4h0Q0BOP7kp3OAXMoyzajfPhqTkrq3V9/s72-c/FieldApp2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-1933273516463274481</id><published>2018-02-13T12:25:00.004-08:00</published><updated>2018-07-02T18:22:38.587-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gothic"/><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Gothic is out</title><content type='html'>Gothic is up on &lt;a href=&quot;https://mruniversegames.itch.io/gothic&quot;&gt;Itch.io&lt;/a&gt;, for a multiplayer game it does not have a game browser or any easy-join functionality. You&#39;ll have to find other players and share ip&#39;s and set up port forwarding. There is a single player challenge mode with a castle prefab to see how quickly you can take it down, but the enemy does not return fire.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvhFfhOW40DGOZsJPTwxeSPJXLFYGzIz6W8Yn6eHvkcZjYsvmIFCLbxGzzoDHYKpHd6ZE78ujkJTnIgzzRnqqt14nPjOXfMd7aKHbL8P5bl_IvVW8wGVw6yfnwsFljC3ac2__roXe1bxO/s1600/Cover.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;630&quot; height=&quot;253&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvhFfhOW40DGOZsJPTwxeSPJXLFYGzIz6W8Yn6eHvkcZjYsvmIFCLbxGzzoDHYKpHd6ZE78ujkJTnIgzzRnqqt14nPjOXfMd7aKHbL8P5bl_IvVW8wGVw6yfnwsFljC3ac2__roXe1bxO/s320/Cover.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
This project is now on hold until I can get enough support to justify looking into a central server. With a central server it&#39;d be easy to implement a games browser and host games without forwarding ports, but I don&#39;t have the means to support one at the moment.&lt;br /&gt;
&lt;br /&gt;
I have another small to medium sized project in the planning phase right now, Project Field. I&#39;ll have some more info on that shortly.&lt;br /&gt;
&lt;br /&gt;
If anyone is interested in playing Gothic feel free to comment and I can set up times to have a server hosted on my personal computer. The only map in the game is 2 teams at the moment but each team can have multiple players controlling it! They share resources and units can a lot of fun can be had assigning roles within the teams and coming up with strategies to counter your opponents onslaught.&lt;br /&gt;
&lt;br /&gt;
It is also extremely easy to add new maps or units to the game. Even though the project is officially on hold (kinda like Reindeer Rearing) I might swing around and add a new map or two. If you like making maps for games take a peak in the /assets/ directory (open the .jar with win rar as if it were a zip archive). There is a simple xml detailing the info for a map, and a text file under /assets/Scenes/Maps that you can append with the xml for your map and it will appear as a selectable map in the game. The challenge castles are a regular xml you can open and modify as well, and can be listed in a map as a valid challenge target.&lt;br /&gt;
&lt;br /&gt;
I apologize for Gothic coming out in such a state but I wanted a chance to put the game out there as an early prototype to see if people are interested in this style of game. Single player would be an awesome addition but writing good ai for an rts is difficult and time consuming, especially for a project I am unsure will be played enough to justify the amount of time involved.</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/1933273516463274481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/02/gothic-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/1933273516463274481'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/1933273516463274481'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/02/gothic-is-out.html' title='Gothic is out'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvhFfhOW40DGOZsJPTwxeSPJXLFYGzIz6W8Yn6eHvkcZjYsvmIFCLbxGzzoDHYKpHd6ZE78ujkJTnIgzzRnqqt14nPjOXfMd7aKHbL8P5bl_IvVW8wGVw6yfnwsFljC3ac2__roXe1bxO/s72-c/Cover.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-4109775980684372162</id><published>2018-02-12T11:20:00.001-08:00</published><updated>2018-07-02T18:15:00.162-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="finished"/><category scheme="http://www.blogger.com/atom/ns#" term="ogmj3"/><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><title type='text'>One Game Mechanic Jam 3</title><content type='html'>This weekend I took part in a little game jam held on Itch.IO by &lt;a href=&quot;http://airpodcast.com/category/gamedevsquest/&quot;&gt;Game Dev&#39;s Quest&lt;/a&gt;. I kept the game super small this time with the focus only on interactive buttons and dials on pre set machines. &lt;a href=&quot;https://mruniversegames.itch.io/omgj3&quot;&gt;Here&#39;s my submission.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9CjX7eXthlxfYR3i0FpfdRAMQQdyrhWG5jfHFTVAwCAF257Cos7v9TxaBMQopDNPYUjUIV-f4EfVCAT2BCnTHJQeseJT9z1XuUibZiYOHoPuT1NQYqLC6qoP6MeJtlK_4Ev6AjQvJojO/s1600/Artwork.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;671&quot; data-original-width=&quot;845&quot; height=&quot;254&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9CjX7eXthlxfYR3i0FpfdRAMQQdyrhWG5jfHFTVAwCAF257Cos7v9TxaBMQopDNPYUjUIV-f4EfVCAT2BCnTHJQeseJT9z1XuUibZiYOHoPuT1NQYqLC6qoP6MeJtlK_4Ev6AjQvJojO/s320/Artwork.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/jMonkeyEngine-Contributions/Lemur&quot;&gt;LemurUI&lt;/a&gt; really helped a lot this time around. It&#39;s strong integration with &lt;a href=&quot;http://jmonkeyengine.org/&quot;&gt;jMonkey&lt;/a&gt; engine allows the ui to be implemented in any way you can imagine within jMonkey&#39;s scene graph. This means all those 3d buttons, the lever and dials are all gui element &quot;MouseEventControls&quot; and mouse event listeners. The ability to put this control on any spatial in the scene graph is awesome and something I will definitely make use of in the future!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_At1BRl662HAgRskdaA7E7PYnjA74Abho9Zl8NrbUWvgiqv-I68_6YyzQB1YgOJgoOZaVFmCR8uT2RRUC3ANlJx3hABZ3k7jiHES2WdL36UZAdGxo-uMnfqNw4FG5Zrhw8xxaEdFZwVV/s1600/ss1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;335&quot; data-original-width=&quot;422&quot; height=&quot;254&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_At1BRl662HAgRskdaA7E7PYnjA74Abho9Zl8NrbUWvgiqv-I68_6YyzQB1YgOJgoOZaVFmCR8uT2RRUC3ANlJx3hABZ3k7jiHES2WdL36UZAdGxo-uMnfqNw4FG5Zrhw8xxaEdFZwVV/s320/ss1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
I also used &lt;a href=&quot;https://github.com/jMonkeyEngine-Contributions/zay-es&quot;&gt;ZayEs&lt;/a&gt; entity/component system again. This is simply my favorite addition to jMonkey and really makes storing data with game objects a breeze. Each station added or changed components based on user input. The bottle spatials were also handled by the components using the component filter system which is something I haven&#39;t tried before. It&#39;s probably not the cleanest way to do things but it really allowed for rapid prototyping and I always new exactly what code was responsible for different things.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrJz6NkJdH9veMGfHsZ0vheT_HywDI5WTVGDDCRCeFcnoqTiHNlyU5-8Q9_JQwGbDiqKJl0-Ovbz7PGkE5sN7QpJwfcd5QPxQm3dxk6H1UPOJFst6TmhaKxvEBRAoaUQ_d4PUByAdv44_E/s1600/ss4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;334&quot; data-original-width=&quot;415&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrJz6NkJdH9veMGfHsZ0vheT_HywDI5WTVGDDCRCeFcnoqTiHNlyU5-8Q9_JQwGbDiqKJl0-Ovbz7PGkE5sN7QpJwfcd5QPxQm3dxk6H1UPOJFst6TmhaKxvEBRAoaUQ_d4PUByAdv44_E/s320/ss4.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
I had fun in this jam and look forward to the next one ;)</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/4109775980684372162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/02/one-game-mechanic-jam-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4109775980684372162'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/4109775980684372162'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/02/one-game-mechanic-jam-3.html' title='One Game Mechanic Jam 3'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9CjX7eXthlxfYR3i0FpfdRAMQQdyrhWG5jfHFTVAwCAF257Cos7v9TxaBMQopDNPYUjUIV-f4EfVCAT2BCnTHJQeseJT9z1XuUibZiYOHoPuT1NQYqLC6qoP6MeJtlK_4Ev6AjQvJojO/s72-c/Artwork.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-6193583336552488051</id><published>2018-02-04T21:53:00.001-08:00</published><updated>2018-07-02T18:22:51.655-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gothic"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Project Gothic</title><content type='html'>Working title: Project Gothic&lt;br /&gt;
Defend your keep while you smash your opponents! At the moment I only have multiplayer working. I will upload it as soon as I have a simple &quot;time trial&quot; single player, and I&#39;ll eventually add in ai opponents.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-Dks3n2-3V4ZNALwpLtGf3X1SmyEYbHQ5ewmOjEzW-lG6McHMNEncmwgnEnUZsFvB3ZQ8ZxwyX0hg25I3_fHLglytQUnGbr1i0-DtE759uFLc-pXJtEjqgCuOyY9Ha2PjT551MP8hnR8/s1600/GothicApp4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-Dks3n2-3V4ZNALwpLtGf3X1SmyEYbHQ5ewmOjEzW-lG6McHMNEncmwgnEnUZsFvB3ZQ8ZxwyX0hg25I3_fHLglytQUnGbr1i0-DtE759uFLc-pXJtEjqgCuOyY9Ha2PjT551MP8hnR8/s320/GothicApp4.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
This project was a LOT of firsts for me. Building a game for multiplayer from the ground up requires a very different mindset and I hit a lot of roadblocks along the way. I try to rely on as few external libraries as possible to keep the design as clean as possible. I use jMonkey Engine as it&#39;s a very good, easily expandable engine based on lwjgl. For the UI I use Lemur GUI which is built from the ground up to work with and resemble jMonkey&#39;s scene graph and spatials. This makes adding and modifying ui elements extremely simple. I also use ZayEs Entity-Component system. By following &quot;pure&quot; Entity-component design philosophy I was able to add in complex systems that are very modular in nature, and allowed very easy online integration and I can trouble shoot each system independently. This does come with a memory over-head of storing large numbers of component objects and systems often have similar structures that are kept separate from each other. I feel requiring more memory is worth the trade off of having very distinct systems and components with very few cross contamination.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-jRg6BaTftUGTtR8tVITIuOjSSNcXbtxJMhLtOAzYJuqsXjFlDTxSvzoUZTpXuEyRXq1xf-aFJRGK4ljcVSqNT-zTd72n7qXVJqHtP02GdAPwaJYOMDyuJJxqJfmTjdumS-4Fu45_zWkj/s1600/GothicApp1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-jRg6BaTftUGTtR8tVITIuOjSSNcXbtxJMhLtOAzYJuqsXjFlDTxSvzoUZTpXuEyRXq1xf-aFJRGK4ljcVSqNT-zTd72n7qXVJqHtP02GdAPwaJYOMDyuJJxqJfmTjdumS-4Fu45_zWkj/s320/GothicApp1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The assets are very simple assets I threw together quickly to have something playable. I probably won&#39;t revisit the assets unless this project gets enough interest.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKe7nWc1vyuvffuuWJc48u2zErYEljrpFleyKMKri-NaYWUI93yntr-Cujrt3gfHuQm3ZvoP547WnsYfYMzz2CucAavq7LvJAr88oOwQxlNkSys1rk-0Hi8C0znaiJonh7oK0LOaMwMcSi/s1600/GothicApp7.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKe7nWc1vyuvffuuWJc48u2zErYEljrpFleyKMKri-NaYWUI93yntr-Cujrt3gfHuQm3ZvoP547WnsYfYMzz2CucAavq7LvJAr88oOwQxlNkSys1rk-0Hi8C0znaiJonh7oK0LOaMwMcSi/s320/GothicApp7.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Well that&#39;s all I have for right now. Expect something playable to be uploaded in the next couple of weeks!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/6193583336552488051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/02/project-gothic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6193583336552488051'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6193583336552488051'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/02/project-gothic.html' title='Project Gothic'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-Dks3n2-3V4ZNALwpLtGf3X1SmyEYbHQ5ewmOjEzW-lG6McHMNEncmwgnEnUZsFvB3ZQ8ZxwyX0hg25I3_fHLglytQUnGbr1i0-DtE759uFLc-pXJtEjqgCuOyY9Ha2PjT551MP8hnR8/s72-c/GothicApp4.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-3876248241147959672</id><published>2018-01-19T02:33:00.001-08:00</published><updated>2018-07-02T18:18:31.554-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="news"/><title type='text'>Playing with Unity</title><content type='html'>I love jMonkey engine dearly, but it would be irresponsible to not look around at other tool sets.&lt;br /&gt;
&lt;br /&gt;
I decided to take a look around at other engines since jMonkey doesn&#39;t have a very large range of deployment options. I like java a lot and I will continue to make java games in jMonkey, but I&#39;ve fought with the Android deployment non stop for over a year and am just not getting it to sort of function. I would also like to support some play in browser capabilities which jMonkey lost when browsers quit supporting java applets.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve used Unity in the past, it&#39;s actually what I first started learning to program on. I&#39;m having to re-teach myself to work with the very loose way which unity runs. This is making the transition especially annoying since my current project must support networked multiplayer.&lt;br /&gt;
&lt;br /&gt;
I&#39;ll try to have another blog post with some screenshots of any progress here shortly.&lt;br /&gt;
&lt;br /&gt;
In other news, I&#39;m learning jMonkey joystick support, and you&#39;ll likely see the effects of that soon as well ;)&lt;br /&gt;
&lt;br /&gt;
Also, I set up streaming/recording software. I&#39;m probably not gonna do live streams but it has made capturing video alot simpler. I&#39;ll work on getting some video previews for my games on itch!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/3876248241147959672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/01/playing-with-unity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3876248241147959672'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3876248241147959672'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/01/playing-with-unity.html' title='Playing with Unity'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-703670801961730504</id><published>2018-01-07T21:49:00.002-08:00</published><updated>2018-07-02T18:19:13.801-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dungeon Hoard"/><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><title type='text'>New Year</title><content type='html'>Hello everyone, I hope you had a wonderful New Years Eve/Day!&lt;br /&gt;
&lt;br /&gt;
Here&#39;s what I&#39;ve been up to:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
New enemy added to Dungeon Hoard, the Kob! It&#39;s a flying enemy that travels twice as fast as a normal gob. Once it picks up a coin it gets weighed down and moves at half the speed of a normal gob. Plus, it&#39;s cute!&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs1WeAW0dCZUMs7J_oicL6Tr14ce8JfR265FDL6TGmwCJJEiZnSx2Mts9KL8UC8ptY5YOzkGWciEf2_DO5lXCB_e8H-WJO4Q54rCZVrgbCGT7hjyFk_IIh4DKeLRM3Bfgb3XIUMY-GnBsS/s1600/KobWalk.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Cute&#39;s the right word to use, isn&#39;t it?&quot; border=&quot;0&quot; data-original-height=&quot;120&quot; data-original-width=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs1WeAW0dCZUMs7J_oicL6Tr14ce8JfR265FDL6TGmwCJJEiZnSx2Mts9KL8UC8ptY5YOzkGWciEf2_DO5lXCB_e8H-WJO4Q54rCZVrgbCGT7hjyFk_IIh4DKeLRM3Bfgb3XIUMY-GnBsS/s1600/KobWalk.gif&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Reindeer Rearing has it&#39;s early release. I&#39;ve put in some more work into assets, mainly adding backgrounds to some of the mini games and trying to flesh out the over-all look of the game. With the holiday season over and the Jam wrapped up this project will definitely slow down. I still have goals with it, but updates will be further apart now.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH4d85KoWXdw8_xpRCz2NfC7KnvlqI_eJT2T_fKIuMiw8jmEwimcoLCPXRpyEI1j1pcRja_Z1HGG2cwy5UAV7QZhsoczm-uVnVsxvlx1qKgb_xQdP5OdJYuGxZPvLy5uVb5V-9tI8ycmdS/s1600/DeerWalk.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;You could also describe this as cute, it you&#39;re into that kind of thing...&quot; border=&quot;0&quot; data-original-height=&quot;160&quot; data-original-width=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH4d85KoWXdw8_xpRCz2NfC7KnvlqI_eJT2T_fKIuMiw8jmEwimcoLCPXRpyEI1j1pcRja_Z1HGG2cwy5UAV7QZhsoczm-uVnVsxvlx1qKgb_xQdP5OdJYuGxZPvLy5uVb5V-9tI8ycmdS/s1600/DeerWalk.gif&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
In it&#39;s place I started a new, longer term project. I am aiming for the end of the month. It&#39;s primary focus is multiplayer, which is something I&#39;ve never attempted before! I already have a large amount of work synced and have had multiple clients connected across LAN and a not so good internet connection.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTMDEjWwMEwYW9ULy1YlDRYO3z8k0kgZFeOk2fJe_7G3_yBEOy5PpZWDxvFHYej8CiLNIB-dmeL7h3D9sRNPCtgaRq0f84EFygAR8UU9_cyouV2ei22O6tTMP7pWgjZnnz1MUAXzsafl-d/s1600/Holy-Grail.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Here&#39;s a sneak peak, can you guess what the game is?&quot; border=&quot;0&quot; data-original-height=&quot;303&quot; data-original-width=&quot;500&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTMDEjWwMEwYW9ULy1YlDRYO3z8k0kgZFeOk2fJe_7G3_yBEOy5PpZWDxvFHYej8CiLNIB-dmeL7h3D9sRNPCtgaRq0f84EFygAR8UU9_cyouV2ei22O6tTMP7pWgjZnnz1MUAXzsafl-d/s320/Holy-Grail.gif&quot; title=&quot;&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Looking forward to showing more progress in the coming weeks!</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/703670801961730504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2018/01/new-year.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/703670801961730504'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/703670801961730504'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2018/01/new-year.html' title='New Year'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs1WeAW0dCZUMs7J_oicL6Tr14ce8JfR265FDL6TGmwCJJEiZnSx2Mts9KL8UC8ptY5YOzkGWciEf2_DO5lXCB_e8H-WJO4Q54rCZVrgbCGT7hjyFk_IIh4DKeLRM3Bfgb3XIUMY-GnBsS/s72-c/KobWalk.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-6405631466581043260</id><published>2017-12-25T19:32:00.001-08:00</published><updated>2018-07-02T18:19:25.555-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Reindeer Rearing early build!</title><content type='html'>An early build of the project I was teasing is up on itch, &lt;a href=&quot;https://mruniversegames.itch.io/reindeer-r&quot;&gt;Reindeer Rearing&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKojFjHCA5d9bqubFyB0GSAwY-5-1Bp0MuUajdv1LIlRXzLJGOX5q2bw6qPp-BgIeE-qm6zKi4OUopncdErt1XNU58WKDq4J80kj5gXTNjcPEjqm1LFKpGzJya4jCRY6R22LcSscW8icSj/s1600/StoreImage.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;506&quot; data-original-width=&quot;638&quot; height=&quot;253&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKojFjHCA5d9bqubFyB0GSAwY-5-1Bp0MuUajdv1LIlRXzLJGOX5q2bw6qPp-BgIeE-qm6zKi4OUopncdErt1XNU58WKDq4J80kj5gXTNjcPEjqm1LFKpGzJya4jCRY6R22LcSscW8icSj/s320/StoreImage.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Reindeer Rearing is a simple game where you have 15 days to raise a reindeer to be the best reindeer it can be among 4 different stats. To train a stat you engage in a mini game related to that stat. When you win the stat is increased. When you lose a corresponding stat is effected negatively.&lt;br /&gt;
&lt;br /&gt;
As it stands it&#39;s a pretty early version I put up to enter in the contest I originally started the project for. The mini games are not balanced well, though most do scale in difficulty. It&#39;s lacking a lot of art assets and animations as well. There is also no audio in the game yet.&lt;br /&gt;
&lt;br /&gt;
Over the next week or so I will have another update which will focus on adding in more artwork and hopefully getting the balance of the mini games.&lt;br /&gt;
&lt;br /&gt;
While I&#39;m working on art assets for Reindeer Rearing I also plan on implementing my new sprite system into Dungeon Hoard. This won&#39;t get uploaded right away as it doesn&#39;t add anything performance wise for the player, but it does help maintain pixel accuracy while also making it much easier to add new units and animations.&lt;br /&gt;
&lt;br /&gt;
I&#39;ll have a new blog post later this week talking about how I achieve pixel accuracy in a 3d, floating point game engine.</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/6405631466581043260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2017/12/reindeer-rearing-early-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6405631466581043260'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6405631466581043260'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2017/12/reindeer-rearing-early-build.html' title='Reindeer Rearing early build!'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKojFjHCA5d9bqubFyB0GSAwY-5-1Bp0MuUajdv1LIlRXzLJGOX5q2bw6qPp-BgIeE-qm6zKi4OUopncdErt1XNU58WKDq4J80kj5gXTNjcPEjqm1LFKpGzJya4jCRY6R22LcSscW8icSj/s72-c/StoreImage.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-6119313217560151892</id><published>2017-12-13T23:06:00.000-08:00</published><updated>2018-07-02T18:19:37.860-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="news"/><category scheme="http://www.blogger.com/atom/ns#" term="Reindeer Rearing"/><title type='text'>Newest Project</title><content type='html'>I wanted to wait until I had more art to announce it, but I&#39;ve been super busy writing back-end stuff that I haven&#39;t had time to do more than the very lowest level of art.&lt;br /&gt;
&lt;br /&gt;
I&#39;m making another game! It WILL be out the 23&#39;rd, and it will be available on Itch.Io. It involves reindeer and elves and a large man in red. It will play like a collection of mini-games which loosely effect each other over the course of each play through.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s a reindeer doing a belly slide!&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjag1n3brm5m40UhXAP27ZiU059Gc3-9PVyfL_ug_10-88meS8mqz-_X6UwVDkiKexxAKIW8WUi3z45-qfQZcFZP8pexhhV3SIXHWvXBJFGyRlHs6ED5rqkm8ricYrZtaKGyAw8GG9Pzz18/s1600/TestDeerSlide.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;32&quot; data-original-width=&quot;32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjag1n3brm5m40UhXAP27ZiU059Gc3-9PVyfL_ug_10-88meS8mqz-_X6UwVDkiKexxAKIW8WUi3z45-qfQZcFZP8pexhhV3SIXHWvXBJFGyRlHs6ED5rqkm8ricYrZtaKGyAw8GG9Pzz18/s1600/TestDeerSlide.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/6119313217560151892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2017/12/newest-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6119313217560151892'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/6119313217560151892'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2017/12/newest-project.html' title='Newest Project'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjag1n3brm5m40UhXAP27ZiU059Gc3-9PVyfL_ug_10-88meS8mqz-_X6UwVDkiKexxAKIW8WUi3z45-qfQZcFZP8pexhhV3SIXHWvXBJFGyRlHs6ED5rqkm8ricYrZtaKGyAw8GG9Pzz18/s72-c/TestDeerSlide.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-3912731822317891115</id><published>2017-12-04T18:19:00.000-08:00</published><updated>2018-07-02T18:19:48.863-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dungeon Hoard"/><category scheme="http://www.blogger.com/atom/ns#" term="finished"/><category scheme="http://www.blogger.com/atom/ns#" term="ludum dare"/><category scheme="http://www.blogger.com/atom/ns#" term="playable"/><title type='text'>Post Ludum Dare #40</title><content type='html'>Ludum dare was by far some of the most fun I&#39;ve had making a project. Having the feed with other creators open in the background really gave me the motivation to keep moving forward. Even when I realized my codebase was becoming quiet shaky, I pushed through. I have a finished game! It is small and not well balanced, it becomes quiet repetitive, but it works the way it should, and I am very happy I submitted it.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://ldjam.com/events/ludum-dare/40/dungeon-hoard&quot;&gt;You can play it here.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Friday night when the theme dropped I quickly started brainstorming. I decided on defending an ever growing hoard, with the number of enemies directly corresponding to the size of your hoard. I opened a text document and quickly jotted down my basic game loop:&lt;br /&gt;
&lt;br /&gt;
&quot;you&#39;re a swordsman, you run around collecting gold coins&lt;br /&gt;
the more coins you have the more enemies spawn to kill you you&#39;ll eventually die BREAKDOWN Character-sideways movement, jump, swing sword Enemies- gobs, ignore player rush towards gold if gobs collide with player player takes damage gobs die after 1 hit&lt;br /&gt;
player has hp, takes damage from gobs&lt;br /&gt;
gobs who leave the area permenantly take the coin with them&quot;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
GDD complete!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I open jMonkey ide and create a new project and start importing libraries. I initialize my repo and make a first commit, everything going smooth. Until I realize I made my project inside of another one of my projects directories. I quickly tell jMonkey ide to move the project, but now my repo is messed up. I try to fix to no avail. Not the best of starts, but I&#39;m not to worried.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next I create some very simple artwork. A simple human, a coin, a pile of gold &quot;poo&quot;, some cobblestone, and scribble of a &quot;Gob&quot; - the main enemy in the game.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsbmdL24Q7whfUlclSt0wSKIxvuRCmZHfweOTjVwrGrQ7PoIviVnbI1tj8ClyoNPl1cByZ6WrwDTWLW-mOXRD4mkoluIkOKTeFM62FCnD3wvfLjPrvR8W0Tzis_m-JxyziNUU33LyBJO0G/s1600/ld40Start.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;342&quot; data-original-width=&quot;672&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsbmdL24Q7whfUlclSt0wSKIxvuRCmZHfweOTjVwrGrQ7PoIviVnbI1tj8ClyoNPl1cByZ6WrwDTWLW-mOXRD4mkoluIkOKTeFM62FCnD3wvfLjPrvR8W0Tzis_m-JxyziNUU33LyBJO0G/s320/ld40Start.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
With some quick artwork finished I can start working on some game elements. This is one of the first times I was attempting something in true 2d, with all pixel art. I knew I needed to keep pixel densities as close to eachother as possible but I didn&#39;t know how to approach a spritesheet or 2d animations. I made a simple entity component that you assign a texture to, and the system will create a jMonkey spatial which uses the size of the texture to determine the size of the quad needed for the world. This worked perfectly, for now.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Working without animations is easy, most of the logical code is similar to games I&#39;ve worked on in the past. I decided I wasn&#39;t going to use the library I have been building up with easily re-usable code for this project. I was curious how I would come up with implementing things without using my old code as a crutch. This turned out to be a good thing as I have re-worked systems I have taken for granted in my old library and I believe my new systems are much cleaner. This helped with this project as I could quickly implement exactly what I needed without any added weight.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
With dyn4j integrated, character movement functioning and the beginning of the coin code started I decided I was far enough along I needed to start having animations. I needed a way to visualize attacks and goblin states without relying on println&#39;s. This is when I realized that nifty system I designed in the beginning was actually quiet terrible for sprite animations.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
For sprite animations it&#39;s best to have large image maps with every frame of the animation on one image. With my current system this would have caused the game object quads to be huge and the animations to not appear correctly. I was relying on a sprite shader I found in the jMonkey forums from a long time ago (Thank you&amp;nbsp;&lt;a href=&quot;https://hub.jmonkeyengine.org/t/how-to-make-spritesheet-for-jmonkey/33239&quot;&gt;Pesegato!&lt;/a&gt;) which would position a quads uv coords along an image for the specified index, thus making setting the frame as simple as &quot;setFloat(index)&quot;. I probably could of found a way around this, kept each frame a seperate image and loaded each image as needed but I believe this would have been much slower.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
I wound up making a &quot;bandaid&quot; system which took an animation component, a new image and just stole the existing game object quad to use. Not great at all, but functional.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXR9gEw6VVFPJaFiwiOgJrLw6BN5dLh7Jk6uKVTMpxU8TUBO6aQPVtnTIq-MTqOEAVAfNEkDo3fRMNOZL28bss3YK2Wn8kLuZhyphenhyphen73sunwvytQBVwvx_gQ0E_1l_lkWM8yWtd3nwVzgTHp/s1600/ld40end.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;158&quot; data-original-width=&quot;352&quot; height=&quot;143&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXR9gEw6VVFPJaFiwiOgJrLw6BN5dLh7Jk6uKVTMpxU8TUBO6aQPVtnTIq-MTqOEAVAfNEkDo3fRMNOZL28bss3YK2Wn8kLuZhyphenhyphen73sunwvytQBVwvx_gQ0E_1l_lkWM8yWtd3nwVzgTHp/s320/ld40end.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
Fixing the animations took me to the 24 hr mark, I had no sleep at this point and was looking forward to another 24 hours. I used to work 2 jobs so I&#39;ve been up for 48+ hours in the past, but things are a little different sitting at a computer. I made sure to take frequent breaks. Get up, stretch, grab drinks. Eventually my stamina was wearing thin.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
Nearing 30 hours I had finally finished the coin counting and inventory system. It&#39;s a pretty reliable system but it is limited. No entity can carry more than 1 coin, and the entityId is simply added to a list of &quot;carrying coin&quot; entities. If the player reaches his hoard his id is removed and he gets +1 hoard. If a gob runs off the world his id gets removed from the list. Gobl spawns are a simple 1+hoard/3.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
36-37 hours in I took a nap. Thank you to my ultra-supportive wife who put up with me being grumpy and got me out of bed after 2.5 hours.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
The nap helped but I was still exhausted. I wound up finishing art assets, re-doing all the animations and called it done. I really wish I had tried to add in 1 other enemy type and an &quot;end game&quot; boss, but my head was way to cloudy to focus. I wound up posting the project a couple hours before compo ended and went back to sleep.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
When I woke back up around 7-8 (an hour before compo ended) my wife asked to play the finished game. I went into my dist folder to open the finished game file as opposed to loading the ide which takes a lot longer. I&#39;m really glad I did because it turns out I had packaged everything wrong! I spent the next half hour or so figuring out what went wrong, fixing it, re-packaging and re-uploading. Still turned in early but now I had at least a working executable uploaded!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOBQFzG-6mOj5G2IIr8iiGQY4f_Bh6uCiOfRWfHngjN6YoC9TbSV3EnYXW3nEjMCw2BWyM5k3loKsAlKxPnuiw6MOL1ArC5GC62iLH_peAAMnU8-tEFkLjEB_bs-VKxqCzQcMTauiRgSUp/s1600/CoverArt.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;480&quot; data-original-width=&quot;640&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOBQFzG-6mOj5G2IIr8iiGQY4f_Bh6uCiOfRWfHngjN6YoC9TbSV3EnYXW3nEjMCw2BWyM5k3loKsAlKxPnuiw6MOL1ArC5GC62iLH_peAAMnU8-tEFkLjEB_bs-VKxqCzQcMTauiRgSUp/s320/CoverArt.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
Ludum dare was an awesome experience. As a newbie dev this was a kick I definitely needed and enjoyed every minute of it. I already plan on entering the next dare, as well as focus on producing more finished projects between now and then.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
Thanks for reading and I hope to see you at a dare in the future!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/3912731822317891115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2017/12/post-ludum-dare-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3912731822317891115'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/3912731822317891115'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2017/12/post-ludum-dare-40.html' title='Post Ludum Dare #40'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsbmdL24Q7whfUlclSt0wSKIxvuRCmZHfweOTjVwrGrQ7PoIviVnbI1tj8ClyoNPl1cByZ6WrwDTWLW-mOXRD4mkoluIkOKTeFM62FCnD3wvfLjPrvR8W0Tzis_m-JxyziNUU33LyBJO0G/s72-c/ld40Start.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5311456549682003353.post-208668229495413841</id><published>2017-12-01T17:40:00.002-08:00</published><updated>2018-07-02T18:21:08.355-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dungeon Hoard"/><category scheme="http://www.blogger.com/atom/ns#" term="ludum dare"/><category scheme="http://www.blogger.com/atom/ns#" term="wip"/><title type='text'>Ludum Dare 40</title><content type='html'>I&#39;m in!&lt;br /&gt;
&lt;br /&gt;
It&#39;s my first time trying a game jam. I figure I can take the weekend and really put in an effort at making something short and sweet.&lt;br /&gt;
&lt;br /&gt;
Result will be uploaded on itch.io regardless of quality. You&#39;ve been warned in advance :P</content><link rel='replies' type='application/atom+xml' href='https://mrugames.blogspot.com/feeds/208668229495413841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://mrugames.blogspot.com/2017/12/ludum-dare-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/208668229495413841'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5311456549682003353/posts/default/208668229495413841'/><link rel='alternate' type='text/html' href='https://mrugames.blogspot.com/2017/12/ludum-dare-40.html' title='Ludum Dare 40'/><author><name>QSDragon</name><uri>http://www.blogger.com/profile/16622503351841276050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwmfLzdptcZloa8Sdx3wljCB5DVewoJ1p1THTwVCYDvl78iglbqdRFVYQ6lv6g9rBqqLRi4vlQBoEBjQ5LsF8OtK8QL5PkHoSgG4bMoJiPDzc1-Em6ZDTwRQ50idJfKA/s220/avatar64613_1.gif.jpg'/></author><thr:total>0</thr:total></entry></feed>