{"author_name":"jcmoyer","cat":"LD #32","comments":[],"epoch":1429732620,"likes":2,"metadata":{"p_key":"17803","p_author":"jcmoyer","p_authorkey":"18573","p_urlkey":"53109","p_title":"Rocket Rabbit: The Post Mortem","p_cat":"LD #32","p_event":"LD32","p_time":"1429732620","p_likes":"2","p_comments":"0","p_status":"UPD5","us_key":"18573","us_name":"jcmoyer","us_username":"jcmoyer","event_start":"1429228800","event_key":"27","event_name":"LD32"},"text":"<p>Going into Ludum Dare, I knew I wanted to make a shmup. I needed to come up with an unconventional weapon, though. I decided on carrots, and what better protagonist to have than a rabbit that shoots carrots? Initially with the theme I thought I&#8217;d make a light-hearted game with bright colors and a ridiculous setting a la <a href=\"http:\/\/en.wikipedia.org\/wiki\/Parodius_%28series%29\" target=\"_blank\">Parodius<\/a>, but&#8230;<\/p>\n <div style=\"width: 410px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/ludumdare.com\/compo\/wp-content\/compo2\/\/444368\/18573-shot0-1429496620.gif-eq-900-500.jpg\"><img class=\"\" src=\"http:\/\/ludumdare.com\/compo\/wp-content\/compo2\/\/444368\/18573-shot0-1429496620.gif-eq-900-500.jpg\" alt=\"\" width=\"400\" height=\"400\" \/><\/a><p class=\"wp-caption-text\">Rocket Rabbit<\/p><\/div>\n <p>I worked on the game a bit and got bullets and enemies in. After that, I composed a lighthearted track for the first stage then started working on boss music. The boss music came out super tense and action-y. It conflicted with the stage 1 track, and I liked it a lot more. This was Saturday evening mind you; I didn&#8217;t really have time to produce any more music, so I said screw it, the game is going to be more serious. I scrapped the first track and started building the game around the boss music.<\/p>\n <p>Then came the assets to replace my placeholder art. I turned on the boss music and just did this stream of consciousness sort of thing, drawing whatever came to mind. &#8220;This is tense; let&#8217;s add some blades,&#8221; and everything went downhill from there. Suddenly everything was made of metal and it was going to be hardcore.<\/p>\n <p>&nbsp;<\/p>\n <div id=\"attachment_461032\" style=\"width: 466px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/blade4x2.png\"><img class=\"wp-image-461032 size-full\" src=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/blade4x2.png\" alt=\"blade4x2\" width=\"456\" height=\"248\" srcset=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/blade4x2-300x163.png 300w, http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/blade4x2.png 456w\" sizes=\"(max-width: 456px) 100vw, 456px\" \/><\/a><p class=\"wp-caption-text\">The Blade, a whirling, fast enemy that charges straight at the player while firing barrages of bullets. I really hated this guy during playtesting.<\/p><\/div>\n <p>&nbsp;<\/p>\n <p>I&#8217;m a programmer, not an artist. It takes a long time for me to make one asset. This was my first time manually rotating a fairly complicated sprite. This guy took at least an hour to finish, which is a ridiculously massive timesink in the grand scheme of things. Looking back, some of the shading is messed up, mainly around the center disc.<\/p>\n <p>&nbsp;<\/p>\n <div id=\"attachment_461034\" style=\"width: 266px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/player4x.png\"><img class=\"wp-image-461034 size-full\" src=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/player4x.png\" alt=\"player4x\" width=\"256\" height=\"256\" srcset=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/player4x-150x150.png 150w, http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2015\/04\/player4x.png 256w\" sizes=\"(max-width: 256px) 100vw, 256px\" \/><\/a><p class=\"wp-caption-text\">That rabbit is wearing goggles and a scarf. You know he means business.<\/p><\/div>\n <p>&nbsp;<\/p>\n <p>I had an awful time just getting the player sprite to look passable, as you can see in the <a href=\"https:\/\/youtu.be\/GHov64jD0Ug?t=4m00s\" target=\"_blank\">timelapse around ~4:00<\/a>. Getting the illusion of depth was hard and lots of dithering conflicted with the style of the rest of the game. Eventually I opted to just layer sheets of hard-edged metal on top of each other and it seemed to work OK.<\/p>\n <h1><\/h1>\n <p>&nbsp;<\/p>\n <h1>The Bad<\/h1>\n <p>&nbsp;<\/p>\n <p>The thing that hits me *every* LD is that I haven&#8217;t allocated my time as best as I could. 48 hours is a REALLY strict time limit. You really need to know which corners you can cut and which ones you can&#8217;t. Polish is extremely important, and you need to leave time for it!<\/p>\n <p>The number one complaint I got is that there is no visible feedback for hitting enemies with &gt;1 HP. This would have been a nice addition, but I was so caught up implementing core functionality that I didn&#8217;t even have time think of it.<\/p>\n <p>Among other things I thought of that I wish I could have implemented:<\/p>\n <ul>\n <li>A longer stage 1<\/li>\n <li>A second stage (!! getting ambitious there)<\/li>\n <li>HP bar for bosses. I actually thought of this towards the end, but there was an hour left and I needed to leave time to implement a quick menu screen and game over screen and to package up the game. I didn&#8217;t know there was a submission hour, so maybe I could have done this.<\/li>\n <li>More detailed border during gameplay. Given how long it takes me to do things art-related, this was out of the question.<\/li>\n <li>Disappearing carrots from the player&#8217;s ship<\/li>\n <\/ul>\n <h1><\/h1>\n <p>&nbsp;<\/p>\n <h1>The Good<\/h1>\n <p>&nbsp;<\/p>\n <ul>\n <li>Art skill leveled up! It was my first time doing somewhat detailed animations for LD. It was also the first time that I worked with higher resolution art (typically I stick to 8&#215;8, 16&#215;16, or 32&#215;32).<\/li>\n <li>Music skill leveled up! It was my first time producing music for LD.<\/li>\n <li>Got a shmup under my belt, a genre which I&#8217;ve appreciated for a long time but never seriously attempted to make.<\/li>\n <\/ul>\n <p>I&#8217;m actually really happy with how my entry turned out this time given the time restraints. Some of the code is a bit spaghettified because I needed to add things NOW instead of properly, but it&#8217;s nothing that can&#8217;t be fixed up. The main thing to remember is that the end user doesn&#8217;t care what your code looks like!<\/p>\n <p>Amazingly enough, there were no massive bugs in the Ludum Dare version and everyone I&#8217;ve talked to has been able to play the game just fine. There&#8217;s only one thing I&#8217;ve noticed that is totally off, but you wouldn&#8217;t ever know unless you looked carefully: during gameplay, the starfield background is supposed to be purplish, not black. I thought I had made it purple but I never really checked&#8230; It was a really subtle problem with the code too:<\/p>\n <pre>love.graphics.rectangle('fill', 0, 0, unpack(self.bounds))\n -- which essentially evaluates to love.graphics.rectangle('fill', 0, 0, 0, 0, 600, 700)\n -- the last two arguments are discarded since this function expects mode, x, y, w, h\n -- should have been\n love.graphics.rectangle('fill', unpack(self.bounds))<\/pre>\n <h1><\/h1>\n <p>&nbsp;<\/p>\n <h1>Addendum: Funny Programmer Stuff<\/h1>\n <p>&nbsp;<\/p>\n <p>So alongside my Ludum Dare games I&#8217;ve been working on this library meant to complement love2d aptly name <a href=\"https:\/\/github.com\/jcmoyer\/hug\" target=\"_blank\">hug<\/a>. There was one thing I was missing from it in my previous LDs that I dreaded reimplementing: animation. I knew I&#8217;d need animation for a shmup. During the week prior to LD, I drafted an animation API and put it in a separate branch on github. There are a few key concepts for the API, but the important two are frames and animations (a sequence of frames). A frame has a rectangle that specifies what part of an image it uses, a duration, and a list of attachment points. Imagine being able to say &#8220;here&#8217;s the point for the left hand on this knight guy, put a sword in his hand.&#8221; With attachments, this would be easy. You just get the attachment named &#8220;left-hand&#8221; and render the sword there.<\/p>\n <p>As it turns out I didn&#8217;t need attachments for Rocket Rabbit (although, if I had more time I probably would have designed enemies that shot from points other than their center &#8211; attachments would work great there). What I DID need was a way to store arbitrary data per frame: specifically, the radius of a bullet, enemy, or player. &#8220;I don&#8217;t have time to add this to hug right now, it will take too much planning&#8221; I said, so in my moment of brilliance I ended up storing collision radius in the X component of an attachment named &#8220;radius.&#8221; Yuck. Problem solved, though.<\/p>\n <h1><\/h1>\n <p>&nbsp;<\/p>\n <h1>Links<\/h1>\n <p>&nbsp;<\/p>\n <p>I&#8217;d appreciate it if you&#8217;d try out my game and throw me a comment. Anything that helps me improve the quality of my games!<\/p>\n <p><a href=\"http:\/\/ludumdare.com\/compo\/ludum-dare-32\/?action=preview&amp;uid=18573\" target=\"_blank\">Entry page<\/a><br \/>\n <a href=\"https:\/\/youtu.be\/GHov64jD0Ug\" target=\"_blank\">Timelapse<\/a><\/p>\n \n <p>Tags: <a href=\"http:\/\/ludumdare.com\/compo\/tag\/bullet-hell\/\" rel=\"tag\">bullet hell<\/a>, <a href=\"http:\/\/ludumdare.com\/compo\/tag\/rabbit\/\" rel=\"tag\">rabbit<\/a>, <a href=\"http:\/\/ludumdare.com\/compo\/tag\/rocket\/\" rel=\"tag\">rocket<\/a>, <a href=\"http:\/\/ludumdare.com\/compo\/tag\/rocket-rabbit\/\" rel=\"tag\">rocket rabbit<\/a>, <a href=\"http:\/\/ludumdare.com\/compo\/tag\/shmup\/\" rel=\"tag\">shmup<\/a><\/p>","time":"April 22nd, 2015 2:57 pm","title":"Rocket Rabbit: The Post Mortem"}