tag:blogger.com,1999:blog-46971477302332530072024-03-14T00:24:20.410-07:00MoribitoTechXMobile App / Game Development Tutorials By Using Unity3D, LibGDX, Mtx for Android and iOS
Unknownnoreply@blogger.comBlogger35125tag:blogger.com,1999:blog-4697147730233253007.post-11829058049469762172013-07-27T05:49:00.000-07:002013-07-27T05:49:41.948-07:00# Developer Log - Why does LibGDX (Mtx) awsome with Unity3D ? <div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Hi my fellow developers, I have been extremely busy and working and working alot. Done couple of clients works, completed around 10-12 android apps, studying and learning about marketing, experimenting with ad networks,<b> the most important one is I was focusing on Unity3D.</b><br />
<br />
By the way some of our apps with other developers (sorry our strict policies) become very very successful, quite an achievement for us.<br />
<br />
<br />
<br />
<b><span style="font-size: large;">SECRET PROJECT</span></b><br />
I have a top project with the highest priority at the moment. For my latest game (Still a secret) I made a simple level editor with LibGDX/MTX in only 3 days, this was awesome and essay. Game will be Unity3D the game.<br />
<br />
Here is my simple level editor<br />
<img alt="" height="174" src="data:image/png;base64,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Dz744IMPPvjggw8AgH0oXU1NrVZT3fjggw8++OCDDz744AMAYDdKx7qpbnzwwQcffPDBBx988AFrGKLCPXDc/ax4FoaNmzxw3P2s5DZKx7o5wxwffPDBBx988MEHH3zAGm4PbKo7W9we2J5c3fHx8bGxsfv27du7d++ePXt27969e/fuPXv27N27d9++fbGxsfHx8U55IN7XjQ8++OCDDz744IMPPmAPbg9sqjtb3B7YnlzdO3funDx5cuPGjT/++OP33nuvaNGir776auXKlWvUqBEYGDhlypSoqCinPJDSNczVarVaraa68cEHH3zwwQcffPDBB8xxMI/jls/ZM6rHjHaNRjb261373RE//m9iizq7h3WNXTCF6nYWbg9sD6zuuLi4devWBQYGli9fvlixYs8++2zBggULFCggHXUuUKBAoUKFnn/++WLFilWuXLlly5bLly938KB3Nu/rprrxwQcffPDBBx988MEHLGJfFaeErPn145IBZXyUp1XFZ2NWLaS6HcTtge1R1R0fH79ly5bu3bt/8MEHL7/8slarVSvi5eVVtGjRTz75pEePHhs3brT7calufPDBBx988MEHH3zwAXvIaQ/vWjyj/ftFs+1t+bQo//SmYUF5orrjYmO2bw4NWbFo49J5y6eMWj5l1PKpozcsnReycvG2zSFxMTFusXJ7YHtOdcfExAQHBzdt2rRkyZIajUa5t+V4e3uXLFkyICBg2bJl9j10NmeY875ufPDBBx988MEHH3zwAYvkIIbD13f/X/kc9bZ8fq70QuKaxZ5Z3TH79kasD175x/g5g3tM6BwwNPCbwU1q9/y6Ss+vq/T8purgJrWGBdYZ37nZ7MHdV80YH7lhTcy+PbmpZzl6g4N3z/xj9wyXT8zSJR5S3dHR0cuXL//xxx+fffZZ23tbzksvveTv779w4UI7zjZXqm6upoYPPvjggw8++OCDDz5gDVszeMVcu3tbPuuHdPOo6o7Zuydyw5rlU0eP69g06MvKrSo+q3zCfFCtd8Z3brZ86ugtG/+M2ZtL7W1evPFLl67u3W1Ik3pDfqrr6pnZqdXe8eOSN2x0b3XHxsb++eefTZo0KViwoH3JLfHcc899991369aty6mA0hnmWq1Wq9VS3fjggw8++OCDDz744APm2NLA6wd2dkpySzO16ZeeUN3xcXG7t0etXTBj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" width="320" /><br />
<br />
How things will work ?<br />
1. Create a level in LibGDX editor<br />
2. Export level to xml file in a single second<br />
3. Read xml file in Unity3D<br />
4. Start Level<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>I AM A LAZY GUY, SO I NEED TO BE SMART </b></span><br />
I decied this game around 1 week ago, it should be awsome and very long around 300 levels. I made the editor so that I can make a single level under 7-8 minutes :D and directly test the level in unity in 2 minutes, all together 10 minutes for a level, pretty awsome.<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>BUDGET</b></span><br />
<u>I bought these at the moment: </u><br />
Unity3D NGUI: $95<br />
Unity3D Galaxy Pack: $15<br />
<br />
<u>I will buy:</u><br />
Epic Music Pack: $40<br />
Some assets around: $25<br />
<br />
<u>Marketing :</u><br />
Thinking around $1000 as start<br />
<br />
So total will be around $1200 for the game, It is pretty cheap as you see for the start.<br />
<br />
<br />
<br />
<br />
<b><span style="font-size: large;">UNITY3D</span></b><br />
I love LibGDX and Mtx, both very neat, easy to use, mostly error free, totally user control. For Unity3D I cant say same things, scripting is boring, untidy, editor with full of errors, stupid bugs, unknown backed crashes, so as you understand unity3d means unlimited problems.<br />
<br />
On the other hand Unity3D is lighting fast, NGUI is awsome for GUIs. If I make a game with LibGDX in 30 days, I can make same game in Unity3D in around 6-7 days, no shitttinggg... The difference is FPS, LibGDX has awsome FPS, but Unity3D will not even open in many devices. <br />
<br />
<br />
<br />
<span style="font-size: large;"><b>MTX</b></span><br />
I of course continue my LibGDX adventure with Mtx, but nowadays I am very busy with learning, testing and other stuff... Mtx v2.1 still in beta but %100 functional without errors, so you can use it.<br />
<br />
<br />
<br />
<br />
<br />
Take care everybody.<br />
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-57187492321338853092013-05-21T06:17:00.002-07:002013-05-21T06:18:59.889-07:00#6.3 Tutorial (LibGDX & MTX 2.1+) Flame Words - MainStarter / AbstractGame<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-zsbR89INa30/UZtxhTzaWSI/AAAAAAAAB8Y/r78dsmb-kmQ/s1600/tut63.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://1.bp.blogspot.com/-zsbR89INa30/UZtxhTzaWSI/AAAAAAAAB8Y/r78dsmb-kmQ/s640/tut63.jpg" width="512" /></a></div>
<br />
<br />
<br />
<span style="font-size: large;"><b>ABSTRACT GAME</b></span><br />
Our MainStarter is extends the AbstractGame which is inital point of our game. This is constructed once and used until we exit the game, all screens managed by the game class.<br />
<b><span style="font-size: large;"></span></b><br />
<a name='more'></a><br />
<b><span style="font-size: large;">SETTING APP SETTINGS</span></b><br />
This is so important, AppSetting is our info depo which we get all static info about sizes. It is used in Scene2D Stage creation in AbstractScreen class. Also the we store the word and target world size to calculate DIPActive and use in World contructions.<br />
<br />
It has 3 setUp() methods in it, you can just read the descriptions for those. You either use my DIPActive - anti stretch formula or you just use regulat libgdx development style which ends up scaling the stage due to device res. DIPActive is okay formula, but not awsome, for pixel/position perfect games it should be avoided, but it is very handy for live wallpapers.<br />
<br />
<span style="color: #990000;"><b>Just use each setUP() method and run the game 480x320 and 960x540 resolutions in desktop, you will see the what I mean about stretching. </b></span><br />
<br />
<br />
<span style="font-size: large;"><b>DATABASE</b></span><br />
We create 2 text files as mini database after first install, and thats it.<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-4697147730233253007.post-2438303851845377352013-05-21T01:12:00.000-07:002013-05-21T01:12:38.037-07:00News - Moving to GITHUB<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/kmmathis/initializr-website/diff_blob/4a9bd94e6c4a3480773631e9f2529ae8ba1d7c16/img/github-logo@2x.png?raw=true" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="https://github.com/kmmathis/initializr-website/diff_blob/4a9bd94e6c4a3480773631e9f2529ae8ba1d7c16/img/github-logo@2x.png?raw=true" width="320" /></a></div>
<br />
Now I decided to move GITHUB, Lets improve the code alltogether :)<br />
<a href="https://github.com/moribitotech/MTX">https://github.com/moribitotech/MTX</a><br />
<br />
The problem I never used GITHUB and it bored me like hell with stupid errors like master none rejected etc... At the end I managed to push the project.<br />
<br />
If I do not destroy the repo mistakenly with my stupidity, lets improve the project all together :DDD... Keep in touch guys...</div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4697147730233253007.post-73840187537852265102013-05-19T05:49:00.003-07:002013-05-19T06:07:41.180-07:00#6.2 Tutorial (LibGDX & MTX 2.1+) Flame Words - The Structure<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-lxOc_cJd0l0/UZjD76aTRhI/AAAAAAAAB8I/ZvxH9CyFpKU/s1600/gamestructure.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-lxOc_cJd0l0/UZjD76aTRhI/AAAAAAAAB8I/ZvxH9CyFpKU/s640/gamestructure.jpg" width="512" /></a></div>
<span style="font-size: large;"><b><br /></b></span>
<br />
<span style="font-size: large;"><b>GENRERAL STRUCUTE</b></span><br />
First of all, this may not be the greatest game structure of all or perfect idea of game foundations. I will admit that I have unique style of my own. I worked many other game structures, MVC styles and so on. They have all pros and cons, but at the end I ended up with my own unique structure which works fine for me. In future, I will adapt to new structures, I will learn from my mistakes, all in all, I am newbie guy that graduated from university recently and tries to find a path in game programming world. <br />
<br />
<a name='more'></a><br />
<span style="font-size: large;"><b>TELL <span style="font-size: large;">ME</span> </b></span><br />
Tell me what is bad or good about the structure, what can be changed for future. I will think more on them. I will create better foundations in future. I am here to learn and experience, you will find strong ideas in my games and structures as well as weak and stupid ideas :D loll...<br />
<br />
<br />
<span style="font-size: large;"><b>LETS LOOK AT THE SCTRCUTE</b></span><br />
<b>Before GameManager</b><br />
Everything should be clear. We have screens and screen helpers. I use screen helpers to divide the tasks of menus (More cohesive approach in OOP), this gives me incredible flexibility and maintainability for my games, I can honestly make any game menu you can imagine with this approach. I do not stack all game menu elements in a screen or in a class, I divide them into objects and use effects on them.<br />
<b><br /></b>
<b>Sub Manager of GameManager</b><br />
I have around 8-9 sub managers (HintM, AchievementM, PuzzleM, PunishmentM, NotificationM, SwarmM, EffectM, TutorialM, etc...) Why so managers ? Simple, again Choseion off OOP. I have single duty for all my managers, if have a problem about hints, I look into hint manager, if I need a new feature I will make a new manager, if I need to update a manager, I know where it is. Very very very flexible and maintainable approach for future and very easy to develop the game. All these managers communicates with World and GameManager without problems.<br />
<br />
<b>GameIOManager, Data Objects, Database</b><br />
I have very simple database (textfiles), database can be anything XML, Server, a JSON file or TextFile. I simple read and write textfiles through GameIOManager. I get data from text file and put them into DataObjects (GameData, PlayerData, PuzzleLevel). What are these data: fire level, meter level, current level, etc...<br />
<br />
<b>GameInputManager</b><br />
When you touch a letter or fire many things happens logically. It was the best idea create a input manager for it. So, I can easily work on it, for example you touch a letter and many things happens: play audio, run effect, update word, update guess box on top, if word finished, check game condition, update blue water meter etc...<br />
<b><br /></b>
<b>EffectManager</b><br />
This was a great idea, this is the EffectCenter (Static class) of the game wihich manages all the Scene2D actions. For example, runNewWordEffect, runGenerealButtonEffect, runNewHintEffect, runToggleButtonEffect, runMenuEffect, etc... For any effect, I know where to look and I know what to change. This is also good to prevent code duplications, for example button effects managed from a single place.<br />
<br />
<b><span style="font-size: large;"><br /></span></b>
<b><span style="font-size: large;">ANDROID<span style="font-size: large;">OBJEC<span style="font-size: large;">T</span></span></span></b><br />
I have single android object that comes from android (MainActivity) and this the king of classes. It has many sub interfaces and it can be added many other interfaces. At the moment it has IAdController which controls advertisements and IAndroidIntents which start intents.<br />
<b><span style="font-size: large;"></span></b><br />
<b><span style="font-size: large;"></span></b><br />
<b><span style="font-size: large;">MORE O<span style="font-size: large;">O</span>P NEEDED</span></b><br />
This was an experimental game, more oop and database management needed in future. For example, factory classes could be good or xml/json as database management could be great. I will think more on those in future<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4697147730233253007.post-78559861948115026172013-05-19T04:35:00.000-07:002013-05-20T01:19:34.028-07:00#6.1 Tutorial (LibGDX & MTX 2.1+) Flame Words - The Project<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-M_z6l4ugrYM/UZi0iDs60pI/AAAAAAAAB74/Hgc1TxiZDjM/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="384" src="http://3.bp.blogspot.com/-M_z6l4ugrYM/UZi0iDs60pI/AAAAAAAAB74/Hgc1TxiZDjM/s640/1.png" width="640" /></a></div>
<br />
<br />
<b><span style="font-size: large;">FLAME WORDS</span></b><br />
I had this game idea very long before, I also made very simple prototype called "Dark Flame Words", but in that time I got bored :)) and left the project. The game is simple, just guess the shuffled lettered words without touching fire, so you will not be punished, also there are an extinguisher to get rid of flames etc...<br />
<br />
<br />
<a name='more'></a><br />
<b><span style="font-size: large;">PROJECT TIME </span> </b><br />
<b>Around 2 weeks at most</b> (8-9 days coding, 2 days graphics, 2 days test and deployment)<br />
I did all the coding myself and I prepared %80 of graphics. I got the animations from "Pow Studios" (many thanks to them) and the wonderfull 3 Jazz Music from Kevin Macleod (very greatfull to him).<br />
<br />
<br />
<b><span style="font-size: large;">PERFORMANCE</span></b><br />
The game runs smoothly in most of device with +50 FPS and all other devices is fix 60 FPS, quite good results. You may think it is a simple game, but it is not actually. There are 60 sparkles constantly moving (60 Smart Actors) and 40 animated mini fire that become the bottom fire, and each of them being scaled almost to screen size if you guess the word wrong. So it means there are 100 actors with scaling and animations non-stop. Also there are other UI elements etc...<br />
<br />
<span style="font-size: large;"><b><br />FUTURE UPDATES</b></span><br />
"FIXME" you will see this everywhere in the game codes, beacuse I did not made a perfect game here, even like this works superp though, thanks to LibGDX. I noted a lot of fixme that improve game performance and memory in the future<br />
<br />
<br />
<span style="font-size: large;"><b>MTX 2.1+ BETA</b></span><br />
I refactored classes and structured most of packages, more optimized and more performance achieved at the moment. Still there are tests needs to be done, also some classes not implemented at the moment but everything works just fine as you can see the Game Flame Words.<br />
<br />
<br />
<span style="font-size: large;"><b>L<span style="font-size: large;">ICENSE</span></b></span><br />
The project is under license Creative Commons Attribution 3.0 (All codes can be used freely Personal/Commercial). However the assets (Graphics, Sounds, Musics, Animations, etc..) that created by us are cannot be used anywhere. Of course the musics/sounds from Kevin Macleod and animations from Pow Studios can be used as long as the credit given to those respectful owners..<br />
<br />
<b><br /></b>
<br />
<div style="text-align: center;">
<b>GOOGLE PLAY</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.moribitotech.android.flamewords" target="_blank"><img border="0" height="66" src="http://4.bp.blogspot.com/-2Tk8S2dfDp8/UP7WWPZXoAI/AAAAAAAABao/nsIPynw4sP4/s200/gp_install_1_.png" width="200" /></a></div>
<div style="text-align: center;">
<span style="color: #990000; font-size: x-small;"><b>(Please rate and comment, if you only like the game!)</b></span></div>
<br />
<br />
<div style="text-align: center;">
<span style="font-size: small;"><b>PROMO</b></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lHp5E88pGHI/UZY43r8q9LI/AAAAAAAAB7o/mten4ijSdqg/s1600/info2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-lHp5E88pGHI/UZY43r8q9LI/AAAAAAAAB7o/mten4ijSdqg/s1600/info2.jpg" /></a></div>
<span style="font-size: large;"><b><br /></b></span>
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-47846518182382460532013-05-17T07:07:00.000-07:002013-05-17T07:07:34.083-07:00Mtx v2.1 BETA (Flame Words Game) Finally Here (Source codes + Tutorials)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lHp5E88pGHI/UZY43r8q9LI/AAAAAAAAB7o/mten4ijSdqg/s1600/info2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-lHp5E88pGHI/UZY43r8q9LI/AAAAAAAAB7o/mten4ijSdqg/s1600/info2.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-size: large;"><br /></span>
<br />
<b><span style="font-size: large;">INFO</span></b><br />
Mtx v2.1 BETA finally here, now it is a library (mtx.jar, no more packages). I made a sample game "Flame Words".<br />
<br />
<br />
<b><span style="font-size: large;">FLAME WORDS</span></b><br />
This is a simple, yet awsome game, try it on <a href="https://play.google.com/store/apps/details?id=com.moribitotech.android.flamewords" target="_blank">Google Play</a>, <b>Please RATE and COMMENT the game to support us on Google Play!</b> The game is about guessing words without touching fire, lots other mini funs in it. It took about 2 weeks to complete<br />
<b><br /></b>
<b><br /></b>
<b><span style="font-size: large;">FULL SOURCE CODE & TUTORIALS</span></b><br />
Source should be available at Download Page now, I will post tutorials day by day from this week, so they will be coming. File abit huge (50 mb), I have Jazz Music files, etc, also other stuff... Nothing to worry about.<br />
<br />
<br />
Enjoy the most updated code...<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-66461347495407734362013-04-01T01:40:00.000-07:002013-04-01T01:40:17.538-07:00# Update - Mtx v2.1 on the way (All in One edition)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-siNHDBZXRtM/UVlFQ8-YtjI/AAAAAAAABvo/g-KTw1v6f18/s1600/aaa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-siNHDBZXRtM/UVlFQ8-YtjI/AAAAAAAABvo/g-KTw1v6f18/s640/aaa.png" width="512" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Mtx is fairly updated with the version 2.1, and added many features also there have been internal changes, Lets see what are those;</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: left;">
First of all idea of Mtx was "write less, do more, save time". I believe, with the version 2.1 is almost happening. Single line effects, positioning, sizing, ready models etc makes our life easier, the code looks neat and less, so no confusion. You may use it for just a UI / HUD / Menu or full game, app and live wallpapers. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Changes:</div>
<ul style="text-align: left;">
<li>Ditching the most of static variables, especially assets, and using assetmanager</li>
<li>AbstractGame joins the club and being the king of the game</li>
<li>Many adcontrollers, single line show ads, banners, app walls, virtual currency etc, no messy code</li>
<li>Settings ecosystem is ready to use (Music, Audio, Vibration etc turn on/off anywhere) all ready, no need to write your own code</li>
<li>Collision detections is improved for actors and touch points</li>
<li>Advanced logging system, just see what you want to see as logs for entire system</li>
<li>Utilies for everthing, these stuff will save enormus time and prevent code duplication</li>
<li>And first time ever it comes as Mtx.jar, just add as the library to your game, and use all you want.</li>
</ul>
Coming soon... <br />
<br /></div>
Unknownnoreply@blogger.com8tag:blogger.com,1999:blog-4697147730233253007.post-13961294615067885412013-02-08T03:27:00.000-08:002013-02-08T03:27:45.192-08:00#5.3 Tutorial (LibGDX & MTX) Game State<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
How to manage game state, well thanks to LibGDX Scene2D, it is very easy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XcTnGUzNyR8/URTdwBoa0rI/AAAAAAAABpE/wVB3nyFrzEw/s1600/111111111.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://3.bp.blogspot.com/-XcTnGUzNyR8/URTdwBoa0rI/AAAAAAAABpE/wVB3nyFrzEw/s400/111111111.jpg" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<b><span style="font-size: large;">GAME STATE</span></b><br />
<br />
What manages my game, the GameManager. There is enum class in MTX called GameState, which has different states (You can see in the above screenshot)<br />
<br />
The GameManager keep tracking the game state, you can set the game state or get the game state with "set/getGameState()" method in GameManager. (Actually it is in the AbstractGameManager of MTX)<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>WORLD</b></span><br />
<br />
In my world, I keep track game state and decide to act or not. If I do not act, everthing under the world (WorldLayers, actors, etc..) will stop acting. This can be improved and it can be changed, I just wanted to show how can it work.<br />
<br />
<ul style="text-align: left;">
<li>if gameState.RUNNING, continue acting</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-6SDZHSCArWk/URTR9UQUmRI/AAAAAAAABnc/za_tZs89Nyc/s1600/44e.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="262" src="http://3.bp.blogspot.com/-6SDZHSCArWk/URTR9UQUmRI/AAAAAAAABnc/za_tZs89Nyc/s640/44e.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>PLAY / PAUSE BUTTON and GAME MANAGER</b></span><br />
<br />
if you tried the play/pause button on the test project you will notice everything stops moving (acting). In my GameScreen, I constructed GameManager and GameScreenMenu classes.<br />
<br />
In my GameScreenMenu, I have reference to Screen (which has GameManager). I created a toggle button, which changes game state.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-K_De4LZfITc/URTf0ts7LOI/AAAAAAAABpQ/jL33ZCG_odU/s1600/11xx11.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="342" src="http://4.bp.blogspot.com/-K_De4LZfITc/URTf0ts7LOI/AAAAAAAABpQ/jL33ZCG_odU/s640/11xx11.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Basically I have one GameManager, and it has references everywhere (Screen, worlds, layers ...)<br />
<br />
Well, this may not be ultimate approach or best solution, but it works great and performance is very good. At the moment, I cannot ask no more.<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-4697147730233253007.post-83092170902411185802013-02-08T03:01:00.000-08:002013-02-08T03:01:50.785-08:00#5.2 Tutorial (LibGDX & MTX) World Scene2D<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
As you know, the GameManager has already created the main world and the world layers, but what are these exactly, how can we use these for games and live wallpapers.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-sKfVOnx9WIU/URTOc4CUoZI/AAAAAAAABnE/eb0NVOUThOM/s1600/999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://3.bp.blogspot.com/-sKfVOnx9WIU/URTOc4CUoZI/AAAAAAAABnE/eb0NVOUThOM/s400/999.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<b><span style="font-size: large;">WORLD </span></b><br />
<br />
Here is my main world that extends "AbstractWorldScene2D" of Mtx (AbstractWorldScene2D also extends LibGDX Scene2D Group). Basicly this is the main Scene2D Group that will hold all other world groups and actors. (Do not worry about GameState, I will talk about on next tutorial). I give reference to gameManager in each my world to provide connection among the world layers whenever is needed.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-6SDZHSCArWk/URTR9UQUmRI/AAAAAAAABnc/za_tZs89Nyc/s1600/44e.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="260" src="http://3.bp.blogspot.com/-6SDZHSCArWk/URTR9UQUmRI/AAAAAAAABnc/za_tZs89Nyc/s640/44e.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b><span style="font-size: large;">WORLD LAYERS</span></b><br />
<br />
World layers basicly same thing with main wolrd (Also extends AbstractWorldScene2D). Here is the example of "WorldLayer1"<br />
<ol style="text-align: left;">
<li>I set the bluish background</li>
<li>I set bottom soils/grass</li>
<li>I set the the clouds</li>
</ol>
Order is important, because its being added to this WorldLayer1 (Scene2D Group)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-JcHL4qP5r5o/URTTQaavP2I/AAAAAAAABno/6mx0slCUrPM/s1600/99eee9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-JcHL4qP5r5o/URTTQaavP2I/AAAAAAAABno/6mx0slCUrPM/s640/99eee9.png" width="638" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>OTHER WORLD LAYERS</b></span><br />
<br />
WorldLayer order is also important, it defines what comes top/bottom.<br />
<br />
WorldLayer2<br />
<ul style="text-align: left;">
<li>I only set flying enemy objects</li>
</ul>
WorldLayer3<br />
<ul style="text-align: left;">
<li>I only set snow effect </li>
</ul>
<br />
<br />
<br />
<br />
<b><span style="font-size: large;">WHY MANY LAYERS</span></b><br />
<br />
Of course, I could have done everything in a single layer, but I like cohesion/coupling, it gives me flexibility. I give a responsibility to each layer (Background layer, environment layer, enemy layer, player layer, shooting layer, menu layer, etc..). Then everything is easy to improve and maintain. It is best to avoid confusion and do a fast implementation.<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>SNOW EFFECT ON WORLDLAYER3</b></span><br />
<br />
Again, I want to talk about my SmartModel for you envrionments. I believe you noticed that nice snowing effect which is natural and no-strecthing in any device.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-RiGEEndxW3c/URTWiHPEBDI/AAAAAAAABoM/VaXTCTE0R1E/s1600/666.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="584" src="http://4.bp.blogspot.com/-RiGEEndxW3c/URTWiHPEBDI/AAAAAAAABoM/VaXTCTE0R1E/s640/666.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
It took only a minute to set up this snow effect. I wanted my snow to with an angle, so I gave different direction to first half and second half of my snow flakes.<br />
<br />
Direction is like;<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-nMOEnlr6JuU/URTZBBloomI/AAAAAAAABoo/c0IRVxlFXcA/s1600/11aaaa9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="328" src="http://2.bp.blogspot.com/-nMOEnlr6JuU/URTZBBloomI/AAAAAAAABoo/c0IRVxlFXcA/s640/11aaaa9.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-25732385509914269452013-02-08T01:27:00.001-08:002013-02-08T01:37:01.991-08:00#5.1 Tutorial (LibGDX & MTX) Game Manager<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Now lets talk about game/live wallpaper structure/logic that can be built with LibGDX Scene2D. As you know Scene2D consists of Stage/Group/Actors. By using Mtx, I have created objects which extends these Scene2D elements with very useful features. (AbstractScreen, AbstractWorldScene2D, AbstractActor)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-45FIjA8B1xI/URPL4FWN-3I/AAAAAAAABmc/1TpCSCCqOkk/s1600/Untitled-1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://1.bp.blogspot.com/-45FIjA8B1xI/URPL4FWN-3I/AAAAAAAABmc/1TpCSCCqOkk/s640/Untitled-1.jpg" width="426" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
I want my screen is to be start of everything, at the same time I do not give direct responsibility to my screen, thus gameManager is responsible for creating and managing the world. A little bit Cohesion/Coupling of object oriented programming.<br />
<br />
<b>Screen (extends AbstractScreen of Mtx) - constructing Scene2D Stage</b><br />
<b>World and WorldLayers (extends AbstractWorldScene2D) - Scene2D Groups</b><br />
<b>Rest of objects are Scene2D Actors (extends AbstractActors)</b><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>SCREEN (ABSTRACTSCREEN)</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-CbG9ZSbm4XU/URPNeS2hzuI/AAAAAAAABmk/uvW2c0AePU0/s1600/111.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-CbG9ZSbm4XU/URPNeS2hzuI/AAAAAAAABmk/uvW2c0AePU0/s640/111.png" width="580" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
As you can see, I only construct the gameManager and gameScreenMenu classes in my screen, this is all responsibility of the screen. gameScreenMenu is for creating menu buttons and etc. (For example, play/stop button).<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>INTERFACES</b></span><br />
<br />
You may notice that I implemented IScreen and IGameScreen interfaces, I love interfaces. Because, everytime I start a project, I do not need to think about structure or common methods that being used such as "setUpMenu()", so by using interfaces, in a single second, I will know what to do<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>GAMEMANAGER</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-kQHF_Zsf81o/URPP1V8DL1I/AAAAAAAABms/4idKV6TFwZg/s1600/12211.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://1.bp.blogspot.com/-kQHF_Zsf81o/URPP1V8DL1I/AAAAAAAABms/4idKV6TFwZg/s640/12211.png" width="508" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
GameManager is responsible of world and world layers and game state (I will talk about in later tutorials), So I create the main world (Scene2D Group) and add world layers to that world. It may sound like worlds in a main world. (Scene2D Groups being added to a single Scene2D Group)<br />
<br />
At the end I add to main world to Scene2D Stage.<br />
<br />
<br />
<br />
<br />
<b><span style="font-size: large;">TO SUM UP</span></b><br />
<br />
<u>The sructure goes like this;</u><br />
<ol style="text-align: left;">
<li>Screen creates the stage</li>
<li>Screen constructs the GameManager and pass stage to GameManager</li>
<li>GameManager creates the Main World (Scene2D Group) and adds WorldLayers (Scene2D Groups)</li>
<li>Each world layer has different Scene2D Actors due to their purposes (Clouds, Snows, Emeny objects, etc...)</li>
</ol>
I hope you gain some understanding of the fundementals of Scene2D Game/LiveWallpaer structure/logic.<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>IGameManager</b></span><br />
<br />
Again an interface that helps me alot <br />
<br />
public void setUpWorld();<br />
public void startLevel(int levelNumber);<br />
public void checkGameCondition();<br />
public void update(float delta);<br />
public void saveGame();<br />
public void exitGame();<br />
<br />
In each project of mine, I mostly use the methods above, so why not store them in an interface, and easily use it. This is a good practice for your programming skills, saves time and increases efficiency. Furthermore, I can improve it in time.<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-92051622840482661882013-02-04T06:56:00.000-08:002013-02-04T06:56:43.353-08:00# Tutorial (Show Us The Good Series) - Jungle Game Menu<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
You have completed your awesome game (2D/3D or anything else) in LibGDX in your way. Now its time to polish it with interactive stuff like a charming game menu. Lets see how can we do that in only 1 day.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fvPvzu7IwlI/UQ5xxzK11RI/AAAAAAAABlM/r_sI-RN75tU/s1600/01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="255" src="http://2.bp.blogspot.com/-fvPvzu7IwlI/UQ5xxzK11RI/AAAAAAAABlM/r_sI-RN75tU/s400/01.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<span style="font-size: large;"><b>FIRST THINGS FIRST</b></span><br />
<br />
You should know about Mtx which is built over LibGDX Scene2D (please complete the free tutorial series 1,2,3,4), because I will not talk about every detail or Mtx related-classes, I will explain the general idea.<br />
<br />
<b><br /></b>
<span style="font-size: large;"><b>ACTORS BECOMES BUTTONS</b></span><br />
<br />
What I love about LibGDX Scene2D is the actors, they can be anything you can image. In my case I took my SmartModel (which extends AbstractActor) and make it button, "JungleGameButton" class is my button model.<br />
<br />
<br />
<span style="font-size: large;"><b>ALL INTERACTIVNESS IN SAME SCREEN</b></span><br />
<br />
I have only one screen in this tutorial which is responsible for splash/loading, game menu and instructions. I did not create screens for each one of them.<br />
<br />
This way, it is much more impressive, animations, effects, transitions, movements and the composition is much better.<br />
<br />
The life-cycle is like: <br />
<ol style="text-align: left;">
<li>First show splash/loading screen and start background effects like green balloons at the same time</li>
<li>Send menu elements in</li>
<li>Swipe for instructions and send menu elements away, and get instructions</li>
<li>Swipe for menu and send instructions away, and get menu </li>
</ol>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-nk5fLTzA__0/UQ6AL1e1VkI/AAAAAAAABmE/ZOCopXITw70/s1600/08.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-nk5fLTzA__0/UQ6AL1e1VkI/AAAAAAAABmE/ZOCopXITw70/s640/08.jpg" width="467" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>SCREEN STRUCTURE</b></span><br />
<br />
All elements (buttons, flowers, gamename, etc) are in the Screen class, so the screen is like little fields container/database and main manager.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Qo3fypKDoug/UQ52v0VA24I/AAAAAAAABlk/OWse-8QXWJE/s1600/02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="489" src="http://4.bp.blogspot.com/-Qo3fypKDoug/UQ52v0VA24I/AAAAAAAABlk/OWse-8QXWJE/s640/02.png" width="640" /></a><a href="http://4.bp.blogspot.com/-Qo3fypKDoug/UQ52v0VA24I/AAAAAAAABlk/OWse-8QXWJE/s1600/02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"> </a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<u>Screen is the main manager, it is the king who controls other managers, so the real workers are</u><br />
<br />
<br />
<b>JungleMainMenuScreenButtons jungleMainMenuScreenButtons;</b><br />
Set up menu buttons, send them in and away with animations and effects<b> </b><br />
<br />
<b>JungleMainMenuScreenEnvironment jungleMainMenuScreenEnvironment;</b><br />
Set up menu background and name (balloons, gamename, flower), and send them in and away<br />
<b><br />JungleMainMenuScreenInstructions jungleMainMenuScreenInstructions;</b><br />
Set up instructions and send them in and away<b> </b><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>MANAGEMENT</b></span><br />
<br />
Screen will manage all the things it will check if splash is completed or not (I made a fake splash, normally you may use assetmanager of LibGDX)<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3knLLmcntlk/UQ55RXDHPBI/AAAAAAAABls/C17Pk29Wl3I/s1600/03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="341" src="http://1.bp.blogspot.com/-3knLLmcntlk/UQ55RXDHPBI/AAAAAAAABls/C17Pk29Wl3I/s400/03.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
When the splash is completed, screen will command to "jungleMainMenuScreenButtons" to send main menu buttons, social buttons and swipe buttons. Screen will also command to "jungleMainMenuScreenEnvironment" to send the game name in<br />
<br />
Screen is also manages the swipes if you swipe UP and DOWN, Screen will command to "jungleMainMenuScreenButtons" and "jungleMainMenuScreenEnvironment" for sending all the necessary stuff in or away. Please check the "setUpSwipeListener()" method for more detail on this.<br />
<br />
So, I beileve you understood the fundementals of interactive menus/screen. One manager manages all other small manager, command them to do things necesssary.<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>OUR LITTLE MANAGERS (REAL WORKERS)</b></span><br />
<br />
<b>JungleMainMenuScreenButtons jungleMainMenuScreenButtons;</b><br />
Set up menu buttons, send them in and away with animations and effects<b> </b><br />
<br />
<b>JungleMainMenuScreenEnvironment jungleMainMenuScreenEnvironment;</b><br />
Set up menu background and name (balloons, gamename, flower), and send them in and away<br />
<b><br />JungleMainMenuScreenInstructions jungleMainMenuScreenInstructions;</b><br />
Set up instructions and send them in and away<b> </b><br />
<b><br /></b>
<b><br /></b>
<b><br /></b>
All methods in this classes have parameter for the screen, so they can easily reach the element in screen class such as buttons, flowers and etc...<br />
<br />
<b><u>Method structure</u></b><br />
<ul style="text-align: left;">
<li>setUp.....(Screen screen) - set up something, construct it, set position and hide if necessary while waiting splash, set origin, add to stage and etc... This also where to specifiy buttons to do something by using ActorGestureListeners (touchUp/touchDown) </li>
</ul>
<ul style="text-align: left;">
<li>sendIn.....(Screen screen) - send something in to screen, it may also scale things or fade in things by using animations or screen, so this is the place does all that cool transitions, animations </li>
</ul>
<ul style="text-align: left;">
<li>sendAway.....(Screen screen) - exact opposite of sendIn.....()</li>
</ul>
<br />
<br />
I wont explain what are in the methods, it is very easy and upto your imagination/composition. By using Effect Creator, I made some cool animations, transitions, in some places I used Actions directly instead of EffectCreator.<br />
<br />
With this tutorial and the source code, now you can easily do many things for your game. You can use the code anyway you want and also graphics I made for this tutorial are free to use.<br />
<br />
<br /></div>
Unknownnoreply@blogger.com13tag:blogger.com,1999:blog-4697147730233253007.post-14052209846557425632013-01-30T06:24:00.000-08:002013-01-30T06:25:42.719-08:00#4.2 Tutorial (LibGDX & MTX) Test_08_SmartModels<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
This is where thing gets exiting. SmartModel is designed for and easy life for LibGDX Scene2D and Live Wallpaper developers. Lets talk about it.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2Ur_3Ath7dc/UQkgmsaTHFI/AAAAAAAABkM/tBneevMwitg/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://2.bp.blogspot.com/-2Ur_3Ath7dc/UQkgmsaTHFI/AAAAAAAABkM/tBneevMwitg/s400/7.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
<span style="font-size: large;"><b>TEST SCREEN</b></span><br />
<br />
Some of the codes are too long, so I separated this test to 2 classes (Test_08_SmartModels will be out UI and Test_08_SmartModelsHelpers will be our manager)<br />
<br />
<br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><b>SMART MODELS</b></span><br />
<br />
SmartModel class simply extends AbstractActor, it adds lots of smart actions to our actor.Each smart action has ability of make their own decision once they completed its action, and a randomizer helps us to make things natural as it can be.<b> </b>Don't worry, everything happens in the background, so only thing you need to do is identify your action and give parameters you like to increase variation. Smart actions simply are LibGDX Scene2D Actions which brought together to create effective effects.<br />
<br />
For example<br />
<ul style="text-align: left;">
<li>Move actor around the screen freely (Example: background balloons)</li>
<li>Move actor side to side (Clouds:)</li>
<li>Move actor to specific direction from one point in a paradox (Example: Snow flakes)</li>
<li>Rotate actor randomly (Snow flakes rotates)</li>
<li>Scale actor randomly (Snow flakes scales to give 3D feeling)</li>
<li>Fade in/out randomly (Snow flakes vanishes to give more natural feeling)</li>
</ul>
<br />
<br />
<span style="font-size: large;"><b>EXAMPLE:</b></span><br />
<br />
I will not go through each smart action, everything explained in codes, furthermore you can check the codes of SmartAction to see how things are working in the back-end if you want. <br />
<u><br /></u>
<u>First things first</u><br />
<br />
<b> public ArrayList<SmartModel> smartModelList;</b><br />
<br />
I created an array of smart model (each will present a single snow flake, or metal balloon in our example) in my "Test_08_SmartModels" class, and then I pass this list to "Test_08_SmartModelsHelper" class to create the effect/<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6pXI7kQ4wdM/UQkkzg-p3bI/AAAAAAAABkc/JO2HK3I9uSE/s1600/9999999.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
I will focus on our Snow Flake example<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6pXI7kQ4wdM/UQkkzg-p3bI/AAAAAAAABkc/JO2HK3I9uSE/s1600/9999999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="203" src="http://2.bp.blogspot.com/-6pXI7kQ4wdM/UQkkzg-p3bI/AAAAAAAABkc/JO2HK3I9uSE/s320/9999999.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-BHYWo4WjA9g/UQkkhBR_oDI/AAAAAAAABkU/KVGU_MaSeWQ/s1600/999999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="570" src="http://3.bp.blogspot.com/-BHYWo4WjA9g/UQkkhBR_oDI/AAAAAAAABkU/KVGU_MaSeWQ/s640/999999.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: x-small;"><b>*</b>60 SnowFlakes will be created (NOTE: it may say 20 bats in your code, i forget the fix that comment)</span><br />
<br />
<br />
<br />
<b>clear(test_08_SmartModels) </b><br />
This is just for cleaning stage and smartModelList.<br />
<br />
<br />
<b>int rndSizeWidthHeight = rnd.nextInt(50) + 10;</b><br />
<b>SmartModel currentSmartModel = new SmartModel(rndSizeWidthHeight, rndSizeWidthHeight, rnd, true);</b><br />
I want my snow flakes in different sizes and also DIPActive is true for auto-resizing for each different resolution<b> </b><br />
<b><br /></b>
<b><br /></b>
<b>int[] topRangeX = { 0, (int) AppSettings.WORLD_WIDTH };</b><br />
<b>int[] bottomRangeX = { 0, (int) AppSettings.WORLD_WIDTH };</b><br />
<b>currentSmartModel.startActionMoveToDirection(topRangeX,bottomRangeX, (int) AppSettings.WORLD_HEIGHT + 200, -200,9, 3, true, true);</b><br />
Our first smart action, this will move snow flakes in a forever loop<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-dKZdDvdqEV4/UQkpQzdQItI/AAAAAAAABk0/ep0ofAhglTE/s1600/9999999999.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-dKZdDvdqEV4/UQkpQzdQItI/AAAAAAAABk0/ep0ofAhglTE/s400/9999999999.jpg" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<ul style="text-align: left;">
<li>TopRangeX, a range of X-axis for start position of a snow flake, each time randomly number will be choosen in this range</li>
<li>BottomRangeX, a range of X-axis for destination of a snow flake, each time randomly number will be choosen in this range</li>
<li>(int) AppSettings.WORLD_HEIGHT + 200 is for Y-axis start position</li>
<li>-200 is for Y-axis end position, this is where the action ends and repeating itself</li>
<li>9 is seeped (Duration), 3 is minimum speed (Duration), so it will take a random number between 9 seconds and 3 seconds for a snow flake to reach its destination point </li>
<li>isTopDown true, so it will snow top down<u>, in my metal balloon example this is false, so metal balloons moves from down to up like floating bubbles</u></li>
<li>last parameter is for randomizing rangeX, to use or not.</li>
</ul>
<br />
<br />
<b> </b><br />
<b>currentSmartModel.startActionScale(10, 2f, 2f, 3, true);</b><br />
<b>currentSmartModel.startActionRotate(5, 360, 2, true);</b><br />
<b>currentSmartModel.startActionFadeInOut(10, 3, true); </b><br />
<b><br /></b>
The rest of actions are for rotating, scaling and fade in/out, just read method description or play around to see different results<br />
<br />
Things may not be clear at first, but it will make sense in time, and you will be using these single line commands for creating many type of effects for your games and live wallpapers. <br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-4697147730233253007.post-33953915555372493182013-01-30T04:59:00.000-08:002013-01-30T04:59:10.264-08:00#4.1 Tutorial (LibGDX & MTX) Test_07_EffectCreator<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Time to move on to fun stuff like effects. Effects are simply combination of Scene2D Actions. In order to prevent code duplication in everywhere. I collected useful effects under <b>EffectCreator </b>class, you can create effects in a single line of code and dispose them from stage if you want. It is very convenient and useful. Everything is so fast and easy to use.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-fS0zOlv44qE/UQkRbw6BzJI/AAAAAAAABjc/c6Xx5NPZisg/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://3.bp.blogspot.com/-fS0zOlv44qE/UQkRbw6BzJI/AAAAAAAABjc/c6Xx5NPZisg/s400/4.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
<span style="font-size: large;"><b>STRUCTURE OF EFFECTCREATOR</b></span><br />
<br />
The structure is very simple, I made shortscuts for method names to prevent long method names<br />
<br /><b> // SC - Scale<br /> // BTN - Back To Normal<br /> // FI - Fade In<br /> // FO - Fade Out<br /> // SHK - Shake</b><br />
<br />
And the methods are like these;<br />
<br />
<b>EffectCreator.create_SC(.....) </b>// Create scale effect for actor<br />
<b>EffectCreator.create_SC_BTN(....)</b> // Create scale effect and back to normal<br />
<b> EffectCreator.create_SC_SHK_BTN(....) </b>// Create scale effect, then shake, then back to normal<br />
<b> ....</b><br />
<br />
And the method parameters are like these;<br />
<br />
<b>EffectCreator.create_SC_SHK_BTN(Actor, ...bunch of effect parameters..., stage, isRemoveActor);</b> <br />
<ul style="text-align: left;">
<li> First the actor to apply effects</li>
<li> Then effect paramaters such as duration, effect amaount, delay ...</li>
<li> Then if you want to dispose from stage, give the stage and set "isRemoveActor" true, if you do want to dispose, give null to stage and set "isRemoveActor" false</li>
</ul>
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>EXAMPLE:</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-KdP2nOMsX3Y/UQkUCgpUJpI/AAAAAAAABjo/hUyKfCqBmbY/s1600/99999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="368" src="http://3.bp.blogspot.com/-KdP2nOMsX3Y/UQkUCgpUJpI/AAAAAAAABjo/hUyKfCqBmbY/s640/99999.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
In my example the heart object is my actor (testActor). The effect I chose is scale, then shake, then back to normal.<br />
<ul style="text-align: left;">
<li>The very first parameter is our actor </li>
<li>Other two parameters (1.5fs) are for scale amounts (Width and Height)</li>
<li>15f is for shake angle</li>
<li>0 is the original angle of the object this is for going back to normal angle after shake</li>
<li>0.1f is for duration (0.1 miliseconds) for each action</li>
<li>Null is stage (I do not need to dispose so I gave null)</li>
<li>False is for isRemoveActor (I do not need to dispose so I gave false)</li>
</ul>
<br />
You can see how simple it is to use and effective. There could be 10s of more combinations to do, if you want more, create your own EffectCreator and expand more and more with usefull actions and effects.<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-19488229784061699312013-01-29T08:48:00.000-08:002013-01-29T08:48:15.895-08:00#3.7 Tutorial (LibGDX & MTX) Test_06_CollisionDetection<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<br />
Some developers may need collision detection for actors.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1IWodQGlFXQ/UQf7JLrh0zI/AAAAAAAABi8/NmYVjQIvOCE/s1600/999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://1.bp.blogspot.com/-1IWodQGlFXQ/UQf7JLrh0zI/AAAAAAAABi8/NmYVjQIvOCE/s400/999.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
Collision detection is very simple, nothing complicated or impressive about it. I created a class CollisionDetector which has only one method at the moment (it will be improved more in the future) to detect collision of two actors from their rectangles, and returns true or false <br />
<br />
<b> CollisionDetector.getActorsCollisionFromRectangles(Actor a1, Actor a2) </b><br />
<br />
In my example I created two actors (a1 and a2), I created checkCollision() method which constantly check collision in render().<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-sIUUrRo12LE/UQf8GJD65KI/AAAAAAAABjE/w3BwO4YvHKQ/s1600/9999.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-sIUUrRo12LE/UQf8GJD65KI/AAAAAAAABjE/w3BwO4YvHKQ/s640/9999.png" width="624" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-30989380845425708982013-01-29T08:09:00.001-08:002013-01-29T08:15:58.512-08:00#3.6 Tutorial (LibGDX & MTX) Test_05_InputIntent 2<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
What if I just need to detect swipe intentions not minor drags on the screen. The very simple solution is again <b>InputIntent </b>class.<br />
<br />
FOR EXAMPLE: When you get notification center in android, you need to drag abit longer, nut just minor drags like 4-5 pixels.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-nTw3vZaHxRw/UQfwWuu2TvI/AAAAAAAABik/wEorNu4yg6w/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://1.bp.blogspot.com/-nTw3vZaHxRw/UQfwWuu2TvI/AAAAAAAABik/wEorNu4yg6w/s400/3.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>SET DRAG INTERVAL</b></span><br />
<br />
First I need to determine how much drag<b> </b>needed for a specific task, in my example below<br />
<br />
<b> dragAmount = AppSettings.SCREEN_W / 5.0f;<br /> inputIntent.setTouchDragIntervalRange(dragAmount);</b><br />
<br />
Drag amount is 1/5 of the Screen Width (So if you use Samsung Galaxy II, you need to drag 160 pixels, if you use the GSIII, you will need to drag 256 pixels)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-4RoRslUlL2Y/UQfwElqaduI/AAAAAAAABiU/940CC4IaxvY/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="272" src="http://1.bp.blogspot.com/-4RoRslUlL2Y/UQfwElqaduI/AAAAAAAABiU/940CC4IaxvY/s640/9.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>CHECK DRAG INTERVAL</b></span><br />
<br />
It is again very simple, just use:<br />
<br />
<b>inputIntent.isTouchDragInterval() // </b>This simple will return true if needed drag amount achieved which you set in above example (dragAmount)<b> </b>inputIntent.setTouchDragIntervalRange(dragAmount);<br />
<br />
In my example I only want to detect drags to LEFT and RIGHT, I do not care for UP and DOWN drags, So if user drags to LEFT or RIGHT and if it is DRAG INTERVAL return true and do something.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Gfab-kttpJQ/UQfwTsxcBcI/AAAAAAAABic/B9J2qXLmE1c/s1600/99.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="467" src="http://4.bp.blogspot.com/-Gfab-kttpJQ/UQfwTsxcBcI/AAAAAAAABic/B9J2qXLmE1c/s640/99.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>EXAMPLE</b></span><br />
<br />
The best example you can see in one my live wallpaper projects. "Christmas Live Wallpaper"<br />
<br />
You need to drag a specific amount to UP and DOWN to switch between Christmas Tree and Christmas Objects.<br />
<br />
<b>NOTE:</b> The InputIntent I used in this live wallpaper abit old version, back then it was only detecting by removing finger off the screen each time. The current InputIntent much more improved and better.<br />
<br />
(<a href="https://play.google.com/store/apps/details?id=com.mt.android.photoextremefx" target="_blank">Google Play</a>)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-2xeU1kvUgHY/UMHQxFrThWI/AAAAAAAABTs/P4z4NHP_Qog/s1600/s2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-2xeU1kvUgHY/UMHQxFrThWI/AAAAAAAABTs/P4z4NHP_Qog/s320/s2.png" width="192" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4697147730233253007.post-49701999097255639062013-01-29T07:37:00.003-08:002013-01-29T07:37:17.475-08:00#3.5 Tutorial (LibGDX & MTX) Test_04_InputIntent 1<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Sometimes we need to detect drag direction of user (without removing finger off the screen or vice-versa), Also we may need to detect which area of the screen being touched at the moment. The solution is <b>InputIntent</b> Class, extremely easy to use.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Q1YWOZtJvww/UQfgzv7WwhI/AAAAAAAABhk/0fweWduVbUo/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="http://3.bp.blogspot.com/-Q1YWOZtJvww/UQfgzv7WwhI/AAAAAAAABhk/0fweWduVbUo/s400/2.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
<span style="font-size: large;"><b>HOW TO SET UP INPUTINTENT</b></span><br />
<br />
So simple, There are two way of detectiog touches, registering ActorGestureListener or by implementing InputProcessor.<br />
<br />
(Below a screen shot) for set up of ActorGestureListener of stage. First I constructed the InputIntent, then I set necessary methods to make calculations<br />
<br />
<b>touchDown </b><br />
inputIntent.setTouchInitials(x, y); // Set initial position of finger, mouse, etc...<br />
<br />
<b>pan </b>(Pan is dragging, I closed method in screenshot, because it was too long)<br />
inputIntent.setTouchCurrents(x, y); // Set current position of finger, mouse, etc...<br />
<br /><b>touchUp </b><br />
inputIntent.reset(); // Reset when finger, mouse is off the screen<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-E7OFIHL9OI0/UQfiDXinEcI/AAAAAAAABhs/bbLmKcfM2jk/s1600/6png.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="496" src="http://3.bp.blogspot.com/-E7OFIHL9OI0/UQfiDXinEcI/AAAAAAAABhs/bbLmKcfM2jk/s640/6png.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
If you implementing InputProcesser everything is similar. (I have used ActorGestureListener in my test codes), this is just to show who uses InputProcessor<br />
<br />
<b>WARNING 1!</b><br />
AbstractScene already registers input processor Gdx.input.setInputProcessor(stage);<br />
<br />
If you want to use multiple processors for stage and current screen which implements input processor, you have to overrite your inputprocessor settings by using inputmultiplexer. Than construct your inputintent in the constructor. <br />
<br /><b> InputMultiplexer plex = new InputMultiplexer();<br /> plex.addProcessor(this);<br /> plex.addProcessor(getStage());<br /> Gdx.input.setInputProcessor(plex);<br /> //<br /> inputIntent = new InputIntent();</b><br />
<br />
<br />
The rest is similar to actorgesturelistener.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-YXI8DvmWKsY/UQfjzG6xHRI/AAAAAAAABh0/J_4PIRrkVaA/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="264" src="http://2.bp.blogspot.com/-YXI8DvmWKsY/UQfjzG6xHRI/AAAAAAAABh0/J_4PIRrkVaA/s640/7.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-E7OFIHL9OI0/UQfiDXinEcI/AAAAAAAABhs/bbLmKcfM2jk/s1600/6png.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>HOW TO USE INPUT INTENT</b></span><br />
<br />
It is so simple. <br />
<br />
<b>WARNING 2! </b><br />
If you use implement inputProcessor instead of using ActorGestureListener, defaultly libgdx world Y-axis opposite as you know if you dont do something about it, so DOWN means will be UP, UP means will be DOWN.<br />
<br />
In my example I use ActorGestureListener to detect touches so everything is normal for my example.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DWGyjoiLjOg/UQfqEZ0N0-I/AAAAAAAABiM/gVMwd8Clvxc/s1600/8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="376" src="http://2.bp.blogspot.com/-DWGyjoiLjOg/UQfqEZ0N0-I/AAAAAAAABiM/gVMwd8Clvxc/s640/8.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
As you cans see the example (Up Screenshot).It is very simple, inputIntent.getDirectionIntent() will return current direction (DirectionIntent), just check for direction and do whatever you want. In my case, I turn the arrow on left and rewrite the text at the bottom due to current drag direction.<br />
<br />
<b>DirectionIntent could be TOUCH_IDLE, TOUCH_D_UP, TOUCH_D_DOWN, TOUCH_D_LEFT, TOUCH_D_RIGHT</b><br />
<br />
You can also check the current touch area see the rest of class, observe the codes and read the documentation by hovering on methods. Everything is easy to use and understand.<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-48636610000118429652013-01-28T08:28:00.000-08:002013-01-28T08:28:28.868-08:00#3.4 Tutorial (LibGDX & MTX) Test_03_AbstractActors<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
AbstractActors are %100 same with Mtx v1.0 with additional features;<br />
<br />
- New constructor with DIPActive (we talked about this previously...)<br />
- Particle Ready<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-iQLy-NPMlg4/UQagtdeBObI/AAAAAAAABgU/RlJPic-LnhQ/s1600/xxx.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/-iQLy-NPMlg4/UQagtdeBObI/AAAAAAAABgU/RlJPic-LnhQ/s400/xxx.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
<br />
<span style="font-size: large;"><b>POSITIONING AGAIN </b></span><br />
<br />
Before moving on, I want to talk about positioning one more time to get things more clear<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-GcoJAPiA_Po/UQahRuOh5pI/AAAAAAAABgc/tqBJE6LCFQg/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="377" src="http://2.bp.blogspot.com/-GcoJAPiA_Po/UQahRuOh5pI/AAAAAAAABgc/tqBJE6LCFQg/s640/4.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
In top picture, you see heart, fire and particle effects, it is all same actor (testActor).<br />
<br />
As you know my target world dimensions in app settings is 960x540, for this world I wanted to set testActor to position 600x250. But I want my actor to be same/similar position in every device on this planet. So, I multipled my position with; <br />
<br />
<b>600 * AppSettings.getWorldPositionXRatio()</b><br />
<b>250 * AppSettings.getWorldPositionYRatio()</b><br />
<br />
So if my device resolution is 960x540 the position will be 600x250, if my device resolutuion is 800x480, actos position will be 600 * (800 / 960) for X-axis, and 250 * (480 / 540) for Y-axis. These will get me estimated positions for each device (But not perfect position because of many ratio differences in devices)<br />
<br />
<u>DIPActive constructor</u><br />
<br />
Here example of extra new constructor for DIPActive calculations to auto-resize. There is no auto-positioning, it should be done manually like above example, if you need it.<br />
<br />
<b>testActor = new EmptyAbstractActor(150, 150, true);</b><br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>ABSTRACTACTOR</b></span><br />
<br />
As I said earlier it is same with Mtx v1.0. You can set everything for actors now<br />
<br />
- Texture<br />
- Animation<br />
- Animation Momentary<br />
- Particles<br />
<br />
Here example of adding particle:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-r87G9JwUF10/UQakhBOM2XI/AAAAAAAABg0/ZPM0So3Tq1w/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="337" src="http://3.bp.blogspot.com/-r87G9JwUF10/UQakhBOM2XI/AAAAAAAABg0/ZPM0So3Tq1w/s640/5.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Particles created by particle editor, You can export the particle data (example: particle.p), and add them to<br />
Android projects Assets/Data folder (If you use image in you<b>r</b> particle add image as well)<br />
<br />
Particle Editor: http://code.google.com/p/libgdx/wiki/ParticleEditor<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-kDavHp2x05Q/UQalnxFVeaI/AAAAAAAABhA/BLY51guvWVI/s1600/particleeditor.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="355" src="http://2.bp.blogspot.com/-kDavHp2x05Q/UQalnxFVeaI/AAAAAAAABhA/BLY51guvWVI/s400/particleeditor.jpg" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-4697147730233253007.post-83632353596124663082013-01-28T07:24:00.000-08:002013-01-28T07:24:47.752-08:00#3.3 Tutorial (LibGDX & MTX) Test_02_AppSettings<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Test_01 is for all tests menu screen, so there is not much talk about main menu at the moment. Here lets look at Test_02:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-jNYiGaDVIf0/UQZqTISzWcI/AAAAAAAABfA/9h7j7OofVBs/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="251" src="http://3.bp.blogspot.com/-jNYiGaDVIf0/UQZqTISzWcI/AAAAAAAABfA/9h7j7OofVBs/s400/9.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<span style="font-size: large;"><b>BEFORE WE START TO TEST 02 </b></span><br />
<br />
Now, previously we talked about App Settings, before we set any screen in the main game/live wallpaper start we have to setup app settings (AppSettings.setUP() )<br />
<br />
Here in out MainStarter (extends LibGDX game)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-_wjM_C46ojA/UQZpMReQmaI/AAAAAAAABe0/sQtaF0h-GQ8/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="360" src="http://1.bp.blogspot.com/-_wjM_C46ojA/UQZpMReQmaI/AAAAAAAABe0/sQtaF0h-GQ8/s640/1.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b>AppSettings.setUp(); </b>Set up WORLD_TARGET_WIDTH / HEIGHT, SCREEN_W / H, WORLD_WIDTH / HEIGHT for our games or live wallpapers<br />
<b>Assets.loadAll();</b> Load all assets (Textures, fonts, animations, sounds, etc...)<br />
<b>setScreen(new Test_01_AllTestsScreen(this, "All Tests Screen"));</b> Set all test screen as our first screen<br />
<br />
<br />
<br />
<br />
<b><br /></b>
<span style="font-size: large;"><b>MORE UNDERSTANDING OF STRETCH FREE ACTORS/TEXTURES</b></span><br />
<br />
You saw the heart shape in this test (top picture), this heart perfectly sized for all resolutions, normally, it should have been stretched abit for some devices such as devices with 4:3 ratio. Thanks the our anti-stretcher formula, it will look same in every device on this planet!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-FbRIZzYLVY8/UQZrpAZbymI/AAAAAAAABfk/4AYBuIL1cC4/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="369" src="http://3.bp.blogspot.com/-FbRIZzYLVY8/UQZrpAZbymI/AAAAAAAABfk/4AYBuIL1cC4/s640/2.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Lets talk about this<br />
<br />
I designed the heart 250x250 in my graphic editor for 960x540 (Virtual World Dimensions), In my constructor of Light Abstract Actor last parameter (DIPActive) is "true".<br />
<br />
<u>In background code if DIPActive is true, heart will be scaled:</u><br />
<br />
<b>heart.getWidth() * AppSettings.getWorldSizeRatio();</b><br />
<b>heart.getHeight() * AppSettings.getWorldSizeRatio();</b><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><b>POSITIONING </b></span><br />
<br />
Positioning is not easy like auto-sizing, so DIPActive does not calculate the positions. Position will be different for different devices. However, I created a position-ratio calculator for different device resolution. It will be calculating estimated position for each device). But this have to be done manually if you want auto positioning<br />
<br />
See the text example (Bottom descriptive text in our test screen, see the top picture "ORIGINAL HEART SIZE....")<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Cv6FL8YLiTY/UQZuCW_mtVI/AAAAAAAABf8/8vYRoFzrfpM/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="398" src="http://4.bp.blogspot.com/-Cv6FL8YLiTY/UQZuCW_mtVI/AAAAAAAABf8/8vYRoFzrfpM/s640/3.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
I wanted to set position (15,95) for first text in a world 960x540<br />
<br />
<b>text.setX(15);</b><br />
<b>text.setY(95 * AppSettings.getWorldPositionYRatio());</b><br />
<br />
X position is 15 without any auto positioning, and the X position wont change for each device (For example, if a device width 960 it will be at 15, if a device width 480, it will be still at 15). Text will appear on very left on first device, for second device it will also appear on left but it will be close to center. (In both devices you will feel a difference, NOT GOOD!)<br />
<br />
Y-axis, By using AppSettings.getWorldPositionYRatio(); we will auto position for Y-axis, so if my device height 540 if will appear on 95, if my device height 270 it will appear on around 47,5....<br />
<br />
I hope again you understand the challenges of auto sizing and positioning for 10s of different device resolutions.<br />
<br />
<br />
<u><span style="font-size: large;"><span style="color: #990000;"><b>NOTE:</b></span></span> </u><br />
<br />
<b>Auto sizing (DIPActive) and manual positioning techniques are optional, you do not have to use these, but they work great, for example for my live wallpapers, I got many great comments for Samsung Galaxy NOTE II, GS II, GSIII, G Ace... it means people use them and they work great. I use these techniques on my many projects.</b><br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-5907979157085921502013-01-28T07:06:00.000-08:002013-01-28T07:06:08.453-08:00#3.2 Tutorial (LibGDX & MTX) Anti-Strecth/Black Bars Formula<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<b><span style="font-size: large;">STRETCHING<span style="font-size: large;"> /</span> BLACK BARS</span> </b><br />
<br />
<b>What is the problem of all developers</b>, definitely device resolutions. Is there a perfect fix for the problem, unfortunately NO, but we can %90-95 adopt a solution to fix this problem. Of course, there is already another solution with black bars, but we do not want that.<br />
<br />
<b>What are the regular resolutions</b>, 320x240, 480x800, 960x540, 1280x720, 1920x1080 and other similar resolutions with minor changes.<br />
<br />
<br />
If you already use the Mtx v1.0, you will see the stretch problem for the devices with different resolutions beside 800x480. But with Mtx v2.0, I created a basic idea to fix the problem.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-FipI2uIDEM4/UQUMj6e7R2I/AAAAAAAABc8/d34ay8-QfHk/s1600/1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="531" src="http://3.bp.blogspot.com/-FipI2uIDEM4/UQUMj6e7R2I/AAAAAAAABc8/d34ay8-QfHk/s640/1.jpg" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
As you can notice Mtx v2.0 works just fine with almost perfect sizing for all devices, but Mtx v1.0 and many developers who develop games feels this stretching, it is especially noticeable with ovals, they become ellipses<br />
<br />
<br />
<br />
<b><span style="font-size: large;">APP SETTINGS 1</span></b><br />
<br />
I will try to explain my method, do not confuse yourself, it will be more clear with next tutorials, I will explain the basic idea. I am more of live wallpaper developer than games (also developing games). This method suits me perfectly most of times for all type of devices.<br />
<br />
<b>Here is the idea:</b><br />
<br />
You should have Target World Size to prepare your textures, I like 960x540 dimension, it is kind of bridge among all device dimensions, and you should prepare all your textures for this world dimensions.<br />
<br />
<b>How to do:</b><br />
<br />
Simply in your graphic editor, open new file with dimensions (I chose 960x540 below), then prepare your textures, it is like creating a web page.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2MvovlTW-TM/UQUTopQPAqI/AAAAAAAABdQ/4tZjIFaHM44/s1600/2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="348" src="http://2.bp.blogspot.com/-2MvovlTW-TM/UQUTopQPAqI/AAAAAAAABdQ/4tZjIFaHM44/s640/2.jpg" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b><span style="font-size: large;">APP SETTINGS 2</span></b><br />
<br />
<b>In my app settings class, I set the my target world (The dimension matches with my graphic editor)</b><br />
<br />
WORLD_TARGET_WIDTH = 960;<br />
WORLD_TARGET_HEIGHT = 540;<br />
<br />
<b>I set my real world size (I genereally use the size as device resolution, but if you want to a bigger world which is draggable around like Angry birds, you should give bigger values than SCREEN_W and SCREEN_H)</b><br />
<br />
WORLD_WIDTH = Gdx.graphics.getWidth();<br />
WORLD_HEIGHT = Gdx.graphics.getHeight();<br />
<br />
<b>Device screen resolutions (For example Samsung GSII SCREEN_W is 800, and Samsung G Ace SCREEN_W is 480), this is used for Scene2D stage creation in AbstractScene</b><br />
<br />
SCREEN_W = Gdx.graphics.getWidth();<br />
SCREEN_H = Gdx.graphics.getHeight();<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-DLJcDhRd_cg/UQUVPdO9fhI/AAAAAAAABdk/_KPKP27eGPk/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="448" src="http://3.bp.blogspot.com/-DLJcDhRd_cg/UQUVPdO9fhI/AAAAAAAABdk/_KPKP27eGPk/s640/3.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b>Basic formula</b><br />
<br />
I will calculate ratio of the current device resolution with my target world size, and I will use this ratio to re-size my AbstractActors which has "DIPActive" parameter true in their constructor. (Only using width to get ratio, this is only solution at the moment)<br />
<br />
<u>EXAMPLE:</u><br />
Htc DROID has 960x540, so my home button size will be 150x150 on that device (NO CHANGE)<br />
Samsung Galaxy SII has 800x480, my home button will be 125x125<br />
<br />
<br />
<br />
<b><span style="font-size: large;">HOW TO IMPROVE <span style="font-size: large;">& DRAW<span style="font-size: large;">BACKS</span></span></span></b><br />
<b><span style="font-size: large;"><br /></span></b>
<span style="font-size: large;"><span style="font-size: small;">Of course this is a style<span style="font-size: small;"> of <span style="font-size: small;">res<span style="font-size: small;">izing <span style="font-size: small;">single <span style="font-size: small;">textures for all devices. Some <span style="font-size: small;">peo<span style="font-size: small;">ple can mention about performa<span style="font-size: small;">nce problems or <span style="font-size: small;">quality <span style="font-size: small;">issues </span>with </span></span></span></span></span></span></span></span></span></span></span><span style="font-size: large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">device </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> resolutions +1<span style="font-size: small;">920x1080<span style="font-size: small;">. So thi<span style="font-size: small;">s are <span style="font-size: small;">c<span style="font-size: small;">o<span style="font-size: small;">uple of drawbacks of using singl<span style="font-size: small;">e texture for all de<span style="font-size: small;">vices</span></span>.</span></span></span></span></span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">The <span style="font-size: small;">best idea to s<span style="font-size: small;">olve this, creating 2 textures (med<span style="font-size: small;">ium q<span style="font-size: small;">uality and high<span style="font-size: small;"> quality</span></span></span>) for each object and re<span style="font-size: small;"><span style="font-size: small;">w<span style="font-size: small;">rite<span style="font-size: small;"> app settings and <span style="font-size: small;">assets l<span style="font-size: small;">oadings for<span style="font-size: small;"> different devices.</span></span></span> <span style="font-size: small;">You can even create 3 texture<span style="font-size: small;">s (<span style="font-size: small;">meduim, high, e<span style="font-size: small;">xtra high quality for table<span style="font-size: small;">ts<span style="font-size: small;">)<span style="font-size: small;"> f<span style="font-size: small;">or each in your graphic editor.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">So it could <span style="font-size: small;">like</span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<br />
WORLD_TARGET_WIDTH_LOW = 480;<br />
WORLD_TARGET_HEIGHT_LOW = 320;<br />
WORLD_TARGET_WIDTH_MED = 960;<br />
WORLD_TARGET_HEIGHT_MED = 540;<br />
WORLD_TARGET_WIDTH_HIGH = 1920;<br />
WORLD_TARGET_HEIGHT_HIGH = 1080;<br />
<br />
Then detect device resolution (low, high, medium), then overrite the world size calculator which scales all AbstractActors which has "DIPActive" parameter true in their constructor. Also load right assets due to low, med and high resolutions.<br />
<br />
AppSettings.getWorldSizeRatio();<br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;"><span style="font-size: small;">I <span style="font-size: small;">hope<span style="font-size: small;"> you get <span style="font-size: small;">some <span style="font-size: small;">understanding.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> <br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-14051034064046244722013-01-28T06:58:00.001-08:002013-01-28T06:58:56.630-08:00#3.1 Tutorial (LibGDX & MTX v2.0) Tutorial Structures & Project<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Since Mtx v1.0, couple of new changes made over mtx, it is now more structured. Project and tutorial style will be similar with minor changes. If you like LibGDX Scene 2D, this will make your life easier<span style="font-size: large;"><span style="font-size: small;"> for games, games menus<span style="font-size: small;">, live wallpapers and so on...</span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-WXGv8p6wAoc/UQZPj9_3JpI/AAAAAAAABeg/3PczVylMCeE/s1600/800x480.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="251" src="http://4.bp.blogspot.com/-WXGv8p6wAoc/UQZPj9_3JpI/AAAAAAAABeg/3PczVylMCeE/s400/800x480.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a name='more'></a><br />
<br />
<br />
<b style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #fafaf7; color: #444444; font-family: 'Open Sans'; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><u>How can it be used:</u></b><br />
<ul style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #fafaf7; color: #444444; font-family: 'Open Sans'; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; margin: 0.5em 0px; orphans: 2; padding: 0px 2.5em; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">First of all it is pure LibGDX, so you can develop your game in your way (2D / 3D) with LibGDX and add MTX over it without any problems</li>
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">Main menu and game menus with animations, easy to use buttons, no stretching problems (only Mtx v2.0)</li>
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">Game background envrionments, bubbles, snows, parallax effects, clouds, animated object anything about game envrionment can be done in seconds</li>
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">Live wallpapers (I made a small forthune with them), Top-notch, very detailed and high quality live wallpapers can be done in days</li>
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">Simple touch, touch drag and collison detections for your needs</li>
<li style="margin: 0px 0px 0.25em; padding: 0px; text-indent: 0px;">Games, you can develop a full game without any problems, if you like abilities of LibGDX Scene2D</li>
</ul>
<br />
<br />
GET FREE SOURCE CODE AND APK FROM<a href="http://moribitotechx.blogspot.co.uk/p/download.html" target="_blank"> DOWNLOAD PAGE</a><br />
<br />
<br />
<span style="font-size: large;"><u><b>Project</b></u></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-pqyy2G6j-bk/UQZNHPuTlHI/AAAAAAAABd4/Y7-xDtmuMU8/s1600/intro2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="365" src="http://1.bp.blogspot.com/-pqyy2G6j-bk/UQZNHPuTlHI/AAAAAAAABd4/Y7-xDtmuMU8/s400/intro2.jpg" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;"><u><b>Tutorials</b></u></span><br />
<br />
Each test is a Screen with a number, each class may have codes from other tests, to check the which code is related to current test, just focus on green comments with number. ("Test 06.2" means that this part of code is related to test 06)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-0t8HLvT_X2I/UQZOa849WyI/AAAAAAAABeM/deJSlNSDEJY/s1600/intro.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="388" src="http://2.bp.blogspot.com/-0t8HLvT_X2I/UQZOa849WyI/AAAAAAAABeM/deJSlNSDEJY/s640/intro.jpg" width="640" /></a></div>
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4697147730233253007.post-77658552768365835042013-01-26T05:39:00.000-08:002013-01-26T05:44:22.096-08:00Mtx v2.0 Almost Here<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-evA2f6LXZZg/UQPbqHqc2TI/AAAAAAAABco/Hi1Xa4GochI/s1600/mtxv20.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="640" src="http://3.bp.blogspot.com/-evA2f6LXZZg/UQPbqHqc2TI/AAAAAAAABco/Hi1Xa4GochI/s640/mtxv20.png" width="425" /></a></div>
<br />
First of all, I have to thank LibGDX family. They helped me make a small fortune from games and live wallpapers.<br />
<br />
I managed to finish the second version of MTX with sexy new features beside my works with other developers. Everything is much easier.<br />
<br />
Many problems are fixed. Its totally game and live wallpaper ready. I will start publishing tutorials with the code next week.<br />
<br />
Stay tuned....</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-23909278390473402402013-01-22T11:16:00.001-08:002013-01-22T11:16:21.250-08:00Blog Updates
I was updating the blog recently, its now %90 updated. I am working so hard nowadays, but many things are completed now.
Stay tuned...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4697147730233253007.post-39657389589587753362012-12-07T05:59:00.001-08:002012-12-07T06:05:24.550-08:00# Update - MTX v2.0 New version is coming soon (Faster, Easier and StraightForward)<div dir="ltr" style="text-align: left;" trbidi="on">
I was updating the Mtx Framework, what is coming in new version.<br />
<br />
- Light actors, groups... (Save memory for specific tasks)<br />
- Game and World management (Very very easy to implement)<br />
- Lots of utilities and helpers<br />
- Ready effects for use instantly<br />
- And Box2D/Scene2D becomes one, if you need Box2D World, so easy to implement<br />
- More will be coming...<br />
<br />
<b>Things are so quick now (I managed to develop a Live Wallpaper in 3 days):</b><br />
(<a href="https://play.google.com/store/apps/details?id=com.mt.android.photoextremefx">Google Play</a>)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-IBCCm2QXnkQ/UMHQtnYszsI/AAAAAAAABTk/FmE7ddmcSnY/s1600/s1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-IBCCm2QXnkQ/UMHQtnYszsI/AAAAAAAABTk/FmE7ddmcSnY/s320/s1.png" width="192" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Latest package (Still working on it):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-FKTZNTHPJ8I/UMH2C8_X40I/AAAAAAAABUA/LEpE8S1tjgs/s1600/mtxx.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-FKTZNTHPJ8I/UMH2C8_X40I/AAAAAAAABUA/LEpE8S1tjgs/s320/mtxx.png" width="121" /></a></div>
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-4697147730233253007.post-11698930826804192352012-09-25T04:06:00.000-07:002012-09-25T04:08:03.030-07:00# Game Talks - How to make $5000 monthly on mobile platforms ?<div dir="ltr" style="text-align: left;" trbidi="on">
<b>IT IS NOT WHAT YOU CAN DO, IT IS WHAT THEY WANT !</b><br />
<b><br /></b>
When I started my android app & game development journey, I was a experienced and very good developer with OOP and Java already. I completed large projects with success during the years.<br />
<br />
<b><u>My first attempt to android world</u></b><br />
<b><u><br /></u></b>
Theme Note (<a href="https://play.google.com/store/apps/details?id=com.mt.android.themenote">Google Play</a>) was my first project, it was a cool project and took me about <span style="color: #cc0000; font-weight: bold;">3-4 weeks </span>to complete. It has been around 5-6 months now and in 5 different app markets, but successes rate and earning is ridiculous. <b>Lifetime revenue is under $200 of this app, </b>eventually I removed the ads and gave it to all users as a gift.<br />
<br />
<a name='more'></a><br />
<br />
<b><u>Next attempts</u></b><br />
<b><u><br /></u></b>
Finger Print Scanner (<a href="https://play.google.com/store/apps/details?id=com.mt.android.fingerprint">Google Play</a>)<br />
Fortune Teller D.E.A.R. (<a href="https://play.google.com/store/apps/details?id=com.mt.android.fortuneteller">Google Play</a>)<br />
<br />
These 2 apps took me <b><span style="color: #cc0000;">1 week</span> </b>to complete. Extremely easy, It has been around 3-4 months, and <b>Lifetime revenue is +$3000. </b>Funny, so easy and entertaining, this is what people wants, at least %70 of users (10 - 30 age)<br />
<b><br /></b>
<b><u>Game Attempts</u></b><br />
<b><u><br /></u></b>
I created Puzzle Slide game as a quick project, <span style="color: #cc0000; font-weight: bold;">3-4 weeks </span>to complete. Not much revenue to talk about. Game should be easy and quick to implement.<br />
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b>APPS MAKING +$5000 MONTHLY</b><br />
<b><br /></b>
I know many many developers who understood the right strategy for apps world. I know a guy who spent 6 months to create games (High quality physic games), and failed to make high revenue. Then, he did two apps<br />
Porn Sounds and Celebrity Fan App. No he makes <span style="color: #cc0000; font-weight: bold;">+$200 daily </span>from these 2 apps.<br />
<br />
Do not get me wrong, I do not say not to develop games, I say develop them quickly and not spend lots of ours on it. Spend maximum 1 month for a game. Because, Game teams and Major companies develop advanced games every month, impossible to competing them. As single developers, we should focus on funny, easy and entertaining apps and games, not very large projects.<br />
<br />
For large projects (+ months), gather a team of 3 or 4. Of course there is also "luck factor", your game could get millions of installs by luck (or maybe with right marketing). I am sure you can develop awesome games in 3 months, impressive physic games, but chance of success is very low.<br />
<br />
This is why I created <span style="color: #cc0000; font-weight: bold;">MTX Framework </span>, when you have game idea, you should be developing it as fast as possible, because we are running of ideas and lifetime of a game is around 6 months in all markets, beacuse there are too many games and apps (+600,000) and increasing everyday. Do not waste months for games if you are a single developer, fail rate is so high.</div>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-4697147730233253007.post-1363361498132591102012-09-23T10:04:00.001-07:002012-09-23T10:26:57.372-07:00#2.4 Tutorial (LibGDX & MTX) Test8_GameMenu<div dir="ltr" style="text-align: left;" trbidi="on">
<b>TEST SCREEN</b><br />
<b><br /></b>
<span style="background-color: #fafaf7; color: #444444; font-family: 'Open Sans'; font-size: 13px; line-height: 18px;">Everything is same with previous test screens. Did you play <a href="https://play.google.com/store/apps/details?id=com.rovio.amazingalex.premium">Amazing Alex</a>, did you see the sliding menus from both side, do you know how easy is to implement that with LibGDX and with abit help of MTX. I also used these in my game <a href="https://play.google.com/store/apps/details?id=com.mt.android.slidepuzzleevo3">Puzzle Slide</a>.</span><br />
<span style="background-color: #fafaf7; color: #444444; font-family: 'Open Sans'; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-itlbgQHKVl4/UF8-1zJtCsI/AAAAAAAAAic/RiN1Y4RSc1c/s1600/Untitled+picture.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="406" src="http://2.bp.blogspot.com/-itlbgQHKVl4/UF8-1zJtCsI/AAAAAAAAAic/RiN1Y4RSc1c/s640/Untitled+picture.png" width="640" /></a></div>
<span style="background-color: #fafaf7; color: #444444; font-family: 'Open Sans'; font-size: 13px; line-height: 18px;"><br /></span>
<br />
<br />
<br />
<br />
<br />
-<br />
<br />
<a name='more'></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b>TABLEOVERLARYER from MTX</b><br />
<b><br /></b>
Table overlayer is only extending Table of LibGDX with a texturebackground. Of course normally Table has a texture if you need, but I like these abstraction, I have cool ideas for next versions of MTX, very rich features for tableoverlayers. <u>You can check this class in mtx package.</u><br />
<u><br /></u>
<u><br /></u>
<b><br /></b>
<b><br /></b>
<b>MENUSIDEBOXOVERLYAYER as Test Model</b><br />
<b><br /></b>
This is only extending TableOverLayer I mentioned before. So basic, so fast and very effective.<br />
<br />
<pre class="brush: java; highlight: [4]; toolbar: false">public class MenuSideBoxOverLayer extends TableOverLayer {
public MenuSideBoxOverLayer(TextureRegion textureBackground, float x,
float y, float width, float height) {
super(textureBackground, x, y, width, height);
}
}</pre>
<br />
<b><br /></b>
<b><br /></b>
<b>SETTING SIDE SLIDING MENU</b><br />
<u><br /></u>
I created two menusideboxlayers for left and right with different widths and with a transparent black texture, I set their initial positions out side of the screen. I put a ButtonToggle from MTX to slide in and out with actions. I also put dummy buttons for test, and its done.<br />
<br />
<pre class="brush: java; highlight: [4]; toolbar: false">private void setUpGameMenu() {
// #8.1 TEST
// Create two side boxes in different sizes
// Make them out of the screen
// Left box 120px - Right box 80px
// ###################################################################
sideBoxLeft = new MenuSideBoxOverLayer(Assets.imgTransparentBlack, -120, 0, 120, getStage().getHeight());
sideBoxRight = new MenuSideBoxOverLayer(Assets.imgTransparentBlack, getStage().getWidth(), 0, 80, getStage().getHeight());
getStage().addActor(sideBoxLeft);
getStage().addActor(sideBoxRight);
//8.2 TEST
// Create a menu button anyhere you want, I use a toggle button here
// Toggle Button
// ####################################################
final ButtonToggle btnTest = MenuCreator.createCustomToggleButton(Assets.btnAllMenuPressed, Assets.btnAllMenu, false);
btnTest.setPosition(getStage().getWidth() / 2 - 100, 20);
btnTest.setText(Assets.font2, "Menu", true);
btnTest.setTextPosXY(20, 50);
btnTest.addListener(new ActorGestureListener() {
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
super.touchUp(event, x, y, pointer, button);
// Toggle the button, and change animation of abstract actor
btnTest.setToggleSwitch();
if(btnTest.isToggleActive()){
// Send boxes into screen
sideBoxLeft.addAction(Actions.moveTo(0, 0, 0.4f));
sideBoxRight.addAction(Actions.moveTo(getStage().getWidth() - 80, 0, 0.4f));
} else{
// Send boxes out of screen
sideBoxLeft.addAction(Actions.moveTo(- 120, 0, 0.4f));
sideBoxRight.addAction(Actions.moveTo(getStage().getWidth(), 0, 0.4f));
}
}});
getStage().addActor(btnTest);
//#8.3 TEST
// Dummy buttons to put on boxes, just for fun
// #########################################################
ButtonGame btnTest1 = MenuCreator.createCustomGameButton(Assets.btnBatCircle, Assets.btnBatCirclePressed);
sideBoxLeft.add(btnTest1);
sideBoxLeft.row();
ButtonGame btnTest2 = MenuCreator.createCustomGameButton(Assets.btnBatCircle, Assets.btnBatCirclePressed);
sideBoxLeft.add(btnTest2);
sideBoxLeft.row();
ButtonGame btnTest3 = MenuCreator.createCustomGameButton(Assets.btnBatCircle, Assets.btnBatCirclePressed);
sideBoxLeft.add(btnTest3);
sideBoxLeft.row();
ButtonGame btnTest4 = MenuCreator.createCustomGameButton(Assets.btnBatCircle, Assets.btnBatCirclePressed);
sideBoxLeft.add(btnTest4);
sideBoxLeft.row();
ButtonGame btnTest5 = MenuCreator.createCustomGameButton(Assets.btnLevel, Assets.btnLevelPressed);
sideBoxRight.add(btnTest5);
sideBoxRight.row();
ButtonGame btnTest6 = MenuCreator.createCustomGameButton(Assets.btnLevel, Assets.btnLevelPressed);
sideBoxRight.add(btnTest6);
sideBoxRight.row();
}</pre>
<br />
<br /></div>
Unknownnoreply@blogger.com1