tag:blogger.com,1999:blog-86221298310314923002024-03-13T13:10:35.195-07:00TheInvader360Android Game Development BlogTheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.comBlogger35125tag:blogger.com,1999:blog-8622129831031492300.post-84788018704151387302020-06-02T13:22:00.002-07:002020-06-02T14:39:15.006-07:00Hello again, World...<div dir="ltr" style="text-align: left;" trbidi="on">
I've neglected this little corner of the web for nearly three years, shame on me!<br />
<br />
A lot has happened in that time. I was promoted at work (Yay!)... Then I was made redundant when the company folded (Boo? Hiss? Maybe, maybe not, I'm undecided...). Our children celebrated some birthdays - our eldest is now 6, and our youngest is 3. I suppose we got a little older too, but the less said about that the better! I've taken care of some real world projects - mostly satisfying physical work involving wood and concrete and hand tools and sweat. Oh yeah, and the whole goddamn world has been turned upside down thanks to a global pandemic. Fun times!<br />
<br />
When I've not been homeschooling the girls, hiking in the amazing countryside that is rather conveniently situated right at my doorstep, completing practical projects around the house, reading <i>all the things</i>, and vegetating in front of netflix, I have been pratting around with my fingers on a keyboard tinkering with various software projects.<br />
<br />
Absolute emphasis on <i><b>TINKERING</b></i>.<br />
<br />
There has been little in the way of reasoning behind what I've been messing with other than "I am currently the master of my own destiny, I have some technology on hand, a brain that needs exercise, and although the libraries are sadly shut we do have an amazing resource called t'interwebs on hand these days, so why not just have some fun". Sure, keeping my brain active and tinkering with Java/Go/JavaScript might have some practical benefits when it’s time to find a new job, but that's as far as it goes. My mindset is firmly back to that of my 10 year old self, hacking away on a ZX Spectrum programming Sinclair Basic just for fun :D<br />
<br />
So, what software projects have I been fiddling with, you might ask... Well, there are a great many, but here's the top ten (ok, ok, it’s less a top ten and more a list of things I've worked on most recently and/or not already forgotten about). In no particular order:<br />
<br />
1) I started (well, nearly finished) working on my very own retro style minimal Simple RPG. I don't really know why I've not finished it if I'm honest. Developers and their goldfish-like attention spans eh? I'll probably blog about this project separately and add a link (or maybe forget to add a link) here when I do.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-agg3ZyGMxYg/XtasUVpK0eI/AAAAAAAAiKk/Lttv8TIiMYUlxsZS28yfaZ7PM8DNR8rwwCLcBGAsYHQ/s1600/01-SimpleRpg240.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="180" data-original-width="240" src="https://1.bp.blogspot.com/-agg3ZyGMxYg/XtasUVpK0eI/AAAAAAAAiKk/Lttv8TIiMYUlxsZS28yfaZ7PM8DNR8rwwCLcBGAsYHQ/s1600/01-SimpleRpg240.gif" /></a></div>
<br />
2) I rewrote <a href="http://www.theinvader360.com/">theinvader360.com</a> in Go. Almost entirely pointless, it could quite happily be a static site, but I wanted to so I did :) Yes, you *will* see a pattern emerge in my justification of how I choose to spend my limited time on this planet...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.theinvader360.com/"><img alt="http://www.theinvader360.com" border="0" data-original-height="181" data-original-width="240" src="https://1.bp.blogspot.com/-8HT_TLvOmnA/XtasgQ06n6I/AAAAAAAAiKo/tROOi1mXx-wVT9DvUiuOlqbHfOYiJFZuACEwYBhgLKs0DAL1Ocqy0Lq1MzM1F-6ZnKdnMzHyJw4LjrFdIrjzSE3VQ5opRmRucQa3LRKIYlQKUzSNYm1hEt5vGsXSFkqYi2eG_hBONewksgCId1CMYzc39xUs14BzMXHR9ta6lQFi1xGErwqML7IXyQDNrutIuIc5_MZvU9Qb9Q0Ctfd16tAFE5afPb_ao6S_THNVg2vRQbs0UdKnrn0oy21iJgZ3--FqwZIi7vu4Ih4cKPUp9YecW2HZNohKfX4b9C1NE0oM0BU3qeGSimDbA-MynTbXsC222S0Q9MfkDonRMIF6ka21xhYQmPPtRS50eIOf-jlhq9gXgeg7PGs2-mQjnfWJxcwJ9CbBY7gdiA-nuVmnAC-by3-0YsD3zNjncRoClamxqNF7CJQsr95OE01ux70X2H7CHubfscLQfq_qYlglmGG5oaEvQyify8jMK17ZykcNvsLdo2rGmIQCtyeeZDZaCoLqPR--bcbvXHPClBwg5xAbcoOCLvRX9EG_ELIDyViGwmGAUtHNwgNnx05A-ffiDp0IyZ3ygfb4rfORr-z-KOOvHj0Aft6Jt7pwtl3wMLaGN-tSe3w6VrgQnRFdLFat2BVJi66u-lQyapqWR6GQw_93a9gU/s1600/02-Website240.gif" /></a></div>
<br />
3) I actually released something on <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">Google Play</a>! Don't get too excited, it's just a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.quiz.maths" target="_blank">Maths Quiz</a> ;) Our eldest loves a maths challenge, and she responds massively well to gamification - anything where she can score 10 out of 10 is a winner. This app was built with her firmly in mind, no countdown clocks or pressure to "guess" the answer, just a simple ten randomly generated questions and taking your sweet time to answer correctly kind of deal. She's consistently scoring 10/10 on each challenge type now, so maybe something with a bit of hazard/risk is called for next... Although it’s a fairly boring "game" to look at, it was actually quite good fun to write. I might write more about it sometime, and maybe try to remember to link to it here...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.quiz.maths" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.quiz.maths" border="0" data-original-height="300" data-original-width="210" height="200" src="https://1.bp.blogspot.com/-kXc3szvAJbs/XtaszgCqnfI/AAAAAAAAiKw/Sb0QWMvnincYMfSSEYKCx5xsZtGT7vTUgCLcBGAsYHQ/s200/03-MathsQuiz210.gif" width="140" /></a></div>
<br />
4) I wrote a procedural maze generator and cobbled together a basic maze game. I never got round to polishing and releasing the app, but it’s installed on the living room fire stick and the girls like playing it every now and then :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-bXloV4YTXW8/Xtas-dBxGWI/AAAAAAAAiK0/D4GGC8EQcIYUsnrJXrfvjc7uJKrTrQvzACLcBGAsYHQ/s1600/04-MazeGame240.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="135" data-original-width="240" src="https://1.bp.blogspot.com/-bXloV4YTXW8/Xtas-dBxGWI/AAAAAAAAiK0/D4GGC8EQcIYUsnrJXrfvjc7uJKrTrQvzACLcBGAsYHQ/s1600/04-MazeGame240.gif" /></a></div>
<br />
5) I fiddled about with PyGame and built a Lunar Lander game. This project was kicked off at a local nerd club gathering back when such things were possible, great fun! Oh how I miss being quiet and antisocial in a room full of grown adults, it’s just not the same being quiet and antisocial in the comfort of your own home.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-_ZIlmEH5ymE/XtatS46Ag1I/AAAAAAAAiLE/qolA99yOFIYM0ILq7bVxHfBE_NYk3c-DwCEwYBhgLKs0DAL1OcqwndJxrWDfWSyZkYPAmBJx7oFhKavOiUj9bUFOOuFF3jM_w_KgDW-Fs_0TP9ZtQwRCYbNFFOOBTbMn-zLsECW4GBUYERENajdpDscD892QADrejqTD8xgPeHx-YysVD5779Q8hnCORBoMawoWJeA6uLG7tFcznmaZ4ZvTzDJyJvLyvWKFQQ0uiAwrG1lcrbBA9Jl55LBkAIQijO9_hRmDmNkQ8j47RYUkIDaswp7txEIhdeWSLh8Cym5sKe13RsVxwpB3Odx6ZEp0evvtuEB61sXrAy8aGZ4VjvbySoqWdgCNvxwuBMrH7HRR-HBQuPBezCT0EBMbOJEZWyha8HKMKxL_U_bEmJe3g3un6wy-sssBYGJG1sQK0dHPRhpiynmi4tAyY1yP4nkO4U9MEe-939JA1grwArHYpdrQWecx4vslXBWMyI7nqNZ3RIasBczhkdtbECNmPFa79ijorbbC90EqxKsMsK5NMbL3os182fOLhJzqiGucO8g-vjRpXYCui6vQzu21YWNMCUwkNwGjDeI5_eajeO-kvv6fpSQ8JGrMrTZoqLANPuey_5xRKzNAKgh6HKOdFytkrJmtHA-JNiXoieZkSFyfYwwd_a9gU/s1600/05-PyLander240.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="160" data-original-width="240" src="https://1.bp.blogspot.com/-_ZIlmEH5ymE/XtatS46Ag1I/AAAAAAAAiLE/qolA99yOFIYM0ILq7bVxHfBE_NYk3c-DwCEwYBhgLKs0DAL1OcqwndJxrWDfWSyZkYPAmBJx7oFhKavOiUj9bUFOOuFF3jM_w_KgDW-Fs_0TP9ZtQwRCYbNFFOOBTbMn-zLsECW4GBUYERENajdpDscD892QADrejqTD8xgPeHx-YysVD5779Q8hnCORBoMawoWJeA6uLG7tFcznmaZ4ZvTzDJyJvLyvWKFQQ0uiAwrG1lcrbBA9Jl55LBkAIQijO9_hRmDmNkQ8j47RYUkIDaswp7txEIhdeWSLh8Cym5sKe13RsVxwpB3Odx6ZEp0evvtuEB61sXrAy8aGZ4VjvbySoqWdgCNvxwuBMrH7HRR-HBQuPBezCT0EBMbOJEZWyha8HKMKxL_U_bEmJe3g3un6wy-sssBYGJG1sQK0dHPRhpiynmi4tAyY1yP4nkO4U9MEe-939JA1grwArHYpdrQWecx4vslXBWMyI7nqNZ3RIasBczhkdtbECNmPFa79ijorbbC90EqxKsMsK5NMbL3os182fOLhJzqiGucO8g-vjRpXYCui6vQzu21YWNMCUwkNwGjDeI5_eajeO-kvv6fpSQ8JGrMrTZoqLANPuey_5xRKzNAKgh6HKOdFytkrJmtHA-JNiXoieZkSFyfYwwd_a9gU/s1600/05-PyLander240.gif" /></a></div>
<br />
6) My six year old and I collaborated on designing a rule set for a pen and paper tabletop game (<a href="https://github.com/TheInvader360/SiTTeRS" target="_blank">SiTTeRS</a>). I had originally planned to turn this into an app, but figured we liked it as it was - a low tech, two players in the same room, real time, physical pen and paper and a dice kinda deal, so I dropped the computer simulation aspect and kept it strictly low tech.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/TheInvader360/SiTTeRS" target="_blank"><img alt="https://github.com/TheInvader360/SiTTeRS" border="0" data-original-height="180" data-original-width="240" src="https://1.bp.blogspot.com/-3ywAup1cGTc/XtatgsGR4LI/AAAAAAAAiLI/kk-SfpUb9xYM7I1s4PHxHeTDGV_qB4X0gCLcBGAsYHQ/s1600/06-Sitters240.png" /></a></div>
<br />
7) Nothing at all to do with games, but I wrote an extremely <a href="https://github.com/TheInvader360/checklist-backend-golang" target="_blank">minimal headless Go application</a> fronted by an equally <a href="https://github.com/TheInvader360/checklist-frontend-vuejs" target="_blank">minimal Vue.js frontend</a>. Not particularly useful - you can achieve the end result as it stands in vue alone, but I liked getting the two parts to work together.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/TheInvader360/checklist-frontend-vuejs" target="_blank"><img alt="https://github.com/TheInvader360/checklist-frontend-vuejs" border="0" data-original-height="176" data-original-width="240" src="https://1.bp.blogspot.com/-pfK4ocdfBg8/Xtatm0oQ4_I/AAAAAAAAiLQ/QoaGGrKsQ7EQnoGER8HWHXA2NW9hVMtrACLcBGAsYHQ/s1600/07-GoBackVueFront240.gif" /></a></div>
<br />
8) I built a very simple <a href="https://github.com/TheInvader360/simple-memory-game" target="_blank">Memory game</a> using Go and the <a href="https://ebiten.org/" target="_blank">Ebiten</a> library. I’ve built an executable to run on my laptop, and an apk to install on our various android touch screen devices. This isn’t destined for proper app store release, but feel free to grab it from <a href="https://github.com/TheInvader360/simple-memory-game" target="_blank">GitHub</a>!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/TheInvader360/simple-memory-game" target="_blank"><img alt="https://github.com/TheInvader360/simple-memory-game" border="0" data-original-height="240" data-original-width="240" height="200" src="https://1.bp.blogspot.com/-j9i6icRTGqw/Xtat4_7VGGI/AAAAAAAAiLc/R-QuQRa8ueIDrVpeuc-sxUJp5x24AWW2gCLcBGAsYHQ/s200/08-MemoryGame240.gif" width="200" /></a></div>
<br />
9) I started building a small Dungeon Sweeper game. No idea why I didn’t finish this, I probably should at some point, the scope is super tiny compared to the Simple RPG mentioned up top. It would also make a nice little fantasy console game. I might come back to this at some point...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-y1BRtDzyu1Y/XtauAV6xDsI/AAAAAAAAiLg/ALElnoGtFpApxgNBA1rIiEZx55jBQUB9QCLcBGAsYHQ/s1600/09-DungeonSweep210.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="268" data-original-width="210" height="200" src="https://1.bp.blogspot.com/-y1BRtDzyu1Y/XtauAV6xDsI/AAAAAAAAiLg/ALElnoGtFpApxgNBA1rIiEZx55jBQUB9QCLcBGAsYHQ/s200/09-DungeonSweep210.gif" width="156" /></a></div>
<br />
10) I read about the <a href="https://www.lexaloffle.com/pico-8.php" target="_blank">Pico-8</a> a while ago and found the whole subject of fantasy consoles to be quite fascinating. I’d have killed for that kind of dev environment back in my Spectrum days! Then a couple of days ago I discovered the <a href="https://tic.computer/" target="_blank">TIC-80</a>... It’s free as in beer, free as in speech, and it supports JavaScript... Sold! I ported a <a href="https://www.youtube.com/watch?v=J1wvvbVQ5zo&list=PLdLmU93eWisKpyk1WZywUSYAq5dkCPFIv" target="_blank">nice Pico-8 tutorial</a> to the TIC-80, and in a single day I had a crappy “game” that could be played on the living room TV using an Xbox One controller, and <a href="https://theinvader360.github.io/explore-tic80-js/" target="_blank">via the web</a> using keyboard controls (cursor and “z” keys replacing the d-pad and “a” button). I can see myself spending a lot more time tinkering with these fantasy consoles :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/TheInvader360/explore-tic80-js" target="_blank"><img alt="https://github.com/TheInvader360/explore-tic80-js" border="0" data-original-height="136" data-original-width="240" src="https://1.bp.blogspot.com/-Hnu9xI1Tq5A/XtauHUQfX-I/AAAAAAAAiLk/Wkv8xbt9WnYiTKMeI8JXIsZc71Wbs6jRACLcBGAsYHQ/s1600/10-TicExplore240.gif" /></a></div>
<br />
It strikes me that most of the projects I've enjoyed playing with recently have been quite small and short lived. I've aimed to spend only a day or two's worth of spare time on each, with the aim of getting something minimal and functional finished in that time. Pretty much the <a href="https://ldjam.com/events/ludum-dare/rules" target="_blank">Ludum Dare</a> rules really. This has been the case with pretty much everything other than the unfinished simple RPG game (no matter how “simple”, it’s still nowhere near a weekend project!).<br />
<br />
I have lots of ideas for future projects. I’d like to finish the Simple RPG and Dungeon Sweep games at some point. I might write a completely pointless static blog/CMS engine, just because (add it to the heap of others out there that nobody wants or needs) :D I’d like to write some Spectrum / NES / Game Boy ROMs (maybe some remakes or demakes). I’d also like to see if there’s anything fun I can do with some of the old hardware we have lying around (Spectrum, Game Boy, DS, PS2, PSP, Wii, etc). I have a Raspberry Pi 3 that is pretty much a dedicated <a href="https://retropie.org.uk/" target="_blank">RetroPie</a> machine - it gets played with more than the Xbox One, but maybe I should do more with it. If I’m feeling particularly masochistic I might spend some time on lower level stuff than I’m used to, maybe some assembly is in order :) I’d also like to spend some more time playing with fantasy consoles like the TIC-80, just because it’s fun...<br />
<br />
Then there’s the huge subject of moving on from teaching our children traditional languages, science, and maths, and sprinkling in a little bit of computer science. There will be some <a href="https://scratch.mit.edu/" target="_blank">Scratch</a> and Python in my future for sure, and I can’t imagine any better teaching method than making games. It’s gonna be fun! :D<br />
<br />
So yeah, I’m still alive, I’m not really focused on publishing new games to <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">Google Play</a> any more, but I do still love making and playing games and little educational doodads and thingermawotzits.<br />
<br />
Until next time, au revoir!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-53964890855572260792017-10-26T10:30:00.000-07:002020-05-18T08:38:40.513-07:00Greedy Caterpillar - a snake game for touchscreen and TV<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank"><img alt="Snake" border="0" data-original-height="120" data-original-width="180" height="132" src="https://4.bp.blogspot.com/-29jbu8jkCr4/WfIV2PYHdSI/AAAAAAAAX0Q/VG0Deai1NuUbLt7aWaC39nvzr4R-rPf6QCLcBGAs/s200/180x120.png" width="200" /></a></div>
<br />
Little by little, TheInvaderOne is growing up. She is now three and a half years old 😮<br />
<br />
Her little sister, TheInvaderOneX 👶, is eight months old, and is now very interested in the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android" target="_blank">Sensory</a> app. She's also interested in whatever her sister happens to be up to at the time, crawling at light speed, making valiant attempts at walking, and trying her damnedest to "eat all the things".<br />
<br />
Big sister has smashed it on the numeracy front, and has left the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">Count 1 to 10</a> app for dust. We're in the big leagues now - she has 1 to 100 cracked, addition and subtraction of small numbers sorted, and is starting to get to grips with simple multiplication and division. Of course, we're not drilling numbers, letters, languages, etc 24/7. She loves absorbing knowledge - she's like a sponge, but we don't want her to burn out before she even hits school - being bored at school from day one due to them not teaching her anything new would likely be a disaster! No, there needs to be plenty of downtime... Sure there's loads of toys to play with, and imaginative play, and creative crafts, and baking, and stories, and a bit of tv (if you have kids around this age and want to combine cartoon time with learning, check out <a href="http://amzn.to/2xoiujd" rel="nofollow" target="_blank">Go Jetters</a> and <a href="http://amzn.to/2zPA950" rel="nofollow" target="_blank">Numberblocks</a>, both big hits in our home at the moment), and seemingly endless unrelenting viewings of <a href="http://amzn.to/2haLwwN" rel="nofollow" target="_blank">Frozen</a>, but she's also seen what Daddy does to unwind - play and make games, and she wants in!<br />
<br />
Ok, so making games may be a way off yet, but playing them was definitely on the cards. My other half bought me a <a href="http://amzn.to/2hawirn" rel="nofollow" target="_blank">Raspberry Pi 3</a> starter kit as a birthday surprise, it's now a dedicated emulation machine, with a lovingly curated list of games on there. It's pretty much a <a href="http://amzn.to/2z9UTYd" rel="nofollow" target="_blank">NES Mini</a>, and a <a href="http://amzn.to/2xpqEI3" rel="nofollow" target="_blank">SNES Mini</a> and a "Many Other Platforms Mini", all rolled into one. My eldest has particularly enjoyed playing <a href="https://en.wikipedia.org/wiki/Centipede_(video_game)" rel="nofollow" target="_blank">Centipede</a> and <a href="https://en.wikipedia.org/wiki/Barney%27s_Hide_%26_Seek_Game" rel="nofollow" target="_blank">Barney's Hide & Seek</a>. She loves the arcade action aspect of Centipede, but the move from touchscreen puzzle games to a joypad controlled action game was a pretty big step, and before she truly "got it", it was game over. Over and over again. The Barney game is actually a fantastic game for first getting to grips with the concept of pressing buttons or moving a joystick to control an onscreen character (since you can't really lose), but it seems the controller we were using (a truly excellent bluetooth one by <a href="http://amzn.to/2yP0U9O" rel="nofollow" target="_blank">Moga</a>) was a bit overwhelming, and the game itself requires no real skill or engagement (drop the controller and it will complete itself on autoplay - once you realise that, what's the point in playing anymore?).<br />
<br />
I got to thinking about what would make a good game for three year old, one who so far has only been exposed to touchscreen "jigsaw puzzles" and "smash bugs at a picnic" type games.<br />
<br />
Here's what I came up with:<br />
<ul style="text-align: left;">
<li>The control scheme should be simple and intuitive</li>
<li>Rules governing gameplay should be fairly straightforward and logical</li>
<li>Threat should be absent, or extremely mild</li>
<li>It should look and sound reasonably appealing</li>
<li>You shouldn't be able to lose too quickly i.e. before you get a handle on what you're actually meant to do</li>
</ul>
I realised that we already owned the perfect game controller for a small child. It's not really a game controller at all. It's an <a href="http://amzn.to/2hadbxK" rel="nofollow" target="_blank">Amazon Fire TV Remote</a>. I mean, just look at this thing: <br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-TpEKKNGheoI/WfIQatOCTzI/AAAAAAAAXzY/qaGRJ3Yqz3ootCy7ZA2NQpXM0SPMWaOSACLcBGAs/s1600/remote.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="416" data-original-width="740" height="110" src="https://1.bp.blogspot.com/-TpEKKNGheoI/WfIQatOCTzI/AAAAAAAAXzY/qaGRJ3Yqz3ootCy7ZA2NQpXM0SPMWaOSACLcBGAs/s200/remote.jpg" width="200" /></a></div>
It's a wonderfully simple controller, and that circle up top covers all the basic actions that should be required in a simple child friendly game: up, down, left, right, and a single fire/action/select button.<br />
<br />
I started out with an Atari 2600 myself, nearly 30 years ago. All the games I had were controlled by one of these bad boys:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-u4yDdajsL9Q/WfIQqSw8REI/AAAAAAAAXzc/JUqsgApA06wwHBnYQAvIfhSTVcigOwhwQCEwYBhgL/s1600/joystick.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="600" height="200" src="https://1.bp.blogspot.com/-u4yDdajsL9Q/WfIQqSw8REI/AAAAAAAAXzc/JUqsgApA06wwHBnYQAvIfhSTVcigOwhwQCEwYBhgL/s200/joystick.jpg" width="200" /></a></div>
Let's all take a moment to bask in the glory of its simplicity... Up, down, left, right, and a fire/action/select button. Yes, using the <a href="http://amzn.to/2hadbxK" rel="nofollow" target="_blank">Fire TV Remote</a> looked like a winner. If it was good enough for Atari in the 80's, it's good enough for me today.<br />
<br />
Ok, control scheme and physical controller sorted, on to the next item, a relatively simple game idea. A lot of the best simple game ideas have already been done, but I'm cool with rehashing a tried and tested mechanic, not everything has to be innovative or ground breaking ☺ Thinking about simple games, I realised very few are actually forgiving enough to meet my requirements. Pong and breakout are actually quite tough games, especially if you've never played them or handled a game controller before. Miss the ball a few times and it's game over. A game of breakout could easily be over within seconds, and before any blocks were broken. No good, frustration is not fun. What about Pac Man? Space Invaders? Centipede? Same deal. Those old simple games were actually quite challenging, I guess that's what made them so addictive, and why world records exist for acing them! Then it struck me: <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">Snake</a>!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-8RIempt09tE/WfIRTVzOapI/AAAAAAAAXzk/ASNoBe2YEKE4MOnV_VAzFFAgdwDPOlRsQCLcBGAs/s1600/nokia.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="345" data-original-width="377" height="182" src="https://3.bp.blogspot.com/-8RIempt09tE/WfIRTVzOapI/AAAAAAAAXzk/ASNoBe2YEKE4MOnV_VAzFFAgdwDPOlRsQCLcBGAs/s200/nokia.jpg" width="200" /></a></div>
<ul style="text-align: left;">
<li><b>Simple control scheme:</b> up/down/left/right, press the relevant button to move in that direction</li>
<li><b>Simple rules:</b> eat as many apples as possible and don't bite yourself - seems like reasonable advice for anyone to lead their life by</li>
<li><b>Minimal threat:</b> bite yourself and you have to start again (no big deal, right?)</li>
<li><b>Aesthetically appealing:</b> Ok, nokia snake wasn't the nicest looking or sounding game, back in those days we didn't have much to work with, the 3310 had a 84x48 monochrome 1.5 inch screen, midi sounds, and a processor and memory to match. Luckily we have HDTVs and even HD mobile devices these days, so we can do something about that... And thanks to awesome people like <a href="https://kenney.nl/" target="_blank">Kenney</a> and <a href="https://incompetech.com/" target="_blank">Kevin MacLeod</a> you don't have to be an accomplished artist or composer to pull it off!</li>
<li><b>Impossible to lose too quickly:</b> This is where snake comes into it's own - all the other simple old games I considered were challenging, and you could lose them all immediately. The <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">snake game</a> is challenging, but with certain rules in place (no static obstacles, wrap around scenes, starting length of 4 segments or less) it is actually impossible to lose until you have at least managed a score of 1, and in most cases you're unlikely to lose before the "snake" reaches a length greater than the world height.</li>
</ul>
I put together a small prototype, and soon had a very simple <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">snake game</a> up and running on our living room TV via the <a href="http://amzn.to/2zGrp03" rel="nofollow" target="_blank">Fire TV Stick</a>. A "snake" comprised of green squares on a black background, a single red square representing the "mouse" or "apple", no score, no sound, nothing other than a very rudimentary snake that could be controlled via the <a href="http://amzn.to/2hadbxK" rel="nofollow" target="_blank">Fire TV Remote</a> that grew each time it "ate" a red square. My daughter loved it. I think she was excited to see that what I had been working on on my laptop had somehow appeared on the TV, and that she could press buttons to make it do stuff ☺<br />
<br />
She referred to the snake as a caterpillar, probably due to us having played Atari's centipede on the <a href="http://amzn.to/2hawirn" rel="nofollow" target="_blank">RPi</a> earlier in the day, and she called that a caterpillar too (I guess she has never actually seen a centipede, but has seen plenty of caterpillars). Maybe the fact we had recently borrowed <a href="http://amzn.to/2zRmhag" rel="nofollow" target="_blank">The Very Hungry Caterpillar</a> from the library had something to do with it too. Anyway, the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">Hungry Caterpillar</a> name stuck, and that in turn helped me come up with a nice, bold, simple, child friendly, cartoonish skin:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank"><img alt="Hungry Caterpillar" border="0" data-original-height="900" data-original-width="1600" height="225" src="https://3.bp.blogspot.com/-EXOo3xwlZiY/WfISiBrZj-I/AAAAAAAAXzw/MxWEk5wF7LkeGTK_Q-i3ZEGbjOLLPjOBACEwYBhgL/s400/screenshot.png" width="400" /></a></div>
I could have stopped right there, as at that point I had achieved what I set out to do - I had made a little game for my three year old to play on the TV using a simple controller. However, I found the whole process of developing for a TV and remote controller quite interesting. If the game had more than a single screen, maybe a game over screen announcing when a high score had been achieved, a menu screen, a help screen, an options screen, how would all that work using the remote as a controller? More interestingly, could I get the app to work well not only on TV's using a remote/game controller, but also on the more traditional touchscreen phones and tablets? If yes, why not release it on <a href="https://www.amazon.co.uk/dp/B076NWQ77S" target="_blank">Amazon</a> for both <a href="http://amzn.to/2zGrp03" rel="nofollow" target="_blank">Fire TV</a> and <a href="http://amzn.to/2yNKn5X" rel="nofollow" target="_blank">Fire Tablet</a> devices? Could I go one step further and release it on <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">Google Play</a> too? I found the answer to all that stuff and managed to build a single apk that works equally well on TV and touchscreen, and that can be uploaded to both the <a href="https://www.amazon.co.uk/dp/B076NWQ77S" target="_blank">Amazon</a> and <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">Google</a> marketplaces.<br />
<br />
I learned a few nifty tricks that I plan to write about in future (this post is already way too long...):<br />
<ul style="text-align: left;">
<li>How to suppress ads when running on an unsuitable platform (it infuriates me when ads appear in a Fire TV app with no way to avoid them or click through)</li>
<li>How to link to the appropriate app store depending on what platform you are running on without resorting to separate builds for each marketplace</li>
<li>How to handle a simple menu in LibGdx using either touchscreen or remote/game controllers</li>
<li>How to make a game/app that works well and looks good in terms of the <a href="https://en.wikipedia.org/wiki/10-foot_user_interface" rel="nofollow" target="_blank">10-foot user interface</a>, and that works equally well and looks equally nice on hand held devices</li>
</ul>
<br />
I also ended up with a game to play with my daughter, something to publish on the <a href="https://www.amazon.co.uk/dp/B076NWQ77S" target="_blank">Amazon</a> and <a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank">Google</a> marketplaces (yeah, I've been slacking again), and a reason to post on my blog again :)<br />
<br />
Oh, and the game is totally helping TheInvaderOne get to grips with controlling an onscreen character by pressing buttons on a remote controller. She is already hitting double digit scores, which is a huge improvement over what she could manage when she first tried a couple of weeks ago. I expect she will be destroying my own high scores very soon! And if her interest in the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android" target="_blank">Sensory</a> app is anything to go by, TheInvaderOneX will be bringing more competition to the table in two or three years time! ☺<br />
<br />
Anyway, the game is free, as always. There are some ads when you play on a mobile device (a small unobtrusive banner, and a single short interstitial plays on game over). There are no ads on Fire TV. No in app purchases or subscriptions or any kind of hidden nasties on any platforms. Just a simple fun game for you to play for free ☺<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank"><img alt="Hungry Caterpillar" border="0" data-original-height="512" data-original-width="512" height="200" src="https://1.bp.blogspot.com/-7sN6IoSWySI/WfIT6V20a9I/AAAAAAAAXz8/UvT98mnRa8wxutFQuveuJL1RXYM1KYeJgCEwYBhgL/s200/logo.png" width="200" /></a></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;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.greedy.caterpillar.snake.game" target="_blank"><img alt="Hungry Caterpillar" border="0" data-original-height="150" data-original-width="504" height="59" src="https://1.bp.blogspot.com/-mA4a60W3LuY/WfIUN4OQPFI/AAAAAAAAX0I/P-uPut0ev8EK1Xe0O1MuoduJrCNjRqIdgCEwYBhgL/s200/googleplay.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.amazon.co.uk/dp/B076NWQ77S" target="_blank"><img alt="Hungry Caterpillar" border="0" data-original-height="150" data-original-width="440" height="68" src="https://3.bp.blogspot.com/-MfQn1MlCHW0/WfIUVEWklSI/AAAAAAAAX0I/VON_zJGb6CM4FmEbaN7KVT60zSjU3NvXgCEwYBhgL/s200/amazon.png" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Don't be afraid to be overly generous with your ratings and reviews, I'm cool with praise, don't worry, you won't make me blush 😙<br />
<br />
Until next time, I hope you have fun 😀</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-33791477885984905782016-12-12T13:11:00.001-08:002016-12-12T13:17:22.624-08:00TappyRun - infinite runner with cute voxel graphics!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" border="0" height="192" src="https://3.bp.blogspot.com/-mAb4qKaWfLQ/WE8KODCjDCI/AAAAAAAAAZs/oZ8yJLLHFW0AhLOOZ0aGnMNnvrIVT_J1wCLcB/s320/unlockables.png" width="320" /></a></div>
<br />
I
decided to spend November revisiting Unity3D, and this time I wanted to
give it a proper shot. The aim was to publish a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">game</a> in the first
week of December... and I made it! <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">TappyRun</a> was released on the 4th
December :)<br />
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">TappyRun</a> is a simple but fun infinite scrolling
endless runner. Super simple gameplay with one tap controls, tap the
left side of the screen to move left, tap the right side of the screen
to move right. Avoid crashing head on into stuff or you land in the
drink, at which point it's game over man, game over! It's fun to play,
infuriating when you make a mistake and splash into the river, and
awesome when you beat your friends highscores and share the screenshot
on social media to rub their noses in it :) The closest comparisons that
come to mind are subway surfers style gameplay - running in lanes
collecting coins and avoiding obstacles, with a minecraft or crossy road
graphical style - blocky voxel graphics, and flappy bird esque
replayability and social friend baiting - quite short game sessions with
the constant temptation to have "one more game" to try beating a
highscore.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" height="156" src="https://2.bp.blogspot.com/-UYUJborlHTg/WE8KN0Jh4vI/AAAAAAAAAZk/JufEx5YvNi0QWYoHtb4eT5sJhwj7YgK1wCEw/s320/feature.png" width="320" /></a></div>
<br />
I
intend to keep coming back to this game for the purposes of mini
tutorials in the future. One month was barely enough time to scratch the
surface of what Unity3D has to offer, but on the other hand it was
enough to get a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">complete game published</a>, so there's bound to be a
handy tip or trick or two lodged in my brain worth sharing with the
wider world. Interesting tutorial worthy features of this game include
unlockable characters, in game currency (not purchased using real money,
totally free to play), rewarded video ads, achievements, global social
leaderboards, cloud saving and loading, tiles that link to my other apps
formed from json retrieved from the internet, social screenshot
sharing, level styling seasonal cycles, and so on. Plenty to talk about.
I reckon a <a href="https://www.youtube.com/user/TheInvader360" target="_blank">youtube</a> video or two on creating cute voxel characters
could be fun too! If you install <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">TappyRun</a> and find there's a
particular feature you'd like to learn about, give me a shout in the
comments and I'll see what I can do :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" border="0" height="180" src="https://4.bp.blogspot.com/-RiveZjG_-FM/WE8KVjx4tZI/AAAAAAAAAZw/hQ7uOEKtzWkPq0Lnp45lMDTqTSjfLvvBACEw/s320/screenshot.png" width="320" /></a></div>
<br />
Alongside
creating this game I spent some time in November making a small <a href="http://www.theinvader360.com/" target="_blank">web app</a> with a public API that serves up useful information relating to my
games and apps. Currently it just offers up information on my apps (<a data-saferedirecturl="https://www.google.com/url?hl=en-GB&q=http://www.theinvader360.com/api/v1/apps&source=gmail&ust=1481661137198000&usg=AFQjCNFSnaCnb92T4_Kg_EHcvKYHKCl4-A" href="http://www.theinvader360.com/api/v1/apps" target="_blank">http://www.theinvader360.<wbr></wbr>com/api/v1/apps</a>) and web presences (<a data-saferedirecturl="https://www.google.com/url?hl=en-GB&q=http://www.theinvader360.com/api/v1/presences%255D&source=gmail&ust=1481661137198000&usg=AFQjCNHv6JgibfPI7MxpxYbUqjIueOI7aw" href="http://www.theinvader360.com/api/v1/presences" target="_blank">http://www.theinvader360.<wbr></wbr>com/api/v1/presences</a>).
The plan is for all my games and applications to retrieve this
information over the intertubes rather than have it hardcoded in each
app, meaning all my apps should always be up to date. I like the idea of
extending this further to help cross promote new apps to existing
players, but am taking care not to rush this as it must not be annoying.
I guess this isn't particularly exciting if you're just interested in
playing games, but quite interesting if you're into making your own!
Also, while I was at it, I couldn't resist giving the webapp a slightly
prettier face than application/json text, so if you visit <a data-saferedirecturl="https://www.google.com/url?hl=en-GB&q=http://www.theinvader360.com&source=gmail&ust=1481661137198000&usg=AFQjCNFXx8OEzH_edK1qQ2Wen3vFs10dbA" href="http://www.theinvader360.com/" target="_blank">http://www.theinvader360.com</a> you should now see my fully responsive self promotional website :)<a href="http://www.theinvader360.com/" target="_blank"><br /></a>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.theinvader360.com/" target="_blank"><img alt="http://www.theinvader360.com" border="0" height="186" src="https://4.bp.blogspot.com/-WVPQv-bTEyY/WE8KN7RBDqI/AAAAAAAAAZo/c4MruPM354goGe6yQm04RYt42OrQ3LbmgCEw/s320/site.png" width="320" /></a></div>
<a href="http://www.theinvader360.com/" target="_blank"><br /></a>As
for <a href="https://unity3d.com/" target="_blank">Unity3D</a> vs <a href="https://libgdx.badlogicgames.com/" target="_blank">LibGDX</a>, well, that's a whole blog post of it's own
just waiting to happen... Suffice to say they both have their pros and
cons, and I will most likely be using both in future, it seems it's all
about using the right tool for the job at hand.<br />
<br />
In the meantime,
what are you waiting for? Go and grab <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tap.run" target="_blank">TappyRun</a> for free from <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">Google Play</a>, and let me know what you think in the comments (or on <a href="https://www.facebook.com/TheInvader360" target="_blank">facebook</a>
or <a href="https://twitter.com/theinvader360" target="_blank">twitter</a>)!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-24239231440652089522016-10-18T11:51:00.001-07:002016-10-18T11:51:38.565-07:00Count 1 to 10<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" border="0" height="156" src="https://4.bp.blogspot.com/-Ep3p6a1Hj8A/WAZq4Jaj_II/AAAAAAAAAYQ/LauxDXAvKdoHTT7lwWZ9SEGlQWwP1WQTgCEw/s320/feature.png" width="320" /></a></div>
<br />
Wow... Nearly two years have passed since my last blog post! I've been busy in that time, just not publishing. Time to fix that!<br />
<br />
My <a href="http://theinvader360.blogspot.co.uk/2014/12/sensory-cause-and-effect-light-show-app.html" target="_blank">last blog post</a> introduced <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android" target="_blank">sensory</a>, a very simple cause and effect
light show app. I created it for TheInvaderOne (my now two and a half
year old daughter), and decided to share it with the world. It's not
some groundbreaking app, it's a simple "fireworks display" that reacts
to touch input - something to entertain young children and those with
certain special needs (particularly children with autism). I expected
maybe a couple of hundred installs and a low star rating, it was a
pleasant surprise to see it at 37,000+ installs and an average rating of
4.1 out of 5!<br />
<br />
As TheInvaderOne grows, her taste in apps becomes a
little more demanding. A couple of months ago I created a simple "<a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">Count 1 to 10</a>" app for us to play together. Last weekend I cleaned it
up a little, added a few extra languages (we concentrate on English and
Welsh, but I figured a few other languages like French, German,
Spanish, Italian, Chinese and Japanese could be of interest to other
users, and to us a little later on) and finally got round to <a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">publishing</a>
it!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/SU6g7gF5I0U/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/SU6g7gF5I0U?feature=player_embedded" width="320"></iframe></div>
<br />
The app has been kept as simple as possible
so that a child can play without accidentally exiting too easily or
getting bogged down in menus. It is a simple app that uses android
immersive mode, and has no menu or options screens - just start the app
and you're straight in. Along the bottom of the screen you'll find the
number buttons <a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">1 to 10</a>, tap a number button to display that amount of
items in the middle of the screen, hear the number spoken aloud in the
chosen language, and see the number symbol overlay the item table in a
large clear font. Top left is the language select button, tap to cycle
through the available languages. Top centre is a volume control slider,
slide left to reduce/mute the sound, and right to increase volume (note
you need your device volume to be on too!). Top right is a small close
button, tap this to exit the app. All settings are saved, so the next
time you open the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">count from one to ten app</a> your preferred language
and volume settings will be set automatically.<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" border="0" height="200" src="https://1.bp.blogspot.com/-xp4teM4nOzE/WAZqw-9rKQI/AAAAAAAAAYM/l_VsGpznJWwhucmpWlTG_KHTvnMyhn2nQCEw/s320/screenshot_c.png" width="320" /></a></div>
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank">Count 1 to 10</a> is a very simple app designed for young children, the main aim
being to help teach early years numeracy - linking together numeric
symbols, the spoken word for that number in the chosen language, and the quantity of items represented by that number. The way we use it, it
also helps teach various first words relating to colours, animals,
fruits, and vegetables. I don't start the app and hand the device over
to TheInvaderOne to entertain herself, we sit together, tap a number
button, then when a randomly generated scene matching that number
appears we discuss what we see. So, say we tap "3", and as a result the
word "three" is spoken aloud by the app, and three red tomatoes are
displayed on screen, we'll both repeat the word "three" aloud, and she
might shout out "three tomatoes!", I'd then congratulate her on getting
the number and item correct, and ask for more information - what colour
are the tomatoes? Does she like tomatoes? In this case
the answer would be along the lines of "Mmmmmm! Three big red
tomatoes! I like tomatoes! Yummy!". At this point we might go off on a
tangent and talk about what we might eat with tomatoes, or maybe I'd
pose a simple math question along the lines of how many tomatoes would
there be if I took one away, or maybe we'd just hit another number
button and start discussing the two big brown horseys, or the four
little white ducks, or the eight orange carrots... This all boils down
to the app being better used as a jumping off point for collaborative
play/learning than a standalone toy for the child to play with on their
own, though that is another valid use case for it.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" target="_blank"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.counting.app.free" border="0" height="200" src="https://2.bp.blogspot.com/-NPBDUEyUzTI/WAZqw_Zvx6I/AAAAAAAAAYI/ncxHdm3F1MYmBBbnY3EfMboiIjsCSTOLQCEw/s320/screenshot_f.png" width="320" /></a></div>
<br />
I've
made this app available for <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">free on google play</a>. Hopefully some of
you out there will find it of value and leave a nice rating and review
:)<br />
<br />
I hope to be back soon with news of some more <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">games</a>!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-53525239900236042432014-12-27T03:28:00.000-08:002014-12-27T03:32:25.447-08:00Sensory - a cause and effect light show app<div dir="ltr" style="text-align: left;" trbidi="on">
While testing my latest game (<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a>) it became apparent that TheInvaderOne (my 9 month old daughter) was <b>very</b> interested in what was going on. She has always been interested in the laptop, but the phones and tablets with their sounds and bright coloured lights and tappable screens took it to another level! Testing <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> soon became quite a challenge! :) I'd hand her the device to play a little, and she had great fun until it was game over - at 9 months old she was never going to be particularly great at playing a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">strategic action puzzle game</a> so the game overs came thick and fast!<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android"><br /></a>
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android" style="margin-left: 1em; margin-right: 1em;"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android" border="0" src="http://1.bp.blogspot.com/-3kXXFDfGK3k/VJ6Tf70GlhI/AAAAAAAAAQw/ac06Mlrj-8s/s1600/2.png" height="320" width="190" /></a><br />
<br />
The experience got me thinking about what kind of app would be suitable for a baby. TheInvaderOne loves touching the screen and seeing something happen, and feedback in the form of sound effects and bright lights never fail to raise a smile. I created a very small <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android">demo app</a> for her using the particle effect already used in <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a>. When you touch the screen a particle effect is triggered at that position, keep touching and more particles are triggered. The app is multitouch enabled so up to 10 points can spawn particles in assorted colours simultaneously. She absolutely loves it!<br />
<span id="goog_1604676470"></span><br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android" border="0" src="http://1.bp.blogspot.com/-xbVP98uh25o/VJ6T_KKQlYI/AAAAAAAAAQ4/tIesrSsMXH4/s1600/unnamed2.png" height="200" width="320" /></a><br />
<span id="goog_1604676471"></span><br />
I soon realised that other babies, and potentially SEN children and adults with various learning difficulties, special education needs, and/or disabilities could also benefit from the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android">Sensory app</a>, so I decided to package it up and make available on the google play app store. It is 100% free and is not monetized in any way, ads in an app targeted at users with limited understanding where the aim is to randomly tap the screen would be extremely bad karma! You can find the app <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android">here</a> - <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android">https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android</a><br />
<br />
I also figured that there are a few interesting principles involved in this tiny app that might mean it's of interest to other developers, especially those getting started with LibGdx. The app touches on particle effects, object pooling, multitouch, screen transitions, scene 2d ui, the asset manager, etc. The excellent <a href="https://github.com/libgdx/libgdx/wiki/A-simple-game">Simple Game</a> example touches on most of the main areas involved when making a basic game (assets, game loop, input, draw, sound). I think the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.sensory.app.free.android">Sensory</a> app builds on that foundation to illustrate simply and clearly how to handle some of the more intermediate LibGdx features. You can find the open source project on <a href="https://github.com/TheInvader360/sensory">github</a>, hopefully it will be of interest to fellow developers interested in making games with LibGdx - <a href="https://github.com/TheInvader360/sensory">https://github.com/TheInvader360/sensory</a><br />
<br />
I'd be over the moon to hear that the little "side effect" offshoot of <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> ended up helping you in some way, so please leave a 5* review of the app if you can (and maybe leave something in the comments here too!)</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-54011288312030530532014-12-26T09:17:00.000-08:002014-12-26T09:27:49.813-08:00Jewel Match Blitz - Match 3 Remix!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android" border="0" src="http://3.bp.blogspot.com/-9wS_-jxW9TY/VJ2VgAugX2I/AAAAAAAAAQY/V2sG5yQfTws/s1600/feature.png" height="195" width="400" /></a></div>
Apologies for such a long absence, I've been neglecting <a href="https://play.google.com/store/apps/developer?id=TheInvader360">my indie Android games</a> recently. Time to put that right with a new release - <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> :)<br />
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> sees me dipping my toe in a new genre, the strategic action puzzler. From the screenshots you'd be forgiven for thinking it's yet another Bejeweled or Candy Crush Saga copycat game... But you would be wrong! :p<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android"><br /></a>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android" border="0" src="http://4.bp.blogspot.com/-AvoCPXWqUog/VJ2WU8nHmMI/AAAAAAAAAQg/AZe9vhU4nik/s1600/6.png" height="320" width="190" /></a></div>
<br />
I grew up in a time where action puzzlers like Tetris, Columns, and Dr Mario were all the rage. <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> plays more like one of those old classics than a "swap the jewel/candy/whatever positions to match 3 or more" that has seemingly been done to death in recent years. If I were to liken <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> to any existing game I think Columns would be the closest match, but it's still quite a different game mechanic. In Columns the jewels fall from the top of the screen (similar to both Dr Mario and Tetris), and it's up to you to arrange them such that groups of three or more are formed and then disappear. In <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">Jewel Match Blitz</a> the jewels push up from the bottom of the screen, and you need to identify and tap groups of three or more adjacent matching jewels to make them explode (Match 3). You can also tap the occasional flashing blitz jewels for a blitz bonus. Your aim is to stop the jewels from reaching the top of the screen, or it is game over.<br />
<br />
The <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">game</a> is available for free on the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jewel.match.blitz.game.free.android">google play android market</a> (as are all my <a href="https://play.google.com/store/apps/developer?id=TheInvader360">other games</a>) and has a global google play game services leaderboard. Download it now, sign in, get a highscore, then challenge your friends to try and beat you! It gets real addictive, real fast :D<br />
<br />
As always, I hope you have fun!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-16000514082469596432014-04-19T03:38:00.000-07:002014-04-19T03:38:17.386-07:00LibGdx Google Mobile Ads SDK Tutorial<div dir="ltr" style="text-align: left;" trbidi="on">
The number one ad service being used by Android and LibGdx developers at the moment is Google AdMob.<br />
<br />
If you've not updated your app recently you should consider doing so soon. Google says:<br />
<br />
<blockquote class="tr_bq">
Android (6.4.1 and earlier SDKs)<br />
Deprecated. On August 1, 2014, Google Play will stop accepting new or updated apps that use the old standalone Google Mobile Ads SDK v6.4.1 or lower. You must upgrade to the Google Play version of the Mobile Ads SDK by then.<br />
<div>
<br /></div>
</blockquote>
Ok, so we want to migrate to the new Google Play Services way of doing things - this blog post walks you through the process :)<br />
<br />
<a href="https://github.com/TheInvader360/tutorial-libgdx-google-ads/raw/master/tutorial-libgdx-ads.apk"><b>Install this apk to see what we'll be building!</b></a><br />
<br />
----------<br />
<br />
<b>Barebones Sample App</b><br />
<br />
First thing I did was grab an <a href="http://libgdx.badlogicgames.com/download.html">up to date version of libgdx</a>. They are now up to 0.9.9 stable, I'm sure there is a lot of awesome new stuff in there for me to investigate, but TheInvaderOne isn't really leaving me with a lot of time for Android these days so that'll have to wait!<br />
<br />
Next I created a new libgdx project using gdx-setup-ui.jar (<a href="http://theinvader360.blogspot.co.uk/2012/07/getting-started-with-libgdx.html">see this old post for a walkthrough</a>), added a .gitignore file, and made my initial commit.<br />
<br />
<br />
<b>Eclipse Setup</b><br />
<br />
In eclipse, import the barebones sample app (file > import > existing projects into workspace) - you should now have at least three projects in package explorer (core, android, and desktop).<br />
<br />
Open the Android SDK Manager, download the latest SDK Platform and Google APIs (at time of writing: 4.4.2/API19), the 2.3.1/API9 SDK Platform, and from Extras - Google Play Services.<br />
<br />
Locate the <android-sdk>/extras/google/google_play_services/libproject/google-play-services_lib/ directory on your machine (on my windows machine - C:\Program Files (x86)\Android\android-sdk\extras\google\google_play_services\libproject\google-play-services_lib) and copy into your working directory alongside the existing libgdx projects.<br />
<br />
File > Import > Android > Existing Android Code, Next, Browse, navigate to the local copy of google-play-services_lib in your working directory, Ok, Finish.<br />
<br />
Right-click your android project, select Properties, Android, scroll down and click Add, select the google-play-services_lib project, Ok.<br />
<br />
A refresh and clean in eclipse probably wouldn't hurt at this point, so go ahead and do that.<br />
<br />
<br />
<b>AndroidManifest.xml</b><br />
<br />
Ensure that the target in android project's project.properties file is at least 13, and the android:minSdkVersion in your AndroidManifest.xml is at least 9. Sadly this does mean users running ancient versions of Android will be excluded, but there's nothing we can do about this. There are very very VERY few devices still running versions below 2.3/API9, so at least you won't be excluding many users...<br />
<br />
Add these two lines as children of the 'application' element:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/></span><span style="font-family: Courier New, Courier, monospace;"><activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/></span></blockquote>
<br />
Add these two permissions as children of the 'manifest' element:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><uses-permission android:name="android.permission.INTERNET"/></span><span style="font-family: Courier New, Courier, monospace;"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></span></blockquote>
<br />
Save changes, then refresh and clean in eclipse for good luck...<br />
<br />
<br />
<b>Banner Ad</b><br />
<br />
<a href="https://github.com/TheInvader360/tutorial-libgdx-google-ads/blob/9a4c9342d98c02e3c44e0b62fcfaa153d257130a/tutorial-libgdx-google-ads-android/src/com/theinvader360/tutorial/libgdx/google/ads/MainActivity.java">See this version of the android project's MainActivity class</a> for a reasonably straightforward banner ad implementation.<br />
<br />
<br />
<b>Interstitial Ad</b><br />
<br />
<a href="https://github.com/TheInvader360/tutorial-libgdx-google-ads/commit/0a5ea376d4eb92b8e87c13a03245adb40b53e811">This diff shows an interstitial ad implementation</a> (ActionResolver interface lets us trigger interstitial actions from the core project while retaining the invaluable LibGdx cross-platform functionality).<br />
<br />
----------<br />
<div>
<br /></div>
That's all there is to it!<br />
<br />
As always, please feel free to leave comments below. I can't really offer support - TheInvaderOne and "Real Life Day Job" leave me very little free time these days, but other visitors will often leave helpful solutions, and if I find a spare moment every now and then I do try to answer any unresolved queries.<br />
<br />
Anyway, I hope you have fun making your games - be sure to leave a note here if you release something on google play or the amazon market, I'm always happy to check out new games :)<br />
<br />
PS - one final note if cloning from <a href="https://github.com/TheInvader360/tutorial-libgdx-google-ads">https://github.com/TheInvader360/tutorial-libgdx-google-ads</a>, pay attention to the problems view in eclipse! You will need to create an empty 'gen' directory in both the google-play-services_lib and tutorial-libgdx-google-ads-android projects, and ensure you have the required android sdks installed. As is often the case with eclipse, a liberal amount of refreshing and cleaning will do no harm...<br />
<div>
<br /></div>
</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com10tag:blogger.com,1999:blog-8622129831031492300.post-14286242030278544362014-02-09T08:18:00.000-08:002014-02-09T08:18:55.213-08:00Back with a new game - Little Fish<div dir="ltr" style="text-align: left;" trbidi="on">
I've been away from the world of Android Games for a little while, but I do have a couple of good excuses:<br />
<br />
<ol style="text-align: left;">
<li>My role has changed at work and I am now a developer - this is pretty awesome. Ok so it's dry databases and stuff, not games, but I'm getting paid to do what I enjoy, and am feeling pretty good about that! It does mean more of my spare time being spent on work related learning though, so a little less time for Android Game development.</li>
<li>Even bigger news than career change... We're expecting our first baby!!! TheInvaderOne should be delivered by the stork at the end of next month :-o Preparing for the arrival of a human worm baby takes up a lot of time, though of course nowhere near as much time as once she has actually arrived. Spending time with her will be way higher up the list of priorities than playing with Android, so I either need to drop my hobby, or make it more efficient...</li>
</ol>
<br />
What I have been doing over the past few months (as and when I found a few spare hours here and there) is working on a sort of 'white label' app built on top of <a href="http://libgdx.badlogicgames.com/">LibGdx</a>. It includes a lot of the dull and boring to implement stuff that I end up doing over an over again, highscores, user preferences, ads, facebook integration, google play game services integration, splash screen, etc. In theory I will be able to use this as a quick start platform to speed up the game production process in future. I don't currently have plans to open source this as it's a bit too closely tied to my own stuff, and decoupling would take valuable time that could be better spent making games, but maybe sometime in the future it'll be an option.<br />
<br />
I'm hoping that this quick start platform will allow me to continue making Android Games even after baby has arrived. The recent success of <a href="http://en.wikipedia.org/wiki/Flappy_Bird">Flappy Bird</a> proves that a game doesn't have to be sophisticated to become a runaway success. At its core it's a simple game (basically a reskinned <a href="http://www.helicoptergame.net/">helicopter game</a>), with simple graphics. I'm sure the developer wouldn't mind me saying a similar game could be built in a single weekend, especially when leveraging a quick start platform. I've had some success in the past with my <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame">Racing Game</a> and <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack</a> that proves the same point, simple/fun/addictive beats complicated/polished/boring. So, in future I can focus more on game mechanics and less on the surrounding app furniture, this can only be a good thing :)<br />
<br />
I've just published my first game that makes use of the white label quick start sausage machine (catchy name) "<a href="https://play.google.com/store/apps/details?id=com.theinvader360.fishy.fishing.fish.game.free">Little Fish</a>". The gameplay is pretty simple - you control a little fish that eats smaller fish. Bigger fish will eat your little fish, so avoid them! There's the added complication of poison fish that you must avoid at all costs (even if they're tiny). Once you've eaten enough little fishies (empty hunger meter), you progress to the next level where you'll be a bit bigger. Of course the screen is no bigger, so dodging the predators will get harder the more you progress! Simple game, but fun and addictive :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-yVxFseGQ77Q/UveHge76MTI/AAAAAAAAANQ/ePGAj8Kfi1Q/s1600/Screenshot_2014-02-08-11-34-09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-yVxFseGQ77Q/UveHge76MTI/AAAAAAAAANQ/ePGAj8Kfi1Q/s1600/Screenshot_2014-02-08-11-34-09.png" height="250" width="400" /></a></div>
<br />
I've added a couple of new features to <a href="https://play.google.com/store/apps/details?id=com.theinvader360.fishy.fishing.fish.game.free">Little Fish</a> too. First there's a kids mode, there are no gameovers in this mode (unless you choose to quit) the tradeoff being no global leaderboard score submission. I've seen lots of little children want to play mobile and tablet games recently, but when they are very small it can be frustrating losing quickly, the kids mode will help keep them happy and occupied for longer. It can also double as a training mode, once the child has mastered the more forgiving kids mode, they can try the more challenging normal mode! The other new feature is extended controller support. Not only can you choose to control the <a href="https://play.google.com/store/apps/details?id=com.theinvader360.fishy.fishing.fish.game.free">Little Fish</a> by touch or tilt, you can also use the dpad of an xperia play (and hopefully any other android device that has a control pad) or a HID compliant external controller. The guys over at <a href="http://www.mogaanywhere.com/">Moga</a> recently sent me some awesome free stuff, and it was an absolute breeze to get <a href="https://play.google.com/store/apps/details?id=com.theinvader360.fishy.fishing.fish.game.free">Little Fish</a> working with the Moga in HID mode. When I've had time to play with the Moga SDK properly I expect I'll write a blog post dedicated to that.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/jIMB_WJBBLU/0.jpg"><param name="movie" value="https://youtube.googleapis.com/v/jIMB_WJBBLU&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/jIMB_WJBBLU&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />
I hope you'll check out <a href="https://play.google.com/store/apps/details?id=com.theinvader360.fishy.fishing.fish.game.free">Little Fish</a> and of course all my <a href="https://play.google.com/store/apps/developer?id=TheInvader360">other games</a>. As always, I hope you have fun!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-2979134178268062042013-10-19T09:01:00.001-07:002014-08-29T14:17:54.276-07:00LibGDX Google Play Game Services Tutorial<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.jumping.superjumpadoodle.free"><img border="0" src="http://1.bp.blogspot.com/-A1AChyuWZRA/UmKrZ4xLl_I/AAAAAAAAAMM/nRnJc7ng2pM/s400/feature.png" height="195" width="400" /></a></div>
<br />
<a href="https://developers.google.com/games/services/">Google Play Game Services</a> offers cross platform social leaderboards, achievements, and much more (realtime multiplayer, cloud saves, anti-piracy...). I've started implementing google play game services leaderboards and achievements in my <a href="https://play.google.com/store/apps/developer?id=TheInvader360">LibGDX Android Games</a>, and the purpose of this blog article is to walk through the process so you can do the same!<br />
<br />
<ul style="text-align: left;">
<li>I've published an example project on <a href="https://play.google.com/store/apps/details?id=com.theinvader360.tutorial.libgdx.gameservices">Google Play</a> check it out!</li>
<li>The example project is freely available on <a href="https://github.com/TheInvader360/libgdx-gameservices-tutorial">GitHub</a> check that out too!</li>
<li>You can also get the complete (free) version of <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jumping.superjumpadoodle.free">Super Jump a Doodle</a> <a href="https://play.google.com/store/apps/details?id=com.theinvader360.jumping.superjumpadoodle.free">here</a>!</li>
</ul>
<br />
Continue reading after the jump to find out how to add these features to your own games!<br />
<br />
<br />
<a name='more'></a><br />
<h3 style="text-align: left;">
Google Play Developer Console Setup</h3>
<div>
<br /></div>
Before we can start making any changes to our app, we first need to work our way through the required developer console setup.<br />
<br />
Go to <a href="https://play.google.com/apps/publish">https://play.google.com/apps/publish</a>, and click the Game Services menu option (gamepad icon)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Z-oX369VWvU/UmKlngfqCtI/AAAAAAAAAK4/sUenputOFC0/s1600/01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Z-oX369VWvU/UmKlngfqCtI/AAAAAAAAAK4/sUenputOFC0/s320/01.png" height="164" width="320" /></a></div>
<br />
Click 'Add New Game', fill in the required name and category details, then continue<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ndT7hhUmloE/UmKlvP--CvI/AAAAAAAAALM/bBcPrERE1iY/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ndT7hhUmloE/UmKlvP--CvI/AAAAAAAAALM/bBcPrERE1iY/s320/02.png" height="300" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Fill in the required game details, upload the required graphic assets, then continue to linked apps<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FwHNO9MiKeg/UmKlyhLSeDI/AAAAAAAAALg/fJ3Y-lYKY4c/s1600/03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-FwHNO9MiKeg/UmKlyhLSeDI/AAAAAAAAALg/fJ3Y-lYKY4c/s320/03.png" height="209" width="320" /></a></div>
<br />
Link an android app, add your package name (must match your app), then save and continue<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/--Oflvr8ExDk/UmKlvPL8qcI/AAAAAAAAALI/xhsM5_pC3LQ/s1600/04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/--Oflvr8ExDk/UmKlvPL8qcI/AAAAAAAAALI/xhsM5_pC3LQ/s320/04.png" height="120" width="320" /></a></div>
<br />
Click authorise your app, fill in the package and SHA1, then create client. Note that the SHA1 is presented in eclipse when building your release apk if you are using an up to date version of the eclipse adt plugin. If using an older version of the adt plugin, you can find your certificates SHA1 by running the following shell command “<span style="font-family: Courier New, Courier, monospace;">keytool -list -v -keystore ReleaseKey.keystore -keypass android</span>” (note that 'ReleaseKey.keystore' needs to be the full path to your certificate keystore file)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-n6sTbiG4oH0/UmKly9TBrmI/AAAAAAAAALc/h8u_n2V92ao/s1600/05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-n6sTbiG4oH0/UmKly9TBrmI/AAAAAAAAALc/h8u_n2V92ao/s320/05.png" height="243" width="320" /></a></div>
<br />
You have to create a minimum of 5 achievements, so go ahead and do so...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-BQ5MOdbOYFE/UmKlzLm45KI/AAAAAAAAALk/6crJH-Y3oms/s1600/06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-BQ5MOdbOYFE/UmKlzLm45KI/AAAAAAAAALk/6crJH-Y3oms/s320/06.png" height="221" width="320" /></a></div>
<br />
Make a note of the IDs, we'll be needing them later<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-99soVwh-bJ4/UmKl2cnB3hI/AAAAAAAAAL0/Xv0BSHl5qqQ/s1600/07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-99soVwh-bJ4/UmKl2cnB3hI/AAAAAAAAAL0/Xv0BSHl5qqQ/s320/07.png" height="109" width="320" /></a></div>
<br />
A leaderboard is usually a nice touch, so let's create one of those too<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-NtS79E0nMA0/UmKl39UnEII/AAAAAAAAAMA/TRzGkfqsOkg/s1600/08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-NtS79E0nMA0/UmKl39UnEII/AAAAAAAAAMA/TRzGkfqsOkg/s320/08.png" height="216" width="320" /></a></div>
<br />
Again, make a note of the ID, we'll need it later<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-iZCBC69ABrI/UmKl1TIDjqI/AAAAAAAAALs/Lgeb_tfkDD4/s1600/09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-iZCBC69ABrI/UmKl1TIDjqI/AAAAAAAAALs/Lgeb_tfkDD4/s320/09.png" height="87" width="320" /></a></div>
<br />
Provided all required fields have been completed, and the required graphic assets uploaded, we can finally publish the Google Play Game Services settings. Do this, and make a note of the App ID, this will be needed later too!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-uzBGnootfeE/UmKl3_riAXI/AAAAAAAAAME/ERFIxRnnfeM/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-uzBGnootfeE/UmKl3_riAXI/AAAAAAAAAME/ERFIxRnnfeM/s320/10.png" height="156" width="320" /></a></div>
<br />
<br />
<h3 style="text-align: left;">
LibGDX App Setup in Eclipse</h3>
<div>
<br /></div>
Copy the BaseGameUtils and google-play-services_lib directories from <a href="https://github.com/TheInvader360/libgdx-gameservices-tutorial">the example project on GitHub</a> and save them somewhere locally. Now import both these existing projects into Eclipse, right click the project folders in package explorer, properties > android, then tick the “Is Library” box. The libraries should now be available to the other projects in your workspace. Finally, import your LibGDX projects (core, android and desktop).<br />
<br />
Right click the android project in package explorer:<br />
<br />
<ul style="text-align: left;">
<li>Android, in the Library section Add > BaseGameUtils > OK, Add > google-play-services_lib > OK, Apply.</li>
<li>Properties > Java Build Path, Projects tab, add both BaseGameUtils and play-game-services_lib projects, then ok twice to save and close.</li>
</ul>
<br />
Open AndroidManifest.xml, and add two permissions:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><uses-permission android:name="android.permission.INTERNET" /></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /></span><br />
<br />
You will also need to add the following element as a child to application:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" /></span><br />
<br />
Edit your android project's res/values/strings.xml, add the following element as a child to resources:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><string name="app_id">796047314795</string> </span><br />
<br />
Note you will need to change the app_id value to whatever your app_id is... The number will have been presented to you in the Google Play Developer Console.<br />
<br />
You most likely already have an <a href="https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code">ActionResolver</a> interface in your core project, if you do, add the Google Play Game Services related methods below. If you don't already use an ActionResolver interface, now's a good time to add one:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">package com.theinvader360.tutorial.libgdx.gameservices;</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">public interface ActionResolver {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public boolean getSignedInGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public void loginGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public void submitScoreGPGS(int score);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public void unlockAchievementGPGS(String achievementId);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public void getLeaderboardGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> public void getAchievementsGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span><br />
<br />
Edit your android project's MainActivity. Have it implement GameHelperListener and ActionResolver, and add the unimplemented methods. Add a GameHelper field to the class, and a default constructor that instantiates it. For full detail, take a look at the <a href="https://github.com/TheInvader360/libgdx-gameservices-tutorial/blob/d822b1bfed8910f5848f0a95781fd502a269bd16/tutorial-libgdx-gameservices-android/src/com/theinvader360/tutorial/libgdx/gameservices/MainActivity.java">example project</a>. Note if you're copying this implementation you need to remember to swap the leaderboard ID to the ID in your Google Play Developer Console, personally I prefer to shift all the ID's to a single Constants class, but didn't do that in the example project as I tried keeping it as simple as possible, and with the minimum of change from the standard <a href="https://github.com/libgdx/libgdx/tree/master/demos/superjumper">Super Jumper Demo</a>.<br />
<br />
You will also need to add the relevant methods to your Desktop projects ActionResolver mock implementation, again for an example see the <a href="https://github.com/TheInvader360/libgdx-gameservices-tutorial/blob/d822b1bfed8910f5848f0a95781fd502a269bd16/tutorial-libgdx-gameservices-desktop/src/com/theinvader360/tutorial/libgdx/gameservices/ActionResolverDesktop.java">example project</a>.<br />
<br />
Now all that's left to do is call the relevant ActionResolver methods from your game at appropriate times...<br />
<br />
At gameover, for example, you might call the following (remember to swap the ID's to match those in your Google Play Developer Console!):<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">if (game.actionResolver.getSignedInGPGS()) {</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> game.actionResolver.submitScoreGPGS(world.score);</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if (world.score >= 100) game.actionResolver.unlockAchievementGPGS("CgkI6574wJUXEAIQAQ");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if (world.score >= 200) game.actionResolver.unlockAchievementGPGS("CgkI6574wJUXEAIQAg");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if (world.score >= 300) game.actionResolver.unlockAchievementGPGS("CgkI6574wJUXEAIQBA");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if (world.score >= 400) game.actionResolver.unlockAchievementGPGS("CgkI6574wJUXEAIQBQ");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> if (world.score >= 500) game.actionResolver.unlockAchievementGPGS("CgkI6574wJUXEAIQBg");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span><br />
<br />
Or on the menu screen you might call:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">if (game.actionResolver.getSignedInGPGS()) game.actionResolver.getLeaderboardGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">else game.actionResolver.loginGPGS();</span><br />
<br />
or<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">if (game.actionResolver.getSignedInGPGS()) game.actionResolver.getAchievementsGPGS();</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">else game.actionResolver.loginGPGS();</span><br />
<br />
<br />
That's all there is to it! Now all you need to do is build your apk (note Google Play Game Services will only work correctly if you build using the same certificate as the one you set in the Developer Console, so do a full release build and manually deploy to your device, don't just right click > run as > android application), drop the apk on your device, install, and play :)<br />
<br />
----------<br />
<br />
Note it is possible that I may have skipped a little detail in this article. If you have any problems, I would suggest that you follow the first section (Google Play Developer Console Setup), git clone https://github.com/TheInvader360/libgdx-gameservices-tutorial.git, build a release apk, drop it on your device, and have a play. The example project is wide open and should be pretty self explanatory, feel free to use and abuse it in any way you see fit!<br />
<br />
----------<br />
<div>
<br /></div>
<div>
<b>Update: </b>If you want to work with the latest version of googleplay game services...</div>
<div>
<div>
<ul style="text-align: left;">
<li>Using the Android SDK Manager, download the latest API version (API19)</li>
<li>Replace the old google-play-services_lib directory in workspace root with the new version (available at <android-sdk>/extras/google/google_play_services/libproject/google-play-services_lib).</li>
<li>Replace the old BaseGameUtils directory in workspace root with the new version from my github project - https://github.com/TheInvader360/libgdx-gameservices-tutorial/tree/master/BaseGameUtils. Alternatively, you can grab the latest version from the eclipse_compat/libraries/BaseGameUtils/ dir of the playgameservices android-samples repository (git clone https://github.com/playgameservices/android-samples.git) but please keep in mind that things change over time so the latest and greatest version might need some code changes on your part to get things working again. Probably easier to stick with the version in my github project if you are following this walkthrough and want an easy life :)</li>
<li>Delete google-play-services_lib and BaseGameUtils projects from eclipse package explorer, then import existing android code to add the new versions.</li>
<li>Right click the BaseGameUtils project and on the Android tab tick Is Library, and add reference to google-play-services_lib, apply.</li>
<li>Right click the libgdx android project and correct the Java Build Path if there is a problem (remove and re-add BaseGameUtils), and again on the Android tab if there is a broken reference to BaseGameUtils, apply.</li>
<li>Set AndroidManifest minSdkVersion to 9 targetSdkVersion to 19</li>
<li>Add <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> as a child of application in AndroidManifest.xml</li>
<li>Refresh and clean.</li>
<li>Make these changes to the android project's MainActivity class - <a href="https://github.com/TheInvader360/libgdx-gameservices-tutorial/commit/a5c36953b3b51c4f0dd9ea3f8606061cf2ec3fc4">https://github.com/TheInvader360/libgdx-gameservices-tutorial/commit/a5c36953b3b51c4f0dd9ea3f8606061cf2ec3fc4</a></li>
</ul>
</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com117tag:blogger.com,1999:blog-8622129831031492300.post-25440686044322997942013-06-22T06:00:00.000-07:002013-06-22T07:22:54.591-07:00Fruit Run FREE Slot Machine - featuring google play game services!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.casino.fruitslotmachine.free" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="195" src="http://2.bp.blogspot.com/-pi_qXFUjRC8/UcWqRtx0MbI/AAAAAAAAAJU/ZJ27h1Xpp8I/s400/feature1024x500.png" width="400" /></a></div>
<br />
<span style="font-size: large;"><b><br /></b></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b><a href="https://play.google.com/store/apps/details?id=com.theinvader360.casino.fruitslotmachine.free"></a></b></span><br />
<a name='more'></a><span style="font-size: large;"><b><a href="https://play.google.com/store/apps/details?id=com.theinvader360.casino.fruitslotmachine.free">Fruit Run FREE Slot Machine</a> by <a href="https://play.google.com/store/apps/developer?id=TheInvader360">TheInvader360</a></b></span><br />
<br />
Fruit Run FREE Slot Machine is a fun fruit machine / slot machine casino gambling game. If you like slot machines, fruit machines, and one armed bandits, this game is for you!<br />
<br />
Spin, hold, and nudge your way to riches. Win the jackpot and become a Vegas high roller, just try not to lose all your winnings before you cash out!<br />
<br />
Fruit Run Slot Machine is just for fun, no real money is won or lost - no cost to play just good clean free fun :)<br />
<br />
Tap the gamepad icon to sign in and earn achievements and your place on the leaderboard - Challenge your friends!<br />
<br />
-----<br />
<br />
More than anything, this game was an opportunity for me to play with <a href="https://developers.google.com/games/services/">Google Play Game Services</a>, and integrate that functionality with <a href="http://libgdx.badlogicgames.com/">LibGDX</a>. It was a fun process, and I'm sure I'll post a bit more about it here when have some spare time.<br />
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.casino.fruitslotmachine.free"><span style="font-size: large;">FREE DOWNLOAD</span></a><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.casino.fruitslotmachine.free"><img border="0" src="https://developer.android.com/images/brand/en_generic_rgb_wo_60.png" /></a></div>
<br /></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com6tag:blogger.com,1999:blog-8622129831031492300.post-41548389196715999852013-06-10T08:00:00.000-07:002013-08-30T04:20:30.724-07:00One million installs!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/developer?id=TheInvader360"><img border="0" height="212" src="http://1.bp.blogspot.com/-rZ8mFwGUqiQ/UbdBN3XvSJI/AAAAAAAAAI4/kH125G_uI-g/s400/1MILL.png" width="400" /></a><span id="goog_1456673298"></span><span id="goog_1456673299"></span><a href="http://www.blogger.com/"></a></div>
<br />
1,066,345+ users have installed my LibGDX Android games :)<br />
<br />
Due to reporting lag that number is a few days out of date, and it doesn't include installs from third party scraper style stores, so the real number will be a little higher, but I can safely say I have over a million installs in total. Awesome :)<br />
<br />
So, how do the various markets stack up?<br />
<br />
<a name='more'></a><br /><br />
<a href="https://play.google.com/store/apps/developer?id=TheInvader360">google play</a>: 1,058,142 installs<br />
<a href="http://slideme.org/applications/theinvader360">slideme</a>: 7,330 installs<br />
<a href="http://apps.opera.com/en_gb/catalog.php?search=theinvader360">opera</a>: 532 installs<br />
<a href="http://www.amazon.com/s/field-keywords=com.theinvader360">amazon</a>: 341 installs<br />
<br />
It's not a like for like comparison, but it's fair to say that google play is king!<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame"><img border="0" src="http://1.bp.blogspot.com/-3pjkejNIiWw/Ubc0oVR3gGI/AAAAAAAAAH8/4TvtvsrioLw/s1600/app1.png" /></a></div>
<div>
<br /></div>
My <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame">first game</a> was published on google play 8th august 2012. I don't really know how such a simple game became such a success, maybe it has something to do with the fact I <a href="https://github.com/TheInvader360/race-game">open sourced</a> and wrote about my learning process on this blog? From the reviews it's clear that some people love it, and some people hate it (lots of 5*, lots of 1*, not a lot of anything in between!). Creating that game helped me learn some game making basics, it was more for my own benefit than a proper attempt at making a commercial game. Half a million installs later, even if only half the people that installed it like playing it, that's a quarter of a million happy players :)<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.mrdt.arenaroamer"><img border="0" src="http://1.bp.blogspot.com/-r45D1U1K7To/Ubc0oTnWacI/AAAAAAAAAHs/uEoC7f5Ro3M/s1600/app2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Next I started experimenting with 3D, and <a href="https://play.google.com/store/apps/details?id=com.mrdt.arenaroamer">published a demo</a> on the 25th August 2012 (also <a href="https://github.com/TheInvader360/arena-roamer">open source</a> :)). Not a huge number of installs (~25,000), but that's not surprising as it's a rough tech demo, not a proper finished game. I'd love to do some more 3D stuff, but the worst part of it has to be asset creation. It doesn't take me long to hand draw a cartoon character, scan it, and trace it in paint.net... Building decent 3D assets is a whole different barrel of ball games.<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame"><img border="0" src="http://1.bp.blogspot.com/-xFcQiuq6mC0/Ubc0oSNcqKI/AAAAAAAAAH0/wW_18wwvlKk/s1600/app3.png" /></a></div>
<div>
<br /></div>
My <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame">third game</a> was the result of a personal <a href="http://theinvader360.blogspot.co.uk/2012/10/make-a-game-in-a-weekend.html">make a game in a weekend challenge</a>. I didn't manage to make it in a weekend, but it didn't take all that long, over 50,000 installs isn't too shabby all things considered :)<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/developer?id=TheInvader360"><img border="0" height="133" src="http://3.bp.blogspot.com/-7XvjfuBYSCA/Ubc1UZXtGSI/AAAAAAAAAIQ/9tubvJnvVmA/s200/mario-404.png" width="200" /></a></div>
<div>
<br /></div>
My fourth game is no more... Don't use the evil monkey from family guy in your games kids, fox's lawyers will come get you while you sleep!<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree"><img border="0" src="http://2.bp.blogspot.com/-ZLqVLkGfC04/Ubc0o-0yctI/AAAAAAAAAIE/AODQHIrD8_E/s1600/app4.png" /></a></div>
<div>
<br /></div>
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack</a> is what I consider my first 'proper' game. I spent a bit more time and effort on this one, and as a result it's a bit more polished than the earlier games. First published on <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">google play</a> 10th March 2013, it has already racked up over 300k installs there. This is the first game I uploaded to any alternative markets. <a href="http://slideme.org/application/quack-attack">Slideme</a> was totally painless, as was <a href="http://apps.opera.com/en_gb/quack_attack_free_duck_hunt.html">opera market</a>, published within a day or two of publishing on google play. <a href="http://www.amazon.com/Quack-Attack-FREE-Duck-Hunt/dp/B00CD4KOXY">Amazon</a> was a bit of a hassle, failed the review process three times before finally being published on the 28th May. Now that I have a handle on doing things the amazon way, it's not a problem creating amazon versions of my games, but whether it's worth the bother or not remains to be seen. 341 installs in the first fortnight on amazon versus 58,800 installs in the first fortnight on google play suggests that maybe it's not...<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free"><img border="0" src="http://1.bp.blogspot.com/-3_H2S6MS6Dw/Ubc0pCwSF_I/AAAAAAAAAIM/80Q7CR4PRyk/s1600/app5.png" /></a></div>
<div>
<br /></div>
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Hardest Free Brain Game (aka "4 Games 1 Screen")</a> is my most ambitious published game to date. The concept is simple - give your brain a workout by playing four independent games at once. I had hoped that this game would be a big success, it's a bit of a break from the norm (though admittedly not <a href="https://play.google.com/store/apps/details?id=com.dicon.fourtasks">totally</a> <a href="https://play.google.com/store/apps/details?id=com.jasher.Multitask">original</a>), and it really makes the most of the mobile platform - tilting, swiping, tapping, etc. Sadly it has been something of a flop so far, since the 14th May there have been 6,521 google play installs, 3,757 slideme installs, 299 opera installs, and I haven't bothered with an amazon version yet. I guess trying to make something a bit different and innovative is a risk. Still, I make games for fun, and I had a <b>*lot*</b> of fun creating this game. I don't think making yet another generic match-3 or tetris style game would have been anywhere near as much fun, though it would no doubt be a greater commercial success. Anyway, shameless plug time - If you've not tried it yet, go give it a go - <a href="https://www.youtube.com/watch?v=P14qRhYv7j4">this video</a> should get the point of the game across, it's frustrating, fun, and free, you've got nothing to lose :)<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free"><img border="0" src="http://2.bp.blogspot.com/-wew3sIfgsik/Ubc0pfhsvUI/AAAAAAAAAII/JqR_VbC45wc/s1600/app6.png" /></a></div>
<div>
<br /></div>
Finally, we get to my most recent game <a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free">Street Race Swipe</a> (there's an <a href="https://github.com/TheInvader360/swipe-race-tutorial">open source</a> <a href="http://theinvader360.blogspot.co.uk/2013/05/street-race-swipe-libgdx-scene2d.html">tutorial</a> version if you want to learn a little about LibGDX Scene2D!). Amusingly, this game is essentially a slightly beefed up version of just one of the four games in my <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Hardest Free Brain Game</a>. It has been installed over 32,000 times in the first three weeks it has been live - that's pretty good going! The whole point of publishing this standalone version of <a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free">Street Race Swipe</a> was to try and drive downloads of <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Hardest Free Brain Game</a>. Turns out the standalone game is by far and away a bigger success than the ambitious 'concept' game. I'm happy to look on the bright side and chalk that up as a win. Next step will be to upload Street Race Swipe to <a href="http://slideme.org/applications/theinvader360">slideme</a> and <a href="http://apps.opera.com/en_gb/catalog.php?search=theinvader360">opera</a>, maybe even <a href="http://www.amazon.com/s/field-keywords=com.theinvader360">amazon</a>. After that I might extend the other three minigames and release them as standalone apps too!<br />
<br />
<div style="text-align: center;">
--------------------------------------------------</div>
<div>
<br /></div>
As for what else is bubbling away in the lab... A mario/sonic style platformer, a box2d game, a casino card game, another interesting 'concept' game based on motion detection (no doubt another commercial failure in the making!), two different tower defence games, and a 3D infinite runner game... I should really pick one of these games and get it finished and out there. Starting something new before finishing what has already been started is a very bad habit of mine... I'll never get to <b>one billion</b> downloads if my games don't get finished and published :)<br />
<br />
Right now though, I'm going to take a short break from making games, a couple of weeks off to enjoy the sun is in order I think :D</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com11tag:blogger.com,1999:blog-8622129831031492300.post-62374574765915083392013-05-26T10:06:00.001-07:002013-08-30T04:22:29.752-07:00Street Race Swipe LibGDX Scene2D Tutorial<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free"><img border="0" height="192" src="http://2.bp.blogspot.com/-KTHe70WadTM/UaMh95HCFzI/AAAAAAAAAHI/BFS990n2xfs/s320/screen2.png" width="320" /></a></div>
<br />
<br />
I have been meaning to write a LibGDX Scene2D tutorial for some time now (ever since my <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack FREE Duck Hunt Game</a> got ridiculously popular). The problem has been finding the time, instead of writing blog entries I've been <a href="https://play.google.com/store/apps/developer?id=TheInvader360">making games</a>!<br />
<br />
I had a great idea for a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">multitasking game</a>, play four independent games at one time to <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">train your brain</a> and <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">test your ability to multitask</a>. The result was my <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">4 Games 1 Screen FREE Brain Training Game</a>. I built this game as four separate games from the outset, with the intention of possibly building further on each minigame and releasing as standalone apps. The first of these standalone apps is <a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free">Street Race Swipe Racing Game</a>, which brings us neatly to the point of this article...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free"><img border="0" height="192" src="http://1.bp.blogspot.com/-fr2fk59ooUE/UaMiaVu-TAI/AAAAAAAAAHQ/Z9xKCyptLPA/s320/screen3.png" width="320" /></a></div>
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free">Street Race Swipe Racing Game</a> is such a simple game at its heart that it seems like an excellent candidate for a tutorial article :) I remember being massively impressed by the example <a href="https://code.google.com/p/libgdx/wiki/SimpleApp">SimpleApp on the LibGDX wiki</a> when first starting out, there was so little to it but it touched on all the basics of what is needed to make a game. I'm hoping this mini project will be almost as simple and just as helpful to others!<br />
<br />
<a name='more'></a><br />
<ul style="text-align: left;">
<li>You can get the example projects finished apk <a href="https://github.com/TheInvader360/swipe-race-tutorial/raw/master/swipe-race-tutorial.apk"><b>here</b></a> (<b>free!</b>)</li>
<li>You can get a more polished version of what is essentially the same game <a href="https://play.google.com/store/apps/details?id=com.theinvader360.racing.streetraceswipe.free"><b>here</b></a> (<b>free!</b>)</li>
<li>You can get the <b>free</b> multigame app that includes this minigame <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free"><b>here</b></a> (<b>free!</b>)</li>
</ul>
<br />
If you're interested in tinkering with the open source tutorial project, <a href="https://github.com/TheInvader360/swipe-race-tutorial">grab it from github</a>.<br />
<br />
Provided you have your dev environment correctly setup, you can go ahead and import the existing project into eclipse and start tinkering :) If you need help on setting up your dev environment, <a href="http://theinvader360.blogspot.co.uk/2012/07/getting-started-with-libgdx.html">check out this article</a>.<br />
<br />
Right, so by now you've seen the <a href="https://play.google.com/store/search?q=theinvader360">live games on Google Play</a>, installed the <a href="https://github.com/TheInvader360/swipe-race-tutorial/raw/master/swipe-race-tutorial.apk">example project apk</a>, and are interested in figuring out how it all works, let's dig in...<br />
<br />
First thing to note is that project is arranged in the standard core/android/desktop structure the LibGDX project creation wizard gives us.<br />
<br />
In the desktop projects src directory we have a utility class that makes use of gdx tools TexturePacker2 (you'll only need to run this if you alter the textures - simply right click the desktop project in eclipse, run as java application, Pack Textures, then right click the android project and refresh), and a Main class used to start the game on desktop (generated by the LibGDX project setup tool and only tweaked very slightly).<br />
<br />
In the android projects assets directory we have an image atlas and its counterpart image file, these were generated automatically by the packing utility (it packs anything in the dev-images directory). In the android projects src directory we have a standard MainActivity class generated by the LibGDX project setup tool - I've added an exit dialog to this class, but apart from that it remains unchanged.<br />
<br />
What remains is the core project...<br />
<br />
The entry point is <b>MyGame.java</b>:<br />
<br />
<pre style="background-color: #f0f0f0; background-position: initial initial; background-repeat: initial initial; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import com.badlogic.gdx.Game;
public class MyGame extends Game {
public final static int WIDTH = 800;
public final static int HEIGHT = 480;
private GameScreen gameScreen;
@Override
public void create() {
Assets.load();
gameScreen = new GameScreen();
setScreen(gameScreen);
}
@Override
public void dispose() {
Assets.dispose();
gameScreen.dispose();
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
First we define static final width and height constants that will be used to specify the target resolution of the game. We'll later use these constants to set the size of our game stage. Note that these values aren't physical pixel dimensions, they are an abstract idea of the size of our play area. Our LibGDX Scene2D Stage will be stretched to fit the players device as best possible, which means our game will display nicely on devices with 320x240px screens, 1920x1080px screens, and anything in between!<br />
<br />
We also load our Assets, create a GameScreen and set it to active, and do some housekeeping on dispose. Not a lot to it really...<br />
<br />
<b>Assets.java:</b><br />
<br />
<pre style="background-color: #f0f0f0; background-position: initial initial; background-repeat: initial initial; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
public class Assets {
public static TextureAtlas atlas;
public static TextureRegion car;
public static TextureRegion road;
public static void load() {
atlas = new TextureAtlas(Gdx.files.internal("images.atlas"));
car = atlas.findRegion("car");
road = atlas.findRegion("road");
}
public static void dispose() {
atlas.dispose();
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
Not a lot of assets in this game - just an atlas that contains a whopping great <b><i>two</i></b> texture regions. Get the atlas from android internal assets directory, find the car and road regions, and make them all publicly available. Oh, and be a good citizen and dispose of the filehandle on closing the app.<br />
<br />
Right, on to <b>GameScreen.java</b> then:<br />
<pre style="background-color: #f0f0f0; background-position: initial initial; background-repeat: initial initial; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Stage;
public class GameScreen implements Screen, GestureListener {
private Stage stage;
private TrafficGame trafficGame;
public GameScreen() {
stage = new Stage();
trafficGame = new TrafficGame();
stage.addActor(trafficGame);
}
public void resize(int width, int height) {
stage.setViewport(MyGame.WIDTH, MyGame.HEIGHT, true);
stage.getCamera().translate(-stage.getGutterWidth(),
-stage.getGutterHeight(), 0);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act(delta);
stage.draw();
}
@Override
public void show() {
Gdx.input.setInputProcessor(new GestureDetector(this));
}
@Override
public void hide() {
Gdx.input.setInputProcessor(null);
}
@Override
public boolean fling(float velocityX, float velocityY, int button) {
if (velocityY < -100)
trafficGame.playerCar.tryMoveUp();
if (velocityY > 100)
trafficGame.playerCar.tryMoveDown();
return false;
}
@Override
public void resume() {
}
@Override
public void pause() {
}
@Override
public void dispose() {
}
@Override
public boolean tap(float x, float y, int count, int button) {
return false;
}
@Override
public boolean touchDown(float x, float y, int pointer, int button) {
return false;
}
@Override
public boolean longPress(float x, float y) {
return false;
}
@Override
public boolean pan(float x, float y, float deltaX, float deltaY) {
return false;
}
@Override
public boolean zoom(float initialDistance, float distance) {
return false;
}
@Override
public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2,
Vector2 pointer1, Vector2 pointer2) {
return false;
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
<br />
So this is the active (and only) screen. GameScreen implements Screen, we know the render method will be called regularly, so this is where our main gameloop lives (not much to it - wipe the screen, tell the stage to act/update based on time passed since last update, draw the stage, repeat...). It has a Scene2D stage, and the resize method sets the stage viewport to our games virtual resolution (800x480) ensuring that if the device is of a different aspect ratio we do not stretch the stage to fit but instead display black bars in the screen gutters (letterboxing). It implements GestureListener too, and in the overridden fling() method we detect flings/swipes and trigger an action. Finally, there's a rather mysterious TrafficGame object being instantiated and added to the stage. This TrafficGame actor being on stage means that its act method will be called each time the render method asks the stage to update itself, and its draw method will be called each time the render method asks the stage to draw itself. Sounds exciting, let's find out more...<br />
<br />
<b>TrafficGame.java</b>:<br />
<pre style="background-color: #f0f0f0; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; width: 646.46875px;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import java.util.Iterator;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
public class TrafficGame extends Table {
private InfiniteScrollBg backgroundRoad;
private Array<EnemyCar> enemyCars;
private long lastCarTime = 0;
public final float lane2 = 390;
public final float lane1 = 240;
public final float lane0 = 90;
public PlayerCar playerCar;
public TrafficGame() {
setBounds(0, 0, 800, 480);
setClip(true);
backgroundRoad = new InfiniteScrollBg(getWidth(), getHeight());
addActor(backgroundRoad);
playerCar = new PlayerCar(this);
addActor(playerCar);
enemyCars = new Array<EnemyCar>();
}
@Override
public void act(float delta) {
super.act(delta);
if (TimeUtils.nanoTime() - lastCarTime > 3000000000f)
spawnCar();
Iterator<EnemyCar> iter = enemyCars.iterator();
while (iter.hasNext()) {
EnemyCar enemyCar = iter.next();
if (enemyCar.getBounds().x + enemyCar.getWidth() <= 0) {
iter.remove();
removeActor(enemyCar);
}
if (enemyCar.getBounds().overlaps(playerCar.getBounds())) {
iter.remove();
if (enemyCar.getX() > playerCar.getX()) {
if (enemyCar.getY() > playerCar.getY())
enemyCar.crash(true, true);
else
enemyCar.crash(true, false);
} else {
if (enemyCar.getY() > playerCar.getY())
enemyCar.crash(false, true);
else
enemyCar.crash(false, false);
}
}
}
}
private void spawnCar() {
int lane = MathUtils.random(0, 2);
float yPos = 0;
if (lane == 0)
yPos = lane0;
if (lane == 1)
yPos = lane1;
if (lane == 2)
yPos = lane2;
EnemyCar enemyCar = new EnemyCar(getWidth(), yPos);
enemyCars.add(enemyCar);
addActor(enemyCar);
lastCarTime = TimeUtils.nanoTime();
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
batch.setColor(Color.WHITE);
super.draw(batch, parentAlpha);
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
<br />
Ok, so that's why the GameScreen render method was so deceptively empty, the real game logic lives in TrafficGames act method...<br />
<br />
Let's take it from the top. TrafficGame extends Table, this is a special type of Actor that has a funky setClip(true) function, it means that anything outside the bounds of the TrafficGame won't be drawn. Remember that we don't allow the aspect ratio to be stretched, clipping means we won't have actors spilling out over our nice black letterboxing bars. I think this is probably abusing tables, it's no doubt not what they were really meant for, but I think it's a great little hack and am more than happy with the results!<br />
<br />
In the constructor we create an InfiniteScrollBg and add it to the stage. We don't quite know what the deal is with this right now, but it's an actor added to the stage and will draw itself when asked to, that's all we care about for now.<br />
<br />
We also create a PlayerCar and add it to the stage. Same story as InfiniteScrollBg, bit of a mystery for now, but I'd like to hope that the class names are reasonably descriptive :) Let's just add it to the stage and be happy in the knowledge that when the stage is updated and drawn it will take care of updating and drawing itself.<br />
<br />
Finally, we create an empty array to hold references to EnemyCar objects (more mystery objects!)...<br />
<br />
Right, back to the act method... It checks if an enemy car has been spawned recently, and if not spawns one (randomly assign to a lane, add to the enemyCars array, add to the stage, set the last spawn time to *now* so in three seconds time we can do this all over again). It also checks for enemy cars that are outside the play area and removes from the enemyCars array and removes the actor from the stage (well from TrafficGame, which is on the stage, so same diff). And it does a nice and easy overlap collision check (if an enemy cars bounds overlaps the player cars bounds, do something!). If this stuff looks familiar, it's because at it's heart this is a direct ripoff of the excellent <a href="https://code.google.com/p/libgdx/wiki/SimpleApp">SimpleApp example in the LibGDX wiki</a> :)<br />
<br />
And last but not least (or maybe literally least, come to think of it), we have the draw method. It simply resets the spritebatch color to white (just incase any other cheeky actors have been messing with the spritebatch) and then calls its own super method which does all the heavy lifting. Awesome.<br />
<br />
Let's get back to those mystery classes, starting with the simplest - <b>InfiniteScrollBg.java</b>:<br />
<pre style="background-color: #f0f0f0; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; width: 646.46875px;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
public class InfiniteScrollBg extends Actor {
public InfiniteScrollBg(float width, float height) {
setWidth(width);
setHeight(height);
setPosition(width, 0);
addAction(forever(sequence(moveTo(0, 0, 1f), moveTo(width, 0))));
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
batch.draw(Assets.road, getX() - getWidth(), getY(), getWidth() * 2,
getHeight());
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
<br />
What do we have here then? We extend actor, so provided this thing is on stage when we call stage.act() it'll update itself, and provided it's on stage when we call stage.draw() it'll draw itself. InfiniteScrollBg has dimensions that match our stage size, but when it draws itself it is actually drawing something twice the size of the stage, the road texture is drawn at InfiniteScrollBg's x position minus its own width, and the texture is stretched over a width twice that of the objects own width. Since we initialise the objects position as being on the right edge of the screen, what we are in effect doing is drawing an image that covers the whole of the viewport and the same size area again directly to the right of the visible area. What's the point of that I hear you say...<br />
<br />
Actions is the point of that. Look closely at this line - "addAction(forever(sequence(moveTo(0, 0, 1f), moveTo(width, 0))));". When we construct this object, we tell it that we want it to constantly repeat the following actions forever: First, we want it to move left, the distance to move is its own width (or the width of the visible play area), and we want this action to happen over a timespan of one second. Next, we want it to move back to its starting point, and we want this movement to be instantaneous. These two sequential actions looping forever, combined with an image twice the width of the visible play area, gives us the illusion of a never ending infinitely scrolling background. Neat! :) To see this principle being used to achieve parallax scrolling and multiple different games at once, check out my <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">4 Games 1 Screen FREE Brain Training Game</a>!<br />
<br />
Two more classes to go, the PlayerCar and EnemyCar objects...<br />
<br />
<b>PlayerCar.java</b>:<br />
<pre style="background-color: #f0f0f0; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; width: 646.46875px;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.scenes.scene2d.Actor;
public class PlayerCar extends Actor {
private TrafficGame trafficGame;
private Rectangle bounds = new Rectangle();
private int lane;
public PlayerCar(TrafficGame trafficGame) {
this.trafficGame = trafficGame;
setWidth(160);
setHeight(85);
lane = 1;
setPosition(100, trafficGame.lane1 - getHeight() / 2);
setColor(Color.YELLOW);
}
@Override
public void act(float delta) {
super.act(delta);
updateBounds();
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
batch.setColor(getColor().r, getColor().g, getColor().b, getColor().a);
batch.draw(Assets.car, getX(), getY(), getWidth() / 2, getHeight() / 2,
getWidth(), getHeight(), 1, 1, getRotation());
}
private void updateBounds() {
bounds.set(getX(), getY(), getWidth(), getHeight());
}
public void tryMoveUp() {
if ((getActions().size == 0) && (lane != 2))
moveToLane(lane + 1);
}
public void tryMoveDown() {
if ((getActions().size == 0) && (lane != 0))
moveToLane(lane - 1);
}
private void moveToLane(int lane) {
this.lane = lane;
switch (lane) {
case 0:
addAction(moveTo(getX(), trafficGame.lane0 - getHeight() / 2, 0.5f));
break;
case 1:
addAction(moveTo(getX(), trafficGame.lane1 - getHeight() / 2, 0.5f));
break;
case 2:
addAction(moveTo(getX(), trafficGame.lane2 - getHeight() / 2, 0.5f));
break;
}
}
public Rectangle getBounds() {
return bounds;
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
<br />
Another actor that takes care of its own act and draw methods, great stuff. It has a shape and size, roughly rectangular, so we can get away with simple rectangle bounds for overlap collision checks. Every time act is called, update the bounds in case the car has moved. When we draw, we use the actors own color, which we've set to a rather fetching shade of yellow. This is why we had to set the batch color to white in TrafficGame, because our actors can (and do) screw with the spritebatch tint :)<br />
<br />
We've a couple of public methods that you may recall are triggered when swiping the GameScreen, tryMoveUp() and tryMoveDown(). These methods simply check the car's current position (is it in lane 0 or 2?), and based on whether or not the requested movement is valid or not (if you're in the top lane you can't move up, if you're in the bottom lane you can't move down, if you're currently moving between lanes i.e. have actions in your queue you can't accept another move request) either does nothing or calls moveToLane(int lane).<br />
<br />
moveToLane accepts an integer parameter, and based on the requested lane adds the appropriate action to the PlayerCar, these actions should be familiar from the InfiniteScrollBg class - move to a new position, and spread the movement over a timespan of half a second.<br />
<br />
And that brings us to our last class, <b>EnemyCar.java</b>:<br />
<pre style="background-color: #f0f0f0; border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; width: 646.46875px;"><code style="word-wrap: normal;"><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span><span style="font-size: 12px; line-height: 20px;">package com.theinvader360.scene2dtutorial.swiperace;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.scenes.scene2d.Actor;
public class EnemyCar extends Actor {
private Rectangle bounds = new Rectangle();
public EnemyCar(float x, float y) {
setWidth(160);
setHeight(85);
setPosition(x, y - getHeight() / 2);
int rnd = MathUtils.random(0, 3);
if (rnd == 0)
setColor(Color.RED);
if (rnd == 1)
setColor(Color.GREEN);
if (rnd == 2)
setColor(Color.WHITE);
if (rnd == 3)
setColor(Color.BLUE);
addAction(moveTo(-getWidth(), getY(), MathUtils.random(4.0f, 6.0f)));
}
@Override
public void act(float delta) {
super.act(delta);
updateBounds();
}
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
batch.setColor(getColor().r, getColor().g, getColor().b, getColor().a);
batch.draw(Assets.car, getX(), getY(), getWidth() / 2, getHeight() / 2,
getWidth(), getHeight(), 1, 1, getRotation());
}
private void updateBounds() {
bounds.set(getX(), getY(), getWidth(), getHeight());
}
public void crash(boolean front, boolean above) {
clearActions();
addAction(fadeOut(1f));
if (front && above)
addAction(sequence(
parallel(rotateBy(-360, 1.5f), moveBy(200, 200, 1.5f)),
removeActor()));
if (front && !above)
addAction(sequence(
parallel(rotateBy(360, 1.5f), moveBy(200, -200, 1.5f)),
removeActor()));
if (!front && above)
addAction(sequence(
parallel(rotateBy(360, 1.5f), moveBy(-200, 200, 1.5f)),
removeActor()));
if (!front && !above)
addAction(sequence(
parallel(rotateBy(-360, 1.5f), moveBy(-200, -200, 1.5f)),
removeActor()));
}
public Rectangle getBounds() {
return bounds;
}
}
</span><span style="font-family: arial;"><span style="font-size: 12px; line-height: 20px;">
</span></span></code></pre>
<br />
<br />
It's another extension of Actor, quelle surprise! As with the PlayerCar it has a bounding rectangle that can be used for collision checks. The constructor randomly assigns a colour (which the draw method respects), and an action is assigned that boils down to move from offcreen right to offscreen left and take between 4 and 6 seconds to do so.<br />
TrafficGame's collision detection code calls the public crash(bool,bool) method. The parameters tell the EnemyCar where the PlayerCar was in relation the EnemyCar at time of collision. If the EnemyCar was to the right and above the player car for example, spin the EnemyCar in a clockwise direction, move it to the right and upward, all the while fading out (draw method respects color which has an alpha element to it), and finally remove itself from the stage.<br />
<br />
And that's all there is to it. I'm far from an expert on any of this stuff, programming is not my day job, just a hobby, so don't take anything I write here as being <b><i>the</i></b> way of doing things. You can safely assume that it is certainly <b><i>a</i></b> way of doing things though, and it does work - <a href="https://play.google.com/store/apps/developer?id=TheInvader360">check out my games</a> if you want proof :)<br />
<br />
I really hope that someone out there finds this article helpful and informative. It's a lot more fun making games than writing about making games, but if this kind of thing is helpful then that gives me a warm fuzzy feeling inside too. If you would like to say thanks, please leave a comment here or on <a href="https://www.facebook.com/TheInvader360">facebook</a>/<a href="https://twitter.com/TheInvader360">twitter</a>/<a href="http://www.youtube.com/theinvader360">youtube</a>/wherever, or just <a href="https://play.google.com/store/apps/developer?id=TheInvader360">install my games</a> and have fun with them!<br />
<br /></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com33tag:blogger.com,1999:blog-8622129831031492300.post-40752090583942101232013-05-15T08:00:00.000-07:002013-05-16T01:48:41.838-07:004 Games 1 Screen - Musings on mobile game control<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free"><img border="0" height="195" src="http://3.bp.blogspot.com/-WrB_j5DtBH8/UZSTDxMmJZI/AAAAAAAAAG4/XDtOtvyA7O0/s400/feature.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
So often I hear that players hate onscreen controls on touch devices. No physical button means no tactile feedback to let you know you are 'touching but not pressing' a button. This fundamentally different interface means the traditional joystick / d-pad control scheme can no longer be the de facto standard for gaming controls across all platforms - replicating "up down left right a b start" on a phone or tablet is far from ideal (but an ouya or gamestick is another matter entirely ;)).<br />
<br />
In my latest game, <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">4 Games 1 Screen</a>, I try to make the most of a tricky situation. I've embraced the android mobile platform and the control options it offers. Our phones and tablets have accelerometers and touchscreens, the old nintendo and sega machines did not, it's time to think outside the box and make the most of these features.<br />
<br />
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">4 Games 1 Screen</a> is a challenging brain training game, the aim is to multitask by playing four games at one time, and avoid making too many mistakes. Make too many mistakes and it's game over. Each game is kept relatively simple for two reasons - first the game has to have a single objective and control method, second you have to be able to play four of these things at once so too much complexity would be too distracting for the player.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/P14qRhYv7j4?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
The mini games are:<br />
<br />
<ul style="text-align: left;">
<li><a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Asteroid Attack</a> - Tilt to steer your ship, asteroid collisions damage the shields, and when the shields are gone - gameover man, gameover!</li>
<li><a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Tap Jump Cowboy</a> - Classic infinite scroll platform game (like canabalt, and gemserk's excellent <a href="https://play.google.com/store/apps/details?id=com.gemserk.games.vampirerunner">vampire runner</a>) tap the screen to jump, save the cowboy from running into the campfires!</li>
<li><a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Speedy Sums Math Master</a> - Fully engage the left side of the brain, evaluate the math problem and mark it as correct or incorrect... You not only lose a life when you get it wrong, but also when you run out of time - so think fast!</li>
<li><a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">Street Race Swipe</a> - Swipe up or down to change lanes in this fast and furious racing game, avoid crashing into the other sports cars, too many bumps and your car will explode!</li>
</ul>
<br />
<br />
Each game can be played independently (full screen) in practice mode, but the real aim of the game is to play them all at once - the game is called "<a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">4 Games 1 Screen</a>" afterall :) I find it fun, addictive, frustrating and challenging. The frustration is what makes it so addictive haha, I see gameover and immediately try again to "do it right this time" :)<br />
<br />
No onscreen controls, and a game that would not really be possible on traditional gaming platforms, this is truly a mobile game designed for mobile devices. <a href="https://play.google.com/store/apps/details?id=com.theinvader360.braintraining.fourgamesonescreen.free">I hope you go on to check it out (<b>it's FREE, so why not!</b>)</a> and if you also like making your own mobile games that you might consider some of the thought behind the concept - don't lament the lack of physical controls, instead make the most of what <b><i>is</i> </b>available!<br />
<br />
<br />
<br />
Finally, does this mean that I won't ever release a mobile game with onscreen controls? No. Definitely not. A <a href="https://play.google.com/store/apps/developer?id=TheInvader360">future project</a> will be a traditional platformer, with android enabled consoles like the ouya and gamestick firmly in mind. I will no doubt make a mobile version of this game with onscreen controls (it would be silly not to). I'm not against onscreen controls, I'm against not thinking up interesting ways to make the most of what the mobile platform offers. I believe a platformer will only work well with traditional controls, but we don't always have to make traditional games :)<br />
<br />
<a href="https://play.google.com/store/apps/developer?id=TheInvader360">Happy gaming boys and girls!</a><br />
<div>
<br /></div>
</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-9651899385033541562013-04-11T11:46:00.000-07:002013-08-30T04:26:52.946-07:00Try before you buy (or in this case, try before you download for free!)<div dir="ltr" style="text-align: left;" trbidi="on">
How awesome is this!? You can now try playing <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack</a> in your browser :)<br />
<br />
The game plays a <b>lot</b> faster and smoother on a real android device (I think the slower your internet connection, the worse the appsurfer gadget performs), but I still thought this cool idea was worth sharing here.<br />
<br />
Something tells me I'll be using AppSurfer to help promote my next game, the fact that tilt is simulated is especially cool :)<br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
Preview sessions are limited to a maximum of 10 minutes before the virtual device is wiped, but that should be plenty of time to get a feel for the game, realise it's totes amazeballs, and <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">install for real to play properly on your phone or tablet</a>.<br />
<br />
I find the interactive app to be far more engaging than a <a href="http://www.youtube.com/watch?v=PU9gfStwT0I">preview video</a>, my only concern is that some players might be put off by the poor/choppy performance of the virtual device. I guess it should be used in conjunction with a <a href="http://www.youtube.com/watch?v=PU9gfStwT0I">youtube video</a>, and not as a replacement for one.<br />
<br />
It's no replacement for <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">downloading the real free game app</a> and playing it on your phone or tablet, but it's still a pretty cool toy to play with :D<br />
<br />
<script src="//www.appsurfer.com/appsurfer_widget_v1.js.js" type="text/javascript"></script><iframe allowtransparency="true" class="ASWFrame" frameborder="none" src="//www.appsurfer.com/widget/de87c8e0-8500-0130-2904-22000a8d8079?phone_align=left&protocol=%2F%2F&scroll=false&subdomain=www&tour=true&action=show&category_id=8-sports-games&controller=apps&id=24627-quack-attack-free-duck-hunt&utm_campaign=24627-quack-attack-free-duck-hunt&utm_medium=PublisherDashboard&utm_source=&referrer=" style="border: none; height: 620px; width: 620px;"></iframe></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-72092735961263066862013-03-10T06:34:00.001-07:002013-04-11T11:28:40.580-07:00Scene2D Investigation... Result: Quack Attack Free Duck Hunt Game!<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree"><img border="0" src="http://2.bp.blogspot.com/-zMfHnt-PNUs/UTyNXCKSGxI/AAAAAAAAAGQ/0n3vuuVKdyg/s1600/blog1.png" /></a></div>
<br />
I started looking into LibGDX Scene2D recently. No real reason, other than it looked like it could be something interesting to learn, so why not! :) Best way for me to learn is to just get stuck in, so I got to work on a <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Duck Hunt</a> tribute, and learned as I went along...<br />
<br />
It's clear that Scene2D UI is the way to go for menus and the like, so much cleaner than my past approach. Scene2D UI combined with table-layout makes setting up menus and HUDs a breeze. Even better, tweaking layouts becomes pain free, a real bonus! I'll certainly be using it again in future games.<br />
<br />
As for making use of Scene2D in the game itself (over and above the HUD), it was tricky to start with... All the tutorials I've read so far have advocated the MVC approach, and it seems that MVC is not really possible when using Scene2D (the model and view are tightly coupled). Still, I've not been doing this long enough to be stuck in my ways, so I figured I could just ignore some of what I'd learned in my earlier projects and just go with the Scene2D flow.<br />
<br />
I was surprised that there aren't more tutorials available on the subject to be honest, but I muddled through with various bits and pieces I could find. The most valuable resource when getting started was the LibGDX suite of tests, they are always a good starting point when looking at something new. The official wiki was helpful too. It's a bit presumptuous to think that I'm in a position to write tutorials on the subject (due to me being a newbie myself), but I think I'll post a few code snippets in the coming weeks to share some getting started tips, maybe even an open source step-by-step mini game "how to" if I have the time.<br />
<br />
I like how Scene2D lets you encapsulate Actor behaviour in its own act() method, it's pretty cool just instantiating an Actor and then just leaving it to its own devices. My first Scene2D game (<a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack</a>) has the game logic class spawn a Duck object at various intervals, the Duck class itself keeps track of how it should behave (overridden act() method sets various actions for the duck to perform dependent on its current state), and it also takes care of drawing itself via the overridden draw() method. It's really nice to be able to look at that single Duck class and immediately "get" exactly what a duck will do in the game, without having to look at various other classes. I guess this is one of the main Scene2D strengths, but on the flipside it's what makes MVC impossible...<br />
<br />
I'm sure the coupled view and controller will make things difficult on larger more complex games, but for simpler games I don't think it's a big problem. I guess if I were ever to try porting a Scene2D heavy game to a different platform it'd be a problem too, I am pretty sure porting <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame">Racing Game</a> or <a href="https://play.google.com/store/apps/details?id=com.theinvader360.monkeytouchdefense">Evil Monkey Touch Defense</a> or <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame">Zombie Game</a> to XNA would be pretty straightforward (if we ignore the tilt/touch control issue), but porting <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">Quack Attack</a> to a library without a similar scene graph implementation would not be so straightforward (would probably have to port the whole of Scene2D too!). Again I don't really care about that right now as I'm focusing on Android only, so I think it's quite likely that I'll be using in-game Scene2D in the future.<br />
<br />
I've just published my first Scene2D game on <a href="https://play.google.com/store/apps/developer?id=TheInvader360">Google Play</a>, it's totally free (ad supported), so feel free to install and check it out. If you like it, I always appreciate a nice rating/review :) Check it out here: <a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree">https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.theinvader360.duckhunt.quackattackfree"><img border="0" src="http://4.bp.blogspot.com/-z0KyGxylwCE/UTyNoLfx-hI/AAAAAAAAAGY/JLVcnSPWOrU/s1600/blog2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/PU9gfStwT0I?feature=player_embedded' frameborder='0'></iframe></div>
<br />
I think it turned out quite well, and am pleased with what was achieved in a relatively short amount of time. Keep an eye out for future blog posts featuring mini Scene2D tutorials if you're interested in that kind of thing :)<br />
<br />
Until next time - happy gaming, and happy game developing!<br />
<br />
<br />TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com1tag:blogger.com,1999:blog-8622129831031492300.post-79663816461427872582013-01-27T18:00:00.000-08:002013-03-21T06:46:51.218-07:00Monkey Magic!<span style="color: #990000;"><b>UPDATE - As a result of a request from Fox, this game has been removed from the <a href="https://play.google.com/store/apps/developer?id=TheInvader360">Google Play</a> market. I may create a new version at some point using all original graphics (i.e. not the Family Guy monkey), but in the meantime why not check out one of my <a href="https://play.google.com/store/apps/developer?id=TheInvader360">other games</a>?</b></span><br />
<br />
I released a new free game recently - Evil Monkey Touch Defence. You control a "good" Evil Monkey / King Kong type character, his job is to try and protect the tower from incoming missiles!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank"><img border="0" height="191" src="http://3.bp.blogspot.com/-OFNrRIZQ4Ks/UQaEHNsCUJI/AAAAAAAAAEc/g1OaD1c2H9c/s320/EMTD.jpg" width="320" /></a></div>
<br />
This was an experiment in creating the simplest possible control scheme for a casual game, while still making a game that's good fun to play. When you touch the screen the monkey starts dropping his aim, when you release the screen he fires. No buttons, no tilt, no nothing, just touch and release anywhere on the screen to control the game - it couldn't get any simpler! The longer you survive the faster the missiles get, and the more missiles you destroy the higher your score, simple and addictive fun...<br />
<br />
<a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">You can check out Evil Monkey Touch Defence here</a>. I'd love it if you would leave a nice rating or review if you like the game :)<br />
<br />
<br />
On the subject of free monkey based casual games for android... A friend of mine recently released his first game, you can <a href="https://play.google.com/store/apps/details?id=uk.me.diskthrasher.monkey" target="_blank">check out his Monkey Game here</a> - it's a fun casual physics game that uses <a href="http://box2d.org/" target="_blank">Box2D</a> behind the scenes. There's nothing in the least bit evil about this monkey, he just wants to eat his fruit (and not get eaten by a croc!)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=uk.me.diskthrasher.monkey" target="_blank"><img border="0" height="213" src="http://3.bp.blogspot.com/-SGII6_V_TmE/UQaEN_vvS6I/AAAAAAAAAEk/aoXV75w71EM/s320/MOAR.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-90741763593585536262012-12-17T08:00:00.000-08:002012-12-18T00:38:14.858-08:00Tower Defence - Slacker's Diary<br />
I've been slacking recently. Between work, Christmas preparations, and home improvements, there's not been a whole lot of time left over to work on Android games. Anyway, that's enough of the excuses, question is - what am I going to do about it?<br />
<br />
I've made a little progress on Tower Defence, but the plan is to put it on the back burner for now, keep working on it whenever I have a nice block of time to dedicate to it, but if I only have an hour or so available at a time to work on more trivial projects instead. I love the momentum that builds up when working on really small simple games, and I'm hoping to get a few of these little games started and finished in the next few months, and just keep chipping away at TD as a longer term project.<br />
<br />
Here's a video of the tower defence game as it stands:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/fQXVGnpIzzw?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Most of the basics are there really, but getting the game finished involves quite a few tasks, not all of them trivial - adding enemy waves, turret upgrades, multiple enemy types, multiple turret types, lots of level maps, level unlocking, graphical improvements, game balancing, etc. I <b><i>might</i></b> put an early unfinished version of the game up on the market at some point, maybe with rough graphics, just a handful of levels, and not the best balancing, but I worry that if I do that I might never finish the game properly!<br />
<br />
On a positive note, keep your eyes peeled for a new project starting soon! :)<br />
<br />TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-7703953587810805132012-11-20T22:00:00.000-08:002012-11-21T14:10:38.682-08:00Tower Defence - First Progress Report<br />
My last post was very wordy. This one should make up for that...<br />
<br />
Here's what I've got so far:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/qo4B-pi4Nn4?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
It's starting to look a little like a TD game :)<br />
<br />
Next up - I think it's time to get them turrets a'shootin!<br />
<br />
<br />TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-67495179589347538282012-11-13T21:00:00.000-08:002013-08-30T04:27:57.331-07:00Kicking off a new project - Tower Defence!<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
I've started working on a new game... Yayness!<br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
This game will be a little more involved than my previous offerings, and to get it right could easily take weeks or even months of spare time. That said it won't be super advanced in any way, the slow progress will have more to do with the fact that I'm an amateur developer learning as I go than anything else!<br />
<br />
The plan is to make a tower defence style game for android. I've got a few themes floating around my head at the moment (swords and sorcery, space sci-fi, WWII battlefield, cute zombies, scary zombies, etc) but to start with I'll just work with abstract shapes and get the mechanic up an running, theming can wait!<br />
<br />
So, what do I have in mind for this game?<br />
<br />
The world won't be confined to the screen, levels can be any size (within reason) and the player will be given the ability to pan around the world at will. I'm thinking swipes of the touchscreen to scroll around, and maybe even pinch/stretch gestures to zoom in and out.<br />
<br />
Levels will be tiled and read in from map files (nothing new here), and will be multi-layered (this is something new to me) allowing me to create a visual layer (grass, path, river, tree, base, etc), and an invisible layer (controller objects like enemy spawn points and directors that push the enemies along the path, etc).<br />
<br />
Levels will support multiple spawn points, some levels will have just the one spawner, others maybe three or four. So far I'm planning on protecting just a single base per level, but I guess I could handle multiple bases too. Spawn points will spit out enemies periodically, and each spawn point could have a different spawn rate, in fact the rate could potentially be modified mid-level, either at the end of each wave, or even during a wave.<br />
<br />
I think it would be cool to have different enemy classes with different strengths and weaknesses. Rather than having turrets that deal X amount of hp damage per hit to enemies, I think enemies having for example a strong fire defence and a weak ice defence and having fire/ice turrets would add a lot more depth to the game. A level could start out spewing fire elementals that a smart player would build ice turrets to deal with, and in a later wave turn the tables on the player by spouting ice elementals (meaning you'd want to replace your ice turrets with fire turrets). I could get particularly evil and have fire attacks restore the health of fire elemental enemies (a la final fantasy). There could even be mixed waves of various elementals spawned from the same point to really shake things up! I'll need to ensure as the complexity increases the game doesn't become more frustrating than fun - balancing the difficulty will be key. I'll just start with the basic X amount of hp damage per hit approach for the prototype, the added depth can wait, but I do think it would be cool to do eventually...<br />
<br />
I'm considering an experience based purchasing system, not just resource based. In game you'll receive bounty for killing enemies, this money can be spent on turrets (or wizards or tanks or whatever). Completing a wave or level could award you with XP, these points could be spent on weapon unlocks, allowing bigger and better attack units to be built next time you play (a nice side effect of this is that if you are a bit rubbish at the game you still get XP for the few waves you do complete, this allows you to use upgraded weapons next time you play, meaning you will eventually progress through the levels if you keep at it, natural difficulty smoothing sounds great and will make the game accessible to all types of player).<br />
<br />
A lot of developers allow the shortcut of in app purchases to prematurely unlock beefier weapons. I *might* consider going this route, but to be honest I think it would result in game-breaking builds so probably won't go for it, I'd rather make a free version available with a limited number of levels and a full version with extra content for £1 or something rather than use in app purchases. Often the in app purchases can feel like a bit of a swizz, you wonder if the developers artificially increase difficulty to force you down the purchase route etc, that's not really my style.<br />
<br />
I will want to go for an achievement based level rating I think. Maybe one star for surviving all the enemy waves in a level (next level unlocked), two stars for surviving all waves and base still at 50% or more hp, and three stars for a perfect game without any damage at all to the base. I'm a sucker for 100% completing games, and I know I'm not the only one. This approach would keep me coming back for more over and over again, but it also caters to the less OCD players out there that would be happy to survive a level and just progress on to the next.<br />
<br />
The players attack units will be upgradeable. I'm thinking increases in range, rate of fire, and damage would all be good. Maybe it would be fun to have a points based system where at upgrade level 1 you have 10 points that can be allocated to these three stats, at upgrade level 2 you have 15 points to allocate as you wish, etc. This sounds interesting, BUT I don't really want players bogged down in menus for most of the game, it should be a fast and furious frantic game experience, not a highly strategic puzzler. I think it would probably be better to go for a simple "upgrade adds 10% to all stats" approach to be honest.<br />
<br />
Finally, it seems most tower defence games choose from one of two pathing options for enemy AI, either waypoint based (enemies stay on the path) or algorithmic pathfinding (enemies follow the most efficient path, avoiding obstacles). The A* pathfinding approach looked a little daunting on first glance, but to be honest I don't think it would be impossible for me to implement. Having played my share of tower defence games though I must say I prefer playing the waypoint path based style, so that's what I'm going to be using in this game. I could always do an A* version in the future if I want :)<br />
<br />
I will be deviating from the standard waypoints approach in my game in one respect - instead of having a set path through a level from start to finish, I'll use director objects to add an element of randomness to the levels. When an enemy occupies the same space as a director, the director object will force the enemy to change direction. By weighting potential direction changes and making use of a random numbers I can set forks in the road that add an additional level of chance/strategy to the game. One fork might split enemies along two potential paths at a 50/50 split, another might have a 90% chance of sending the enemy left, and a 10% chance of sending the enemy right - the player might opt for less defences on the less traveled path, which seems sensible, but they'll have to react quickly if their luck is running low and a boss enemy ends up travelling along the poorly defended route! This should mean that repeated playthroughs aren't going to be too predicable.<br />
<br />
So that's it, that's the plan. There's a lot to do. So far my prototype consists of a single level map loaded in from file, rendered to screen (using horrific placeholder graphics), and consisting a single spawn point, a single base, and a number of director objects that push the enemies along the one and only possible path between spawnpoint and base. As for player experience, the keyboard controls allow the player to pan around the level and zoom in and out, and that's it. No turrets exist or can be placed, so all you can do is helplessly watch the enemy hordes destroy your precious base, and then on game over the level restarts, repeat ad infinitum in one endless nightmarish infinite loop. Plenty left to be getting on with then!!</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com1tag:blogger.com,1999:blog-8622129831031492300.post-29072086356898606552012-11-10T00:26:00.000-08:002012-11-10T00:32:27.598-08:00Enabling the "Move to SD card" option on your android apps<br />
Here's a quick and easy tip that your android app users will love, especially those with older/cheaper devices that don't have a huge amount of internal memory!<br />
<br />
Take your existing android application, and add <b>android:installLocation="auto"</b> to the <b>manifest</b> tag in <b>AndroidManifest.xml</b>.<br />
<br />
Example:<br />
<span style="font-family: Courier New, Courier, monospace;"><manifest xmlns:android="http://schemas.android.com/apk/res/android"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> package="com.mrdt.zombiesurvivalgame"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> android:versionCode="2"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> android:versionName="1.0.1"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> android:installLocation="auto"></span><br />
<br />
<br />
<ul>
<li>Setting installLocation to "auto" means the user can choose where to install the application.</li>
<li>Setting installLocation to "internalOnly" means the app will install on internal memory only (not ideal in most cases, especially if your app is quite big).</li>
<li>Setting installLocation to "preferExternal" means the app will automatically try to install itself of the SD card if it is present and is not full.</li>
</ul>
<br />
<br />
You'll also need to ensure that your build target (<b>targetSdkVersion</b> in <b>uses-sdk</b> tag in <b>AndroidManifest.xml</b>) is set to API Level 8 or greater.<br />
<br />
Example:<br />
<span style="font-family: Courier New, Courier, monospace;"><uses-sdk android:minSdkVersion="5" android:targetSdkVersion="15" /></span><br />
<br />
Save your updated AndroidManifest.xml file, rebuild your app, and deploy to a device or virtual device running Android 2.2 or above. Now if you open Settings > Applications, and select your app, you should be offered the option to "Move to SD card" :)<br />
<br />
I've just updated <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">my android games</a> to offer users this option, and it'll be something I'll be doing as standard in all my future apps. If you're an app developer you should consider doing the same... As a user I appreciate being given the option to choose where to install my apps - and I'm sure others do too!<br />
<br />
<br />TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-42517712149973124862012-10-27T09:00:00.000-07:002013-02-27T06:30:42.983-08:00Zombie Survival - now available free on google play!<br />
<span style="font-family: inherit;">The question was - Can I make a game in a weekend? The answer was no. Or yes. Or, well... maybe. Kinda. I don't know...</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Last Friday I started work on a totally new game - <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame" target="_blank">Zombie Survival</a>. By the end of the day Saturday, I did have a playable "game". Or more accurately I had a working game mechanic. There was a good guy, zombies, an objective, and it was fun to play, it even looked pretty good. I guess that could be called a game. Except, it can't. Not really.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame"><img border="0" height="240" src="http://1.bp.blogspot.com/-nkWBzwwMOK4/UIw5IVJnY0I/AAAAAAAAAEE/E1yU5vz6K34/s320/screenie.png" width="320" /></a></div>
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">A game is more than just the mechanic and the graphics. The mechanic is what really matters at the end of the day, but there's a lot of additional stuff that you have to pack into your game no matter how simple/casual the market - this stuff isn't really optional anymore.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">It took an additional four evenings and nearly a whole Saturday morning and early afternoon of effort before <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame" target="_blank">Zombie Game</a> was ready for the <a href="https://play.google.com/store/apps/developer?id=TheInvader360" target="_blank">marketplace</a>. In that time I added screens for highscores, help, gameover, paused, etc, saved/read settings and highscores to/from persistent memory, improved the look and feel throughout, implemented sound and music, did some refactoring (I'm learning as I go, so tend to clean up / rework as and when I have a lightbulb moment), playtested and tweaked difficulty to get things just right (the fine line between challenging and frustrating is where the fun is found!), carried out lots of testing on multiple devices, and did a little bug fixing.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">All in I reckon it took about 45-50 hours effort spread over 8 days to go from nothing to published, and I'm really pleased with that. But 48-ish hours effort is not the same as 48 hours elapsed time (lots of problems solved themselves in my head overnight, the </span>subconscious<span style="font-family: inherit;"> mind is a wonderful thing!), I guess Ludum Dare will have to wait.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">I'm sure my girlfriend will be glad to know that I'll be giving it a rest for at least a week or two now... A full time job plus putting in full time hours on an android game resulted in this being quite the antisocial week! </span><span style="font-family: inherit;">Anyway, the game is up on <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame" target="_blank">google play</a>, and it's a free download, so why not give it a go? Cute zombie fun just in time for halloween :)</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame"><img border="0" src="http://2.bp.blogspot.com/-B2ABgTlTKFw/UIw4p4EZwsI/AAAAAAAAAD8/fEeEIfXbEjE/s1600/qurified_message.png" /></a></div>
<br />
<div>
<br /></div>
<div>
<iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28959;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0088518;usg=AFHzDLsNHc5E_gwQxcrOmJV-qN1Nj6mKDA;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FElonex-ETouch-7-WiFi-Tablet-PC-4GB%25280088518%2529;pubid=589223;price=%C2%A359.99;title=Elonex+ETouch+7%22+Wi-Fi...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610961521974080.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7011099.2865;sz=180x150;ord=[timestamp]?;lid=41000613802382352;pid=2601;usg=AFHzDLsjj2bLn1MBbPDxZxes2Ft7AL94HQ;adurl=http%253A%252F%252Fwww.intotheblue.co.uk%252Fadventure-gifts%252Fuk%252Fpaintball%252Fzombie-day%252F;pubid=589223;price=%C2%A399.00;title=Zombie+Experience+Day;merc=Into+The+Blue;imgsrc=http%3A%2F%2Fwww.intotheblue.co.uk%2Fassets%2Fuploaded%2Fzombie90.jpg;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28963;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0098233;usg=AFHzDLsJliZ1y5THvBQ3fFTFemLAQFZNKQ;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FToys%252FAction-Figures-and-Playsets%252FCharacter-Building-Monsters-vs-Zombies-Crypt-of-Terror-Playset%25280098233%2529;pubid=589223;price=%C2%A319.98;title=Character+Building+Mon...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fhc9%2Fh06%2F8811182325790.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-50021675337961148772012-10-21T10:30:00.000-07:002013-08-30T04:28:42.022-07:00Making a game in a weekend… Can it be done?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="border: 0px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif; line-height: 22px;"><a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame"><b>UPDATE - Download the finished game for free here!</b></a></span><br />
<div style="line-height: 22px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div style="line-height: 22px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">I’d like to enter a Ludum Dare 48 hour competition one day, but I don’t think I’m ready yet. Create a finished game in a single weekend, sounds like a monster task!</span></div>
</div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">This weekend I decided to give it a test run, see how far I can get in a couple of days. The answer is – further than I’d have guessed! Here’s a runthrough of the process…</span><br />
<br />
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"></span><br />
<a name='more'></a><span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"> </span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Friday 6:30pm – 7pm:<br />
Created a very simple design document in notepad – very basic story, aim of the game, how game changes as you progress, target resolution (and strategy for dealing with other resolutions), art style, outline control scheme, technical considerations (z-ordering sprites, benchmarking), app flow detailing screen transitions, extra detail on gameplay, optional features to add if there’s time, and finally a plan of action (prototype game mechanic – is it fun? > add animation > add non game screens > polish graphics and sound > add extra features). It sounds like a lot, but we’re talking less than one sheet of A4 here, and less than 30 minutes time spent, I think it was well worth doing. I may have deviated from the plan a little (mostly thanks to playtest feedback from my girlfriend Sue), but having some concrete ideas written down that can be referred to when needed is definitely a good thing.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Friday 7pm – 9pm:<br />
Followed an <a href="http://theinvader360.blogspot.co.uk/2012/07/getting-started-with-libgdx.html">earlier blog post</a> I wrote to get a shell libgdx project setup. Created a character class, and child goodie and baddie classes that extend character. Drew a few random goodies and baddies to screen (red squares and blue squares).</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Friday 9pm – 11pm:<br />
After dinner, implemented player movement. This was fun as it was a new thing for me to learn – you set a target by touching the screen, and the player character makes a beeline for the target. I’ll share the code in a future blog post. Once player movement was sorted, did the same for the baddies. Then I replaced the hardcoded baddies with some code to automatically spawn baddies at regular intervals, lifted the aspect ratio handling from <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame" style="border: 0px; list-style: none; margin: 0px; outline: 0px; padding: 0px;" target="_blank" title="racing game">racing game</a> and dropped it into this project, and swapped the red and blue squares for a couple of static images that looked a little nicer. At this point it already looked like a game, played nicely on laptop at various resolutions, and looked good and performed great on my xperia go, xperia play, and Sue’s xperia mini pro.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Friday 11pm:<br />
It took four hours to go from nought to a prototype running on desktop and three phones. Awesome! A little playtesting and feedback gathering, and then put it to bed for the night.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 9am – 11am:<br />
Added some more baddie types (for visual variety only, they have no other differing properties, maybe they will do eventually though). Also worked out a way of making the characters face the direction they are targetting.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 11am – 1pm:<br />
Another new thing to learn – animating sprites! This was good fun, characters really come to life once the illusion of animation is added! Also played with texture filtering to get a nice smooth finish on non target resolution devices. I went for a costlier option in terms of processing, but will benchmark to see how it performs and scale it back if I have to.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 1pm – 3pm:<br />
Another new thing to learn – z ordering sprites for correct rendering to screen. This initially seemed to go well, sprites were drawn in the right order, but a bug was introduced that would only become apparent when benchmarking later in the day…</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 3pm – 5pm:<br />
After lunch I took a break from the game creation and started working on a nice logo (this game will eventually make it onto <a href="https://play.google.com/store/apps/developer?id=TheInvader360" style="border: 0px; list-style: none; margin: 0px; outline: 0px; padding: 0px;" target="_blank" title="Google Play">google play</a> so it’ll need one). I also lifted the timer from <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame" style="border: 0px; list-style: none; margin: 0px; outline: 0px; padding: 0px;" target="_blank" title="racing game">racing game</a> and dropped it into this project.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 5pm – 7pm:<br />
Improved the baddie spawning code, difficulty ramps up as you progress. Also added a functional placeholder hud displaying mostly debug info.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 7pm – 11pm:<br />
After dinner, the game screen was pretty much there, so it was time to benchmark. I upped the baddie spawn rate (x1000!) to see how it coped. The answer – not so well. My sprite z ordering code had a bug in it that caused the game to crash after a few seconds. When I scaled the spawn rate back down to normal, the game performed great and I couldn’t get it to crash until after the player would have realistically died. I guess I could have chickened out and left the bug unfixed, and if this was a real Ludum Dare 48 with a hard deadline that’s what I would have done, but it didn’t sit right with me, and since there was no hard deadline I reached from my trusty shotgun and went on a bug hunt!</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Saturday 11pm:<br />
The bug had me stumped for quite some time. I headed down some blind alleys, and made a bit of a mess. I learnt a new git command to force a hard reset back to a previous commit (git reset –hard <tag>), a handy command but not to be used lightly! And eventually stumbled across the solution (thank you internets!) My mistake was using comparable when I should have used <a href="http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/" style="border: 0px; list-style: none; margin: 0px; outline: 0px; padding: 0px;" target="_blank" title="comparator">comparator</a>. I guess someone with more programming experience would have realised this immediately. A rookie mistake – no doubt one of many to come! Anyway, problem eventually solved, so now I could try benchmarking again – increased the baddie spawn rate massively again (x1000) and left the game running, half an hour later no crashes, and fps remained 40+ no matter what. Excellent result! Tried this monster of a brute force test on the phones, and they all eventually slowed to a crawl then crashed, at such ridiculous spawn rates though, it was to be expected. Scaled back the spawning to a reasonable level and tested on the phones, perfectly reliable with no noticable slowdown not even after my player character should have been loooong dead. I do need to find an old low spec phone though, I’m hoping that this game will run on android 1.6 or above, and although I can pretty much ensure that it will <i><b>run</b></i> on 1.6 by using the emulator it would be nice to see how it <i><b>performs</b></i> on such a device.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">Sunday 10am:<br />
My plans are scuppered! My awesome understanding girlfriend was perfectly happy to humour me and not complain too much about me spending pretty much all my waking hours glued to the laptop and phones. However, today is another day, and real life beckons. I have to leave the house, go shopping, and visit family (don’t get me wrong that is never a chore!). Today I will post this blog post as a record of how my first 29 hours of a LD48-like challenge went, and maybe this evening I will get the opportunity to add some more features, but realistically I won’t end up with a finished product by 6pm. I do have something that is demonstrable and fun to play though, and I think quite often that’s as far as a lot of Ludum Dare entries get, the polish is added in the days and weeks that follow.</span></div>
<div style="border: 0px; line-height: 22px; list-style: none; margin-bottom: 18px; outline: 0px; padding: 0px;">
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;">It has been a fun experiment, and I’ll post an update once the game is finished and available to download from <a href="https://play.google.com/store/apps/details?id=com.mrdt.zombiesurvivalgame" style="border: 0px; list-style: none; margin: 0px; outline: 0px; padding: 0px;" target="_blank" title="Google Play">Google Play</a>!</span><br />
<span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br />
</span> <span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br />
</span> <span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28288;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0088517;usg=AFHzDLtMeuyjzJg3HXibHXT6Kd7HaxmeWg;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FElonex-ETouch-10-WiFi-Tablet-PC-4GB%25280088517%2529;pubid=589223;price=%C2%A399.98;title=Elonex+ETouch+10%22+Wi-F...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610971187305504.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28314;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0099150;usg=AFHzDLujrn1t2HubvzQUZjIHzxOqycxFdA;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FVideo-Games%252FBundles-and-Consoles%252FNintendo-3DS-XL-Console-BlueBlack%25280099150%2529;pubid=589223;price=%C2%A3174.88;title=Nintendo+3DS+XL+Consol...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fh0a%2Fh76%2F8809968107550.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28316;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0101106;usg=AFHzDLtYjsgAGm2JFnB29pDMUdxK-E3YEQ;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FVideo-Games%252FBundles-and-Consoles%252FWii-U-Nintendo-Land-Black-Console-Pack%25280101106%2529;pubid=589223;price=%C2%A3309.98;title=Wii+U+Nintendo+Land+Bl...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fh70%2Fh95%2F8812378980382.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe></span> <span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br />
</span> <span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br />
</span> <span style="background-color: white; font-family: Arial, Helvetica, sans-serif;"><br />
</span></div>
</div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0tag:blogger.com,1999:blog-8622129831031492300.post-63691872632278840862012-08-25T01:00:00.000-07:002013-03-22T12:31:21.637-07:00First 3D projectAs expected, I ended up starting a new project... It's quite a leap up from what was achieved in Race Game. <br />
<br />
Laptop video (shows 2D and 3D rendering plus raw map files):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/0Sj6Ja8Gn5A?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Android video (shows smooth 3D rendering on android device):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/HWtJoQ_48DI/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/HWtJoQ_48DI&fs=1&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="http://www.youtube.com/v/HWtJoQ_48DI&fs=1&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />
Next steps will include:<br />
<ul>
<li>Control scheme to suit android devices</li>
<li>Nice 3D models for keys, treasures, etc</li>
<li>Animated opening doors (quite how is a mystery!)</li>
<li>Cartoony / cutesy graphics and sound</li>
<li>Level select screen</li>
<li>Level complete screen</li>
<li>Game complete screen</li>
<li>Efficiency improvements</li>
<li>Lots more level maps</li>
</ul>
I think I'm going to drop the 'score' aspect, instead an achievement based level rating sounds good... Finish level for one star and ability to progress to next level, finish level having collected all treasure awards additional star, finish level in under X seconds awards additional star. Quite easy to progress through the levels, but replays required to get 100% perfect three star level rating.<br />
<br />
Interestingly, Race Game has a fair number of android 1.6 users. Considering how few 1.6 devices exist, it's clear that there are people out there with low spec devices that want to play casual fun games. With this in mind, I'm going to keep striving for as near global compatibility as possible.<br />
<br />
This game will be an arcade/maze/puzzler/adventure mashup. I'm going to leave out enemies, make it more about getting to the exit quickly, exploring, etc. This simplifies things for me, and should result in a game that appeals to quite a wide market.<br />
<br />
A separate game that introduces first person shooter elements (zombies, weapons, and a darker art style) could be built on top of this base later on.<br />
<br />
The code is freely available <a href="https://github.com/TheInvader360/arena-roamer.git">here</a>, and there's a demo up on <a href="https://play.google.com/store/apps/details?id=com.mrdt.arenaroamer">google play</a> - check it out!<br />
<br />
<br />
<iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28315;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0101921;usg=AFHzDLtZFan_pB4f8NDBnrZZQrqzLvB7gg;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FVideo-Games%252FBundles-and-Consoles%252FNintendo-3DS-XL-Blue-Skylanders-Giant-Starter-Pack%25280101921%2529;pubid=589223;price=%C2%A3224.99;title=Nintendo+3DS+XL+Blue+S...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fh51%2Fh1f%2F8813535592478.jpg%3Fmime;width=84;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28341;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0088517;usg=AFHzDLtMeuyjzJg3HXibHXT6Kd7HaxmeWg;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FElonex-ETouch-10-WiFi-Tablet-PC-4GB%25280088517%2529;pubid=589223;price=%C2%A399.98;title=Elonex+ETouch+10%22+Wi-F...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610971187305504.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28340;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0101120;usg=AFHzDLvohrizE9eNR-LtWPfGE6zdNNXfGA;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FLexibook-Junior-Tablet%25280101120%2529;pubid=589223;price=%C2%A3149.99;title=Lexibook+Junior+Tablet;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fhcc%2Fheb%2F8813103415326.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe>TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com5tag:blogger.com,1999:blog-8622129831031492300.post-62188374325337990762012-08-12T18:30:00.000-07:002013-08-30T04:29:40.175-07:00Racing Game - Powering on ahead!<div dir="ltr" style="text-align: left;" trbidi="on">
I've neglected the blog for a few days, spent my time working on the app rather than writing about it. As a result, quite a lot of progress has been made in the past few days :)<br />
<br />
Here's a video of the app as it currently stands:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/z8N54b5pLEk?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
<a name='more'></a><br />
Here's what I've achieved over the weekend:
<br />
<ul>
<li>Car can no longer leave level bounds</li>
<li>Acceleration and deceleration greatly improved</li>
<li>4:3 aspect ratio enforced on all devices</li>
<li>Improved graphics</li>
<li>Improved icons</li>
<li>Haptic feedback (vibrate when offroad)</li>
<li>Results screen implemented</li>
<li>Best time screen implemented</li>
<li>Added help/about placeholder screens</li>
<li>A couple of minor bugfixes</li>
</ul>
If you would like to see how the above was achieved, the best thing would be to check out the code on <a href="https://github.com/TheInvader360/race-game">github</a>. In brief:
<br />
<ul>
<li>Fixed aspect ratio was achieved by simply applying what is discussed <a href="http://www.java-gaming.org/index.php?topic=25685.new">here</a>.</li>
<li>The additional screens were essentially copy and paste jobs of the pre-existing MenuScreen class, followed by a little tinkering.</li>
<li>Opengameart.org and Clker.com are great sources of royalty free art for the artistically impaired.</li>
</ul>
If you'd like to try the (still unfinished) game - have a look <a href="https://play.google.com/store/apps/developer?id=TheInvader360">here</a> :)
<iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28342;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0088517;usg=AFHzDLtMeuyjzJg3HXibHXT6Kd7HaxmeWg;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FElonex-ETouch-10-WiFi-Tablet-PC-4GB%25280088517%2529;pubid=589223;price=%C2%A399.98;title=Elonex+ETouch+10%22+Wi-F...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610971187305504.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28365;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0101120;usg=AFHzDLvohrizE9eNR-LtWPfGE6zdNNXfGA;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FLexibook-Junior-Tablet%25280101120%2529;pubid=589223;price=%C2%A3149.99;title=Lexibook+Junior+Tablet;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fhcc%2Fheb%2F8813103415326.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28367;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0098531;usg=AFHzDLtRvY6PEociln4W-YMOV54ez_C07w;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FKurio-7-Personal-Tablet%25280098531%2529;pubid=589223;price=%C2%A3149.99;title=Kurio+7%22+Personal+Tablet;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fhc7%2Fh01%2F8796107931678.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com4tag:blogger.com,1999:blog-8622129831031492300.post-3614047110861440682012-08-08T19:30:00.000-07:002013-04-28T01:11:16.227-07:00Racing Game - limiting scope, wishlist culling, and task prioritisation (or, The battle against hobbyist A.D.D.)<div dir="ltr" style="text-align: left;" trbidi="on">
I have a horrible habit of starting a project, having great fun with it, then either losing interest, or heading off in a different direction to what was originally planned, unnecessarily complicating things, and giving up. End result is an unfinished project kicked to the kerb and a new one started. Repeat ad infinitum. It's like hobby ADD. I have so many started but unfinished projects it's not even funny. I know I'm not the only one!<br />
<br />
This time it'll be different I said. This time I'll see it through til the end... But I so want to start a new project. I want to make a start on a platform game, Super Mario 3 on the NES is still one of the best games <em><strong>ever</strong></em> in my opinion, I want to make something similar. I want to create an arcade blaster, I loved <a href="http://www.youtube.com/watch?v=Yx9GCk99NZo">Spy Hunter</a> as a kid, I want to remake it for android, maybe 2D gameplay with 3D graphics. I want to create a basic 3D engine, maybe start with a first person perspective maze game, and extend to create a first person shooter, or a first/third person driving sim. I have lots of ideas, and I want to start on them all at once. So much ambition, so little attention span...<br />
<br />
I'm pleased that I got further than usual this time - I've actually published an early alpha of Race Game on <a href="https://play.google.com/store/apps/details?id=com.mrdt.racegame">Google Play</a>. I think it's in no small part due to me publishing this worklog and publicly sharing the code on <a href="https://github.com/TheInvader360/race-game">github</a>, there may not be that many visitors (yet?), but I still have a funny feeling of responsibility to get something finished. What's currently on Google Play is very much unfinished, so I'm definitely not off the hook yet (I won't be until I hit v1.0 at least), but it still feels like a mini victory over my hobby ADD :)<br />
<br />
I've been reviewing the ideas/todo list and have decided to be pretty ruthless in terms of what stays and what goes. What's staying has been split into 'must haves' and 'would likes', and each list has then been prioritised.<br />
<br />
I think it's fair to say that until all the 'musts' have been tackled the game is essentially broken, pretty good definition of must have really... Once all the 'musts' have been taken care of, I can package the app up as v1.0, update on Google Play, and go on to start a new project with a clear conscience.<br />
<br />
The 'would like' items can be deferred to a later update. None are crucial to the functioning of the game. Only reason facebook bragging is at the top of the list is because it interests me personally, I think it would be a cool feature to re-use in future games (players post achievements to their wall, friends download the app to compete... a kind of viral promotional platform). Variable difficulty should be easy enough to implement, good bang for buck ratio (players could choose a quick course to kill 30 seconds, or a longer course when they're feeling a bit more hardcore etc, tailor game to the player for relatively small effort on my part), might as well get it done. The rest of the list are items that simply add a little polish to the game. I like to keep reminding myself that atari/spectrum games were ugly as sin but good fun, so I'm not too worried about this stuff really (just as well, I'm no artist!). Learning a little about animation and intro/outro scenes would help me when working on future projects, so I might have a little poke around in those areas, but we'll see.<br />
<br />
The 'dropped' items won't be implemented in this project. I would like this project to remain simple and easy to read when finished. I know it'll help me if I ever need to quickly check back to see how I solved a particular problem in the past, maybe it'll help others too. The simpler and clearer the better, so I don't want to pollute it with too many extra features and it ending up a confused mess. There's nothing to stop me (or someone else) coming back and making Race Game Deluxe in the future, but it will be a seperate project, this particular project won't live forever, it will serve its purpose and then development will stop.<br />
<br />
So, it looks like I have a plan. Great. As an added bonus, that 'must' list looks quite small and manageable, which is nice. I'm quite confident that I'll be able to get a modest v1.0 published on Google Play soon, and only then start tinkering with 3D mazes and tiled maps and other cool stuff... I guess the question of if/when v1.1 will see the light of day depends on how interesting the next project is, but I'm determined to get v1.0 out there pre-September (I got this far in 10 days of spare time so that should be a very achievable goal)!<br />
<br />
<br />
<iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28394;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0088517;usg=AFHzDLtMeuyjzJg3HXibHXT6Kd7HaxmeWg;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FTechnology-and-Gadgets%252FTablet-PCs%252FElonex-ETouch-10-WiFi-Tablet-PC-4GB%25280088517%2529;pubid=589223;price=%C2%A399.98;title=Elonex+ETouch+10%22+Wi-F...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610971187305504.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28392;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0101106;usg=AFHzDLtYjsgAGm2JFnB29pDMUdxK-E3YEQ;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FVideo-Games%252FBundles-and-Consoles%252FWii-U-Nintendo-Land-Black-Console-Pack%25280101106%2529;pubid=589223;price=%C2%A3309.98;title=Wii+U+Nintendo+Land+Bl...;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2Fh70%2Fh95%2F8812378980382.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe> <iframe bordercolor="#000000" frameborder="0" height="150" hspace="0" marginheight="0" marginwidth="0" scrolling="no" src="http://ad.doubleclick.net/adi/N7433.148119.BLOGGEREN/B7087540.28419;sz=180x150;ord=[timestamp]?;lid=41000613802377479;pid=0089497;usg=AFHzDLtQq3nn3va-_4uAmW-lk4SRvoPiQQ;adurl=http%253A%252F%252Fwww.toysrus.co.uk%252FToys-R-Us%252FVideo-Games%252FBundles-and-Consoles%252FPS-Vita-Console-WiFi%25280089497%2529;pubid=589223;price=%C2%A3219.88;title=PS+Vita+Console+Wi-Fi;merc=toysrus.co.uk;imgsrc=http%3A%2F%2Fwww.toysrus.co.uk%2Fmedias%2Fsys_master%2F8610884082955456.jpg%3Fmime;width=85;height=85" vspace="0" width="180"></iframe></div>
TheInvader360http://www.blogger.com/profile/07852741032840399885noreply@blogger.com0