About Me

I make stuff, because I go crazy if I don’t, and I do my best to make cool stuff, for the same reason.

MediaPlayer Framework 1

I’ve been working with the MediaPlayer framework for the last couple of years, bumping my shins into its rough corners early and often. I file radars for what I find, but it always feels like shouting into the void, so I figured I might as well double-dip and write stuff over here, too!

On today’s exciting episode: the delightful setQueueWithItemCollection: method, and how it does something I really didn’t expect.

To make your iOS device play a song in its music library, an MPMusicPlayerController needs to be given some songs. There’re a few different ways to do this, but the one I just mentioned is our huckleberry for today. That method accepts an MPMediaItemCollection, which is - for our purposes - basically just an array of MPMediaItem objects.

In Myoosic, I even (basically) do this:

- (void)setQueue:(NSArray <MPMediaItem*>*)items {
    MPMediaItemCollection* c = [MPMediaItemCollection collectionWithItems:items];

    [self.player setQueueWithItemCollection:c];
}

Here’s the bit that tripped me up today: what happens if that array is empty? After all, my setQueue: method just takes an array - that array could very well be empty.

Well, what happens is hilarious and not at all what I expected: calling setQueueWithItemCollection: with an empty collection will queue every song available in your library!

I don’t know if this is what you’d expect, but it certainly tripped me up. It’s easy enough to guard against an empty items array, but it seems strange that I’d need to.

XCBarnacle

I’ve had an itch for awhile to write a little helper tool for managing which Xcode is currently, well, selected. It seemed like a good idea, even before I’d been bit a few times by an annoying bug involving bad environment state, but felt pretty obligatory once a dev friend of mine started yelling at me with similar complaints.

So, naturally, I decided to build one. I’m mostly pretty happy with it, it’s already saved my bacon a few times, and it’s free. I’m not sure I could pass app store review, and I don’t even know that I want to bother, so for now, it’s hosted here, on itch.io:

XCBarnacle

Octopath Traveler 1

One of my favorite silliest parts of this game revolves around Olberic, a brave knight. Each playable character has their own way of interacting with the world around them. The nice priest lady can guide people through life, the trader can buy stuff off of people, and the knight -

Well. The knight can walk up to random fools, challenge them to a duel, and beat the everloving shit out of them.

It’s maybe one of my favorite mechanics in this game, particularly with how I’ve got him configured. You can mix and match what subclasses characters get, and I’ve thrown Thief at him.

Thief is a little broken in single-target. You can steal health and energy, which is already broken, but you do it with this fast little double-jab.

The bravest knight in the land is running around, challenging people to duels, then running up and stabbing them repeatedly.

I don’t think this is a great game, but I’m having a lot of fun playing it for silly shit like this.

Also, the music is really pretty great!

The World is Alive - Summer Slow Jam

This isn’t exactly a postmortem, because most jam games feel kind of unfinished. (At least, mine usually feel that way to me.)

So when this jam was first announced back in early June, I got pretty stoked. The technical theme - I tend to do better at those - was Minigames, which seemed great! My mind jumped first to the kind of dinky little silly-ass Warioware games, with just ridiculous hooks and gimmicks and 4 or 5 seconds of gameplay per screen.

Which is why I got to work on all of that, basically. I got a whole system up and running where I could flip between a bunch of these minigames at random, got basically done with a high score logging webservice (that I honestly thought would be cool if everyone could register/post to), then had a week or two off before the creative theme was announced.

Once the theme (The World is Alive) was announced, I pretty much ignored everything I’d built so far.

I mean, sure, I could’ve shoehorned it into what I’d built, but it didn’t seem right, and I’m not sure I can articulate why. Doing something more specific seemed like a good idea, and I had a handful of things I wanted to try.

I always manage to get to games late, and I’d just picked up Hollow Knight, so doing something a little bit spookier and more atmospheric sounded like a fun idea. Unfortunately, this inspiration didn’t really strike me upside the head until, oh, Monday or Tuesday, so losing that first weekend’s worth of progress was kind of a bummer.

That said, I’m still pretty happy with how things turned out. I dragged over a lot of the stuff from Slower than Light, like the lighting and the little hover/highlight text, but ended up with something (I hope) that makes a little bit more sense. It’s a pretty straightforward little mini-metroidvania, minus the combat, which - if I had another couple of weeks - I might almost consider adding.

It’s a little tough to know what to do with it. Fighting and combat and conflict are pretty common in games, but this feels more like a mellow thing. There’s no real way to die in it, which I like, but there’s also not much in the way of real challenge. Navigating the world is pretty straightforward, so that’s probably the first place I’d look.

The story, such as it is, is a little thin on the ground, too. If I was gonna keep going, I’d try to refine the hell out of that, since I think there’s a lot of redundancy and what is there isn’t necessarily very clear. It’s fine if things aren’t obvious at first glance, but I’m not sure that players would come up with the conclusions I’d intend. (Sometimes that’s okay, and sometimes it’s just bad/sloppy writing.)

Overall, I’m still pretty happy with it. It’s fun tinkering, and I still really like making gloomy little games.

Summer Slow Jam 2018 Prep

I’ve been doing the occasional game jam for awhile now. They’re fun! It’s nice to throw yourself at something for a short amount of time just to see if anything good comes of it - more often than not, it’s totally worth the minor time investment. One thing that’s been a little annoying, though, comes down to infrastructure.

There’s a few different types of infrastructure, too, and maybe that’s a weird way to put it, but it’s the term I’m gonna use, so whatever! The tools, code, art, assets you’ve built up over time all count as infrastructure, but what I mean here is a literal kind of infrastructure.

I’m going to back up just a little. Eight years ago, Apple released Game Center, an iOS and MacOS service for high scores, matchmaking, online social stuff, the works. It was exclusive to those two platforms and better than nothing, but had some warts and rough edges. It also had a ton of green felt, which wasn’t great.

(As an aside, and particularly with Apple, be careful about using their technologies and frameworks if they’re not dogfooding it themselves. How many games do they ship? Zero? Yikes.)

Back to infrastructure, though: Game Center was good enough for leaderboards, even if there were authentication challenges around valid high scores. Trolling online scoreboards is a tough problem to solve at scale, but that’s not the point of this!

No, the point of this is that, for the Pigsquad Summer Slow Jams, I’m finally getting around to building my own online infrastructure.

Hold for applause.

It’s actually been kind of fun and interesting getting back into the online/server-y world. I’m picking up Rails again for some dumb friggin’ reason. It’s stuff I know sorta well, including all the warts, and the landscape has changed an awful lot since I stopped actively working with it ~7 years ago. I mean, shit, Docker didn’t exist back then, mongrel was still the hottest shit (thanks, Zed Shaw!) and nobody was really grown up enough to know what they were doing.

It was total cowboy country, but it was kind of fun, in a way.

Thankfully, the scope is pretty limited here. I figured, with the first technical theme being ‘minigames’, an arcade-y cabinet with a handful of Warioware-style games that can post scores to a web service would be pretty cool for seeing who does best. And if I get this thing working and chugging well enough, who’s to say I wouldn’t ask other people to try banging on it, too?

Infrastructure is fun.

On That MacBook Pro Keyboard

Don’t buy the MacBook Pros even on sale, in my opinion | The Outline

So, that doesn’t seem great, does it? I really, really want to like that keyboard, I promise. I like the clicky feel of it, short-throw keys are my jam, I could even get used to the narrower gaps between keys.

(Don’t get me started on the inverted-T.)

But the reliability issues are maddening - key’s that would double fire, or not fire at all, or only fire at a particular angle or from a particular spot. C’mon, that’s no way for a computer to be.

So, like Casey Johnston, I sold my 2016 MacBook Pro and threw that money at an iMac Pro. So far? It’s completely knocking my socks off.

Breath of the Wild, Escalation, and You

I’m going to start this tiny bit of controversy with a warning: don’t @ me. You know what that means, so don’t. I liked the game just fine, don’t hassle me about any of this. Your efforts are better spent elsewhere.

Okay. So. Breath of the Wild was pretty great. I’ve put hundreds of hours into it and I’m still finding new stuff in it - little groves of trees, koroks (naturally), characters just hiding out in the middle of friggin’ nowhere.

It’s big, and it’s mellow, and it’s a world that I find fascinating.

My problem, if that’s even the right word for it, is this: artificial escalation.

Remember Oblivion? Put enough hours into it and you start seeing doofy little bandits wearing full Daedric or Glass armor. Immersion shattered, dogs and cats living together, mass hysteria.

Zelda’s got that same problem, kind of. At the start of the game, you’ve got rusty swords and junky wooden shields and your armor’s tattered rags that you found on the floor. You’re fighting dinky little red Bokoblins with a few blues thrown in, and maybe you’ve bumped into a Lynel or a Talus and had a really bad time. A couple hours in and you’ve got shiny knight armor or a stealth suit (A SHEIKAH SLATE?!) and you’re off to the figurative races, with decent weapons and a better understanding of how to make people sad with them. You see black Bokoblins and maybe even a silver one, which is great because those drop gems.

Fine! That’s how videogames work! As you play more and more, new, cooler stuff shows up. Lightning swords and royal halberds and - wait a second, didn’t this world get totally thrashed? Where’s all this great gear coming from, anyway?

That’s my problem: the escalation scale’s all kooky.

I don’t even know if it makes sense or if these are just the ramblings of a madman (pro-tip: they are) but if the game’s ever moddable, I’d love to see a fairly simple edit. Raise the ceiling, sure, but keep the frequencies skewed towards the low-end. You’re still mostly fighting dumb little guys with dumb little weapons, but every once in awhile you’re going to find something truly exciting and rare, something that you’ll want to save for a really big, scary, dangerous encounter, rather than just going “oh, which Royal Sword do I want to ditch now?”

It’s a little numbing, at the end of the day: there are no highs or lows at that point, and there’s no feeling of desperation there, either. I played it through on Normal, restarted on Master, then noticed just how weak, frail, and flimsy I felt for the first few hours. It was the most exciting part of that playthrough, knowing that I had to be careful and strategic and couldn’t just headbutt my way through every problem I got myself into.

Maybe they’ll do that in the sequel. Or not! I’m fine either way. I’m certainly not foolish enough to expect them to add any kind of hunger/weakness system to the game. That’d be a bridge way, way too far.

Not Reviews

I’ve been thinking about writing on here more, which is a thing I think about often and then never actually do anything about.

Oops.

The fact that it’s an ongoing concern is a more interesting part, and maybe the whys behind that, too. It’s neat looking back at the nonsense, and knowing I have basically zero audience means that I’m doing it just for me, which is kind of great from an intrinsic motivational perspective.

But that’s all really just noodling and waffling. One thing I’m realizing is that I don’t know why I have this site anymore - it doesn’t really have a purpose, partly because it was never very well defined, and partly because any purpose it may have had has long since evaporated thanks to lack of use. Neglect is freeing, though, because at this point I can do whatever the hell I want with it.

So one of the things I’m going to start doing, I think, are little mini-reviews: things that are too long for a tweet, because those stupid 12/42 tweet lists are a little nuts, and because I might as well try to write more. Reviews are a little bonkers, so this’ll is more like blathering and rambling.

The Smallest Unit of Music

I’m a pretty big music fan. If I’m working at a computer, odds are good I’ve got music playing. If I’m writing, same thing, only it’ll all be instrumental stuff. (For whatever reason, I can’t write fiction and listen to something with vocals at the same time.)

My habits are pretty straightforward. I like listening to albums, complete albums, all the way through. I like sticking to particular genres or artists depending on my mood that day. I’m also stuck in iTunes, which is (fine, whatever, if only). In iTunes, I mark albums I really like as loved, and sort my albums by artist, then by year. This is mostly because I think it’s neat seeing how artists and groups evolve and change over time: it’s nice being able to see the usually-continuous line of creative output.

This is all fine, as far as desktop listening goes, but recently I threw more money at Apple to sign up for iCloud Music Library, which means they’re (ostensibly) smart and able to push all my shit up to the cloud, then let me pull it back down again from other places. These other places end up being iOS devices, in almost all cases. (I’m holding out hope that the HomePod eventually lets me use my library).

Which brings me to my point of sadness: the Music app on iOS doesn’t do what I want.

I’m a simple man with simple tastes: I want sorting as described above, and I want album shuffle. I have a list of albums I really like, and I don’t really care about what order they’re played in, but the songs pretty much have to be in the right album-order, or I lose my mind and start foaming at the mouth. (Ask my coworkers, they’ll agree, it’s unsightly and embarrassing.)

I don’t really have a conclusion, other than it’d be nice, I guess. Maybe I’ll get around to filing a radar, someday.

Lode Jogger Postmortem

I (sorta) finished another jam, this time (mostly) making Lode Jogger!

Hooboy. This one was a doozy.

What Is It?

Lode Jogger is a gameboy jam game designed to be a near-copy of Lode Runner, one of my favorite childhood games. Players must run around a level, collecting treasure and avoiding the deadly monks, before escaping through the exit.

What Went Right

Mechanics - Mostly

All of the bits of Lode Runner are here! You can run around, you fall properly, you can climb ladders and go across ropes, and the crazy monks can do all of that, too! Treasure works, digging works, everything’s there.

It’s a little bit clunky, sure, and I don’t think I got ladders totally right, but I’ll cut myself just a tiny sliver of slack. About the only thing I was missing? Monks can’t pick up treasure!

Pathfinding/AI

When it comes to jams, I usually try to avoid doing much of anything involving complicated AI. Anything risky or too intensive generally gets tossed out as unfeasable. With this, though, AI was kind of important. The monks have to try to chase you, after all!

I distilled it down into basic pathfinding: monks will try to get you. That means, of course, that I’m recalculating based on a grid. It’s pretty much just a slope field, with the bottom of the hill being wherever the player is. They’re smart enough to know that ropes might be the quickest way to get somewhere, though, which worked out nicely. For anyone curious about the technical details, it’s just a dijkstra map.

What Maybe Kinda Didn’t Go Great

Levels

I had a fine test level for making sure all of the mechanics worked sensibly - you could collect treasure, you could die by falling into a pit, ladders and ropes seemed to work okay, and monks could follow you.

The bummer is that I more or less stopped at that point. Whoopsie! I definitely should have made more levels, but I think I was just under a lot of time pressure.

Audio

I basically completely punted on audio, full stop. So. At least it couldn’t have gone worse, right? I like the idea of basic bleeps and simple bfxr boops, but in practice most of the time they’re complete earsores: too chirpy, scratchy, piercing. I’ll stick with no audio at all instead of garbage audio, and given how distracted I was by the other aspects, it’s probably good that I didn’t bother.

Graphics

I don’t hate the gameboy palette, but I also didn’t really put a whole lot of time or energy into the art of the game. 160x144 isn’t a bad resolution to work in, but my artistic abilities were not really up to the task. One of the rules of the jam was also that all assets must be made during the week: oops. I punted on that big-time, too.

Having animated tiles for digging and dying would’ve been awesome, but again, time and lack of skill were both factors. I think I was too anxious about getting some of the good parts done that I let a lot of stuff just kind of fall by the wayside. Shucks!

Final Thoughts

I’m both proud and disappointed. I poked at a few things that I haven’t really worked on before, like basic pathfinding for the monks.

At the same time, Lode Runner is one of my top-tier favorite games, so not doing it justice stung a little. It might be something I revisit later, but probably with a very different shell. The GB palette’s a little limiting, and I could do a lot better with a lot more of everything. (Sound wouldn’t be bad, either. I loved the Mad Monk’s Revenge soundtrack!)

1-Bit Clicker Jam: Clickenville

I’ve been wanting to do another jam for awhile. I like the two week cycle, but haven’t seen any themes or jams that really struck my fancy. The technical limitations ones went well in the past, so those are the ones I tend to go after.

This time, it was a 1-bit (black and white graphics) clicker (mouse only) jam. Perfect! My idea was to go after something that was a little bit like Spaceplan or a cookie clicker-esque game.

What Is It

Clickenville is a game where you try to throw money at your problems. You have a number of buildings that provide income and offer upgrade options. These buildings let you alter the world of the game how you see fit, improving things for the residents, the town, and the world as a whole.

What Went Right

This was my first experience writing a more substantial shader. The theme being a 1-bit clicker made me think, with my limited art skills, that doing a cool dithering shader would be the best way to go. That way, I could find a tileset that looked good under this visual transformation and save myself a lot of effort in the process.

It’d also kind of hearken back to some of the games I played as a kid back on a black and white computer. Atkinson dithering was pretty great back then, and doing something that resembled it sounded like a fun project.

Plus, Obra Dinn looks great with a (much better) dithering technique.

This was also a chance to poke a little bit at a different way of building up content. I knew going into it that having a whole lot of different kinds of buildings with interconnected systems and resources would be a pretty neat feature. Say, you could have a guild that trained adventurers, then send them off to explore a dungeon. Some of these adventurers might die along the way, which would leave bones for necromancers to use.

I didn’t really start out whole-hog on doing something data-driven at first, because I didn’t really understand what I wanted. Once I got a few basic classes and a really simple workflow going, though, I started pulling everything out and ended up with a little ruby script that reads a bunch of json and writes out a bunch of haxe classes for my in-game content. It worked pretty well, even if augmenting this system over time was a bit of a challenge.

What Didn’t Go Great

It’s funny, I always start writing my postmortems in this section. This time around, I basically pretended that audio didn’t exist. There’s neither catchy music nor bleeps, and certainly no bloops. It’s always something I neglect and something I’m not tremendously proficient with, so it’s kind of a self-fulfilling prophecy. Someday I’ll aim more for doing better audio work, but this time I was focused way more on the neat shader and the general mechanics.

A few mechanics are still missing, unfortunately. I wanted a workflow where you’d start off with really basic buildings and had to spend resources to unlock them, but it kind of fell out along the way. I didn’t have a great handle on how the UI ought to look or work, and letting people know what something cost was a bit of a challenge - both for unlocking buildings and for letting people know what a particular upgrade would cost.

Final Thoughts

Is it done? Heck no. Am I happy with it? Mostly, sorta, yeah.

Game jams are always a question of time but more buildings would be top of my list. Doing a full UI pass to make things make more sense would also be pretty important.

The big takeaway that I had was: well, I had everything interactable hardcoded. Was this necessary? Why couldn’t you plunk down a Blacksmith wherever the hell you wanted, if you had the funds?

This meant, in a broad way, that I was putting together an RTS instead of a simple clicker. Oops. Neat thought, though.

Oneshot Postmortem

I finished another jam, this time making oneshot!

What Is It

It’s a little arena-y shooter thing, I guess? 2-4 people jump around in a little room and try to shoot each other. Everyone only gets one bullet before having to scramble for another one.

What Went Right

Finished! It’s done, and playable, and doesn’t seem to blow up! Kudos, me.

Simple! I stuck to the bounds of the theme, once again bolstered by a technical, rather than creative, limitation.

What Maybe Kinda Didn’t Go Great

Music! Specifically, the lack thereof. This is usually one of the things I leave until the very end, and in this case, it bit me a little. I had a few beats going, but most of it was pretty godawful. Here, no music was far better than the noise I was making

Stages! Because of the limitations of the jam (5 assets, no more) I wanted to set up a bunch of different levels on just one Tiled map, using camera position to set whatever ‘stage’ is presently in use. That would’ve taken more UI and more smarts around picking that stage, though, so it got punted as well.

Playtesting! Man, this really didn’t happen. Turns out, making a multiplayer game is hard if you’re not throwing it at people to poke at. For all I know, this is actually pretty fun, but I haven’t found out yet.

Juice! I know, I know, this is kind of falling out of fashion, but it really could do with a bit more zazz. Maybe particles that fly out when you jump, or screenshake when you zap a fool. Something! It could use a lot more stuff filling in the cracks.

Final Thoughts

This one’s kinda tricky.

I think I liked the idea way more before I started fiddling with it. It started out as a kind of dual-stick shooter with only one stick: aiming was based on the direction of travel. I wasn’t sure that this’d be all that much fun to play, as it seemed like you’d be jousting, or something along those lines. You end up hoping to be pointed in the right direction, and that didn’t sound too fun.

Instead, you’re just kind of hoping to have a clear horizontal line of sight with an enemy when you pew pew a laser. I don’t know if that’s better, but it seems a lot simpler in terms of demands on the player. Different maps would likely help a lot in this situation, as would bigger maps. If I end up spinning more on this, it’ll be one of the first things I try, along with a lot of playtesting.

Overall, I’m pretty happy with it. Moving feels kinda goofy and fun, at least playing on a keyboard. Gamepad might be way more frustrating.

I’m glad I did it, which is probably a good sign!

LZRS Postmortem

I’ve been pretty sloppy in the past about recapping when I’ve actually managed to finish something. This is an attempt to be a bit more proactive and a bit less “oh right, I should’ve done that weeks ago” about a project. This time around: LZRS for #lowrezjam2016!

What Is It

LZRS started out due to an interest in the laser section from Mega Man 2. Yes, this whole game is basically just poking and prodding at a single mechanic. Lasers flying across the screen that the player needs to avoid to navigate an environment felt like a decent hook - I mean, clearly, given that a MM game used it!

Because I’m lazy, I tend to throw procedural generation at just about anything I come up with, so in this case, my initial idea from long ago was to make a generator for screens, or levels, or courses, or whatever. This makes total sense, because content takes time to make, but it also creates another problem: now you’ve got to make the thing that actually makes the thing, which can be more work. “Fun” is tricky to algorithmically generate.

And that, sadly, is where the idea sat until a few weeks ago.

What Went Right

  • It finished!

Bear with me, here - for someone chronically late on side projects, actually getting something semi-satisfactory done is a big deal (to me). Having two weeks instead of two days contributed heavily, as did having a general idea before I even knew about the jam. Most of the time, I try to start from the theme, but here the theme is more about a technical limitation, rather than creative. That’s an interesting distinction to me.

  • Platformer

It’s a platformer! Usually people tend to start with these, but not me! I’m not really very good at real-time, actiony games, likely due to lack of experience. It’s pretty exciting to have something finished that plays reasonably well. Collision happens, there’s triggers, stuff goes fwhoosh, and it all seems to behave as I’d expect. (Whether things behave as players expect is another matter entirely.)

  • Reception

People seem to like it! I haven’t woken up to any severed heads in my bed, which I consider a good sign. It’s short enough that most people should be able to finish it, and nobody’s complained about getting bored, either.

What Maybe Kinda Didn’t Go Great

Usually you go with five specifics, but to heck with that. I do what I like

I think most of what I’m unhappy with boils down to one word: incomplete. It’s a jam game, and I was pushing back and forth against what seemed like a good idea to add, and what seemed possible within the remaining time. A few hours a night is an awful lot if you’re driven with a plan, but for exploration, it ends up being a bit trickier. Experimentation is fine but it really helps if you think your new idea is going to bear fruit.

(And before I go too much farther, incomplete is from my perspective as the dude who saw everything it could have been, rather than the players going through the whole thing. Very different perspectives.)

First off, the big mechanic: lasers. Sure, they slide around, or turn themselves on and off, but from a mechanical perspective, they’re kind of lame, aren’t they? There’s no telegraphing, there aren’t any hints about whether they’re going to turn off soon, or even which kind of laser is which! It’s a little lame. They don’t move at different speeds, and they’re not even textured. Tons of work could be done here polishing and improving.

Audio’s one big area that I’m a little disappointed with, and would probably get tackled pretty soon. Just looking at the main spaceman character is a great start: sounds for footsteps, jumps, hard landings, skids - there’s plenty here that I could add to push a bit more depth and feel into things. Heck, just having multiple different sounds for the same type of event would be great for adding feel and juiciness.

This next one’s a bit tricky to explain, but the unfinished-specific umbrella is probably just ‘polish’. I’ve usually got a pretty discerning, ruthless eye about what works, what doesn’t, and what to change. Some of the tiles don’t work quite right, but more importantly, my tiles are all black with alpha. Why care? Well, I can’t really tint them, which makes me kind of bummed out. I like being able to just tweak colors a bit, and if they’re white instead of black, I can muddle with the levels as much as I’d like.

The backgrounds change as you progress through the level, after all, so why not the walls and the environment, too? This was another issue of “things work, so don’t break anything” that kept me from making too many daring changes. The hard deadline both helped and hurt me, bless its heart. Twiddling with the precise color progression for the background would likely be on my list, too, just to make sure it’s exactly what I want.

I’ve been thrilled by people posting their times and death counts and would love to have some kind of global leaderboard for scores. I don’t know that I want to do anything platform-specific, which means either picking something cross-platform or finding an acceptable third-party solution. I haven’t really gotten that far or done any thinking about it yet, but it’d be a great thing to have.

Lastly on this hate train: levels and courses. Courses feels like the right word for the sequence of, uh, ten or eleven laser-filled screens of death. I didn’t even consider it for the scope of the jam because, well, there’s no way to pick a different course on the menu. Duh! Having a bunch of courses with different themes or different mechanics would be really pretty great. Designing the levels wasn’t quite as rough as I was afraid it’d be, and making more of them might be fun.

Final Thoughts ~Brainfarts~

I’m tremendously happy with how things turned out. I’ve been itching to do Ludum Dare for ages, but the 48/72 deadlines are a bit too much for someone with a dearth of time. Having two weeks and a technical restriction made all the difference in the world, and I think going in with an easily-applicable concept helped a ton.

The game even seems pretty fun, which is always a pleasant surprise. The mechanic isn’t mine, but I can claim some of the level design, at the very least. It was a good experience and something I wouldn’t at all mind putting more time into. That alone probably makes this experiment a success.

Luxe status bar

Another in a long series of brief tips! If you’d like to hide the status bar on iOS (unconfirmed, so far, for Android), just set fullscreen to true in project.flow. If you want this just for mobile devices, it’s likely easiest to do in config

override function config(config:luxe.AppConfig) {
  #if mobile
    config.window.fullscreen = true;
  #end
}

Boom! No more status bar!

Target-Action in Luxe

There’s an incredibly common, useful design paradigm called ‘target-action’, one I first encountered on iOS. Basically, you’ve got a button that calls a function when something specific happens: maybe a touch or a drag or something. This is the basis of all of iOS’ user input.

So I thought it’d be handy to recreate something similar using the entity-component model. It’s pretty braindead-simple, but it seems to work okay for my purposes. It’s not quite as powerful as it could be, but given that I’ve already put together a game with it, I figure it’s good enough.

Here’s what the component looks like:

import luxe.Component;
import luxe.Input;

class TargetActionComponent extends Component {
  public var mouse_up_action : Void->Void;

  public function new(?_up_action : Void->Void) {
    super( {name: "targetAction"} );
    mouse_up_action = _up_action;
  }

  override function onmouseup(e:MouseEvent) {
    if(mouse_up_action != null && cast(entity, Sprite).point_inside(e.pos)) {
      mouse_up_action();
    }
  }
}

And here’s what using it might look like:

var turkey = new Sprite({...});
turkey.add(new TargetActionComponent( function() { trace("I'm a turkey!"); } ));

The neat thing, and something I found pretty useful, is being able to rebind your target actions after creation. That ends up looking something like this:

t.get('targetAction').mouse_up_action = function() { trace("Gobble gobble gobble!"); };

The obvious next step is adding more triggers and actions for various input events. Touch events are a good thing to consider, as well as down-events, too - great for juicy, depressable buttons!