Logicly, my logic circuit simulator AIR app is now on sale

by Josh Tynjala

About a month or so ago, I finally released version 1.0 of Logicly. I just realized that I never blogged about it here. In case you haven’t heard me talk about it before, Logicly is a logic circuit simulator that lets you build and learn about basic computer architecture. I first learned about this stuff in college, and I always thought it would be fun to build a “better” simulator in Flash because the others out there were a little light on design and polish.

Screenshot of Logicly

I first built a logic gate simulator with Flex back in 2008, and posted it right here on my blog. After two years of emails and interest from across the web from teachers, students, and hobbyists, I decided it was time to build it into a real product. Logicly now includes flip-flops, copy/paste, save and open functionality, and a lot more than the original demo. You can download Logicly to evalulate free for 30 days with no restrictions. After that, you can buy Logicly for an introductory price of $29.

flextreemap 2.2.0

by Josh Tynjala

My open source data visualization treemap component for Flex just received some updates today. Among them are my recent fixes to get this component working correctly in Flex 4. I figured I’d push a new SWC up for those of you who prefer to grab the ZIP file instead of building from source. Please note that version 2.2.0 of flextreemap is still compatible with Flex 3.5, and no Spark dependencies are present. The changes to support Flex 4 were mainly to fix bugs that only appeared in that version.

As a bonus, I also included a new layout algorithm in this version. It’s called StripLayout. This algorithm is very similar to the default SquarifyLayout, so it was pretty easy to implement. You can see it in action by viewing the LayoutModes example. However, I should note that StripLayout may be best used in situations where a larger number of items are displayed by the TreeMap, since it’s not quite as good as SquarifyLayout at getting good aspect ratios. It may also be useful when the order of nodes matters because SquarifyLayout sorts by weight, while StripLayout leaves items in the same order as the data provider.

Download version 2.2 of flextreemap on Github. If you catch any bugs, especially in Flex 4, be sure to create an issue. Thanks!

Bowler Hat Games on Android and beyond

by Josh Tynjala

Last week, closely following Adobe’s release of AIR for Android, I also pushed out all of my mobile games that I’ve been developing for AIR on mobile over the last year. My casual puzzle games Gridshock, Qrossfire, and Chroma Circuit can now be installed on devices with Android 2.2.

As you may know, all three were previously released for iOS thanks to Flash CS5′s Packager for iPhone. I removed them from the App Store for a short time after Apple decided to stop approving apps made with Adobe’s technology. However, after Apple changed their minds and finally approved Qrossfire, I rejoined the iOS developer program, and apps by Bowler Hat Games are once again available for Apple’s devices. As a sign of my continued commitment to iOS, I recently updated Gridshock to version 1.1 to add new features that I developed while working on the Android versions of my games. Chroma Circuit is likely to get an update too, since the Android version now has a “Quick Play” mode where you can pick and choose your levels as they are unlocked (a much requested feature on iOS).

I’ve begun preliminary exploration of making desktop downloadables. People love playing my games on the web or on a phone, and I don’t doubt that quite a few of you would love to download Qrossfire, Gridshock, or Chroma Circuit to install directly on your computers. I intend to spend some time adding new game modes and creating new features so that installable desktop apps will be well worth the price for longtime fans of my games. Gridshock is first in line, since it’s the most popular. Expect to see it on Windows, Mac, and Linux running on Adobe AIR for desktops.

By the way, to purchase any of my AIR for Android games, visit m.bowlerhatgames.com on your Android phone. The mobile site has some helpful links to guide you directly to the games in the Android Market app. Of course, you can also search for “bowler hat games” in the Market to easily find all three. I’m super excited to see some nice ratings and reviews so far. If you’re among those who added one, thank you so much for the kind words.

Flash CS5 exports weird FXG

by Josh Tynjala

FXG is cool. I’m using it extensively in skins for Logicly, the Flex 4 app I’ve been building recently. However, there are some oddities, mainly around Adobe’s tooling support for it. Honestly, the output I get when I export FXG for a FLA in Flash CS5 feels downright messy. It’s all valid, of course, but there doesn’t seem to be much intelligence in the exporter. Let me show you an example to explain.

Here’s the FXG gets exported for a rectangle I drew using the Rectangle Primitive Tool in Flash CS5:

<Path x="-272" y="-108" data="M315 109 315 151 273 151 273 109 315 109">
    <fill>
        <SolidColor color="#FFFFFF"/>
    </fill>
</Path>
<Path x="-272" y="-108" data="M315 109 315 151 273 151 273 109 315 109">
    <stroke>
        <SolidColorStroke weight="2"/>
    </stroke>
</Path>

Here’s what bothers me about the output:

  • There are separate Path elements, one with fill and one with stroke, but the position and data of those paths are exactly the same. You can define both fill and stroke on the same Path element, so why litter my code with extra stuff?

  • Speaking of Paths, why is it that anything I export becomes a Path? It doesn’t matter if I drew a rectangle or an ellipse (both of which are supported by FXG), I always get a path. Actually, I think Flash can add things to objects drawn with the primitive tools that FXG may not support, like the line style (solid, dashed, dotted, etc.) or an inner radius on an ellipse, so it kind of makes sense. However, it would be cool if the exporter could detect that <Rect/> or <Ellipse/> would be okay in some cases. Isn’t human readability the point of XML?

  • Notice the coordinates. This path gets positioned at -272, -108. Then, drawing starts at 315, 109. Nowhere in the FXG do we see the point 0, 0. Why doesn’t this get normalized? I can’t imagine anyone picking arbitrary points like that. I’d either set x=”0″ y=”0″ or I’d include that position somewhere in the path’s drawing coordinates.

That said, it’s important to note that I’m still using the exported FXG mostly as-is in my Flex skins. I remove some of the Groups created for layers and do some binding here and there, but the path data and positions stay exactly the same. It’s not like normalizing them manually would change the way they look, so I just don’t do it. With that in mind, I guess the things I wish were different aren’t that important, but I still can’t stop myself from frowning at the generated FXG every time I have to look at it.

Flash Player for Android fullscreen mode, and why I'm frustrated by it

by Josh Tynjala

When you view content in Flash Player on Android, there are some special mobile-only features available. For instance, when you longtap a running SWF, a little overlay appears. It has a fullscreen icon that will work on any SWF. Similarly, there’s a new parameter, named fullscreenOnSelection that goes into your HTML/JS embed code. This one will automatically put the SWF into fullscreen mode as soon as the user interacts with it (basically, skipping the overlay). Both are great ideas for games and other app-like SWFs, except I’m not happy with the way they’re implemented.

The right way

When I have my own custom fullscreen button on the display list, Flash Player on Android will properly preserve my scaling preferences. So when I use stage.scaleMode = StageScaleMode.NO_SCALE and stage.align = StageAlign.TOP_LEFT, I can run my layout code again after entering fullscreen mode to make my content fill the screen entirely. That’s what I want under any possible condition where my SWF enters fullscreen mode. Instead, it only works part of the time.

Screenshot of Android phone with proper fullscreen scaling.

The wrong way

With those two new fullscreen features I mentioned earlier, things work differently than my custom fullscreen button. You press the fullscreen icon in the overlay, and my SWF grows to fit the screen. However, the stage size as I see it from ActionScript maintains aspect ratio based on the embed width and height, rather than giving me the new dimensions based on the screen resolution.

Screenshot of Android phone with incorrect fullscreen scaling.

I could live with this behavior, except for the fact that some of my content that should be hidden may now become visible to the user. When my custom fullscreen button is used, and when the SWF is embedded in the page, I control the entire area of my displayed SWF. Since I don’t control part of the screen now (anything outside the bounds of the stage, as I see it from ActionScript), there’s not much I can do to fix it. Maybe I could mask (or set a scrollRect for) the entire stage to hide the overflow, but that affects performance. On a mobile device, that’s unacceptable.

Uh oh… it gets worse

If the user doesn’t use the overlay fullscreen button, and only uses my custom fullscreen button, everything works fine. Yay! If the user goes into fullscreen mode using the overlay, exits fullscreen mode, and then they discover my custom button, fullscreen continues to act as if they used the overlay. In short, Flash Player on Android is being very inconsistent here. At least from my point of view as a developer, maybe not for the user. Regardless, it ruins the experience I’m trying to provide because I have trouble detecting that this broken fullscreen mode has been entered.

Conclusion

I sincerely hope that I will get more control over fullscreen behavior in a future build of Flash Player for Android (and other mobile platforms, as they’re added). At the very least, if I have to settle for something that isn’t ideal, I want be comfortable knowing that my SWF won’t be showing content or anything outside the known bounds of the stage. If I’m forced to guess if there’s content displayed that should be hidden, mobile Flash Player is doing something wrong.

Logicly is back. Shiny new Flex 4 version is simulating now!

by Josh Tynjala

Remember my logic gate simulator, Logicly? Well, after two years of interest from students, educators, computer architecture geeks, and a whole lot of people visiting from Hacker News, Reddit, and StumbleUpon (among many other smaller sources), I’ve decided this app has a proper audience. I’ve been working hard the last month or so rewriting it in Flex 4. Yes, working for oneself has advantages, like being able to convince your “boss” more easily when a rewrite is necessary. Of course, when budget time comes around (read that as “when I have to do some freelance work to pay the bills”), I might grumble that I didn’t get as much done as I hoped, but I still think breaking apart that prototype code and doing it right will be totally worth it. Without further ado, check out Logicly!

Screenshot of Logicly

Since @troygilbert asked nicely, I thought I’d do a little informal writeup on how I have things set up for this project. It’ll probably be kind of high level, with a few mini-dives, if I think something might be particularly interesting.

The Basics

Logicly is built with Flex 4. Everything is a Spark component with an MXML-based skin, except for the flexwires part which seemed a pain to rewrite. This is my first time properly building custom Flex 4 components, and I enjoyed the process quite a bit. I especially enjoyed being able to export FXG from Creative Suite applications to use in skins. The learning curve for me, an experienced Flex 3 developer, was mostly non-existent. I don’t remember anything tripping me up.

My current framework of choice is RobotLegs. The dependency injection is a joy to have around, and I like that it felt like PureMVC, except, you know, properly made for Flash. I still don’t know when I’d be likely to port my app to another language and want to use the “same” framework, but to each his or her own.

In the process of building Logicly, I realized that the RobotLegs Flex examples all use the main application as the contextView for detecting when components are created and stuff. The problem is that when you create something on the PopUpManager, you don’t automatically get a mediator because the PopUpManager is attached to something higher up the display list than the application. Instead, I passed in a reference to systemManager, and everything worked awesomely. A quick tweet about it got some attention, and a variety of shout-outs from the community. Sometimes it’s fun to shake things up a little.

Multiple Projects

Logicly is made up of several Flash Builder projects. There are two main Flex projects. One for the web version of Logicly and one for the desktop version. Then, there are a variety of Library projects where all the real magic happens. From a technical perspective, I’m not sure if I actually needed to do so much separation, but I think it definitely helped me to keep things loosely coupled in some places, which is a win in my book.

Let’s take a look at the various projects:

  • CommonLibraries contains the code that I reuse among all the other projects. My own personal library of utility functions is in there (math and drawing stuff mostly), along with the open source projects I use in Logicly, in either source and SWC form. For the SWCs, I just put them in a folder and use MXMLC’s include-libraries compiler argument to compile in everything from that folder.

  • Simulation handles signal propagatation among circuits. There is absolutely nothing visual in this project. It’s purely a model of the running circuit. In the prototype, the data was passed around through connections made in flexwires. That was a little too complex to maintain, in my opinion, and I like the fact that I could potentially reuse this library to view the simulation a different way in the future, or maybe to run sub-circuits in separate simulations.

    Rather than using Events, I use Robert Penner’s as3-signals to pass signal changes throughout the simulation. It’s mainly for performance reasons. I’ve seen some crazy stuff built with Logicly’s prototype and the signal propagation could definitely become a bottleneck in the right hands. I do not use signals anywhere else. I was tempted to use signals to communicate within RobotLegs, but it didn’t feel very important at the time, so I just stuck with the default events.

  • CircuitViews has all the Flex components I built for various types of circuits you can drag into the editor, plus their skins. I mainly separated this one from the next project, Editor, to keep compile times speedy. I’m not sure if it actually has any real impact of compile time, though. Honestly, it just seemed like a good idea at the time. At the very least, since Editor is a pretty big project on it’s own, it’s nice to pull some stuff out to make it easier to navigate that source tree.

  • Editor is the powerhouse of Logicly. This is the biggest project, and it contains the majority of the Flex UI along with the related RobotLegs code. Basically, it’s everything that is shared among the desktop and web versions of the app.

    I tried to find as much common ground as possible to avoid duplicate code. This led to some interesting things like a service in the web app that rather than saving or loading files, displays modal windows on Flex’s PopUpManager (to tell the user that these features are disabled and to ask them to sign up for updates about the desktop app). There are other ways to do this. For instance, I could respond to the save event in the desktop app with the same Command I have now, but have a different Command respond in the web app that opens the pop ups directly, but I liked the idea of implementing an interface to create a fake service and piggy-backing the mapSingletonOf() dependency injection often used for services.

    Yeah, sometimes I make weird architecture choices on a whim. Don’t be so serious all the time.

  • LogiclyDesktop is the currently-unreleased desktop app. It has a subclass of the RobotLegs Context I created, but didn’t instantiate, in the Editor project. It mainly handles some desktop-specific events and views. Currently, the plan is to allow LogiclyDesktop to support multiple documents in separate windows, each with its own RobotLegs Context (so that I can reuse all the same code without changes that would probably require major refactoring). There will be some minor communication among documents, but mainly only for window management (to figure out when the app should close, for example).

  • LogiclyWeb is, obviously, the web app. Like LogiclyDesktop, it has a subclassed Context with some customizations for differing behavior. I’m also using some monkey-patching in this project to override some views I created in the Editor project.

    Since you cannot save a document in the web app, closing an edited document works a bit differently. In the desktop app, it asks you to Save, Discard Changes, or Cancel. To avoid confusion, the web app only asks to Discard or Cancel. I suppose I could have modified the component to add a boolean that omits the Save button, but the message changes too, and I didn’t want to write the invalidation and commitProperties() stuff. Actually, no, I think I chose monkey-patching because I wanted to see how RobotLegs handled it. The result worked, so I left it there.

Spark Skins

Since this is my first real project using Flex 4, it was also my first time getting down and dirty with the new skinning system. I love it. Everything is so customizable, and I was able to spend much less time on certain parts of the UI. In Flex 3, I probably would have needed to build a whole new component for some Panels because I wanted a wildly different layout. Not so in Flex 4, thanks to the Spark skinning architecture.

Right now, most of the skins I made are variations on the default Spark skins. I plan to make more interesting tweaks down the road to make Logicly have a more unique look and feel, but that wasn’t a priority yet. For now, I mainly just cared about the colors and fixing a couple things in Spark that I think are horribly ugly (like those increment and decrement buttons on scrollbars… yikes!).

By the way, I really don’t mind the copy-paste nature of skins in Flex 4. I know you hardcore developers get an uncontrollable twitch when you can’t inherit or reuse something, but it all felt pretty natural to me. Skins aren’t code… even if they are. For the Creative Suite exported FXG, I didn’t even feel the need to clean it up all that much. Well, except for the million and a half extra namespaces each CS application throws in there. What’s up with that useless garbage?

Source Control

Git works great for me. I’m not a big branch user, so all those features aren’t too special to me, but nothing beats the ease of typing in git init and starting a local repo. For Logicly, everything is still local on my machine, but I do use Github for flexwires, a related open source project I built along with Logicly. Eventually, I might upgrade my plan to put Logicly in a private repo on Github in order to have an offsite backup of the repo.

Testing

Yeah, about that…. I don’t really do unit testing. I know, that means I’m a horrible person. However, I’m inching closer and closer. My code today is much more testable than it was a year ago, and I actively try to make sure the right stuff can be tested on that magical day when I decide to write some tests.

Build Process

I use an Ant script to build Logicly. It’s a pretty standard Ant script. Although I do actually use <exec/> with the executables rather than using the Flex Ant tasks. That’s just the way I’ve always done it. I think I ran into some trouble early on (as in a few years ago) with the Ant tasks and gave up. The only magic in there is the fact that I increment a build number and use a filter token to inject the version string into the source code (it is displayed in the context menu).

Most of my development is from Flash Builder, so I don’t run the build script all that often. I could improve it, but that’s another case where the importance of doing so is rather low, so what’s there now is good enough.

Conclusion

So that’s my mostly unedited stream of consciousness explanation of Logicly’s project structure, code, and other stuff, with some thoughts on Flex 4 thrown in, since it was new to me. If I were working on Logicly full-time, it would have taken about a month to build. I switched to other projects over the course of development, and I generally took it easy throughout. My work on Logicly is a break from game development. I needed to recharge those batteries a little. My upcoming plans for Logicly include at least one more preview build, and then the release of the AIR app. Then it’s something game-related again, unless I decide to pick up some freelance projects.

flexwires updated to 1.1.0

by Josh Tynjala

It’s been a while since I worked on my open source project, flexwires. If you’re unfamiliar with the project, it provides a way to connect wires within a Flex app through drag-and-drop interaction to pass data around. The first and only release was back in late 2008. Since I’ve been using flexwires again recently, I figured now was a good time to make some updates and address a couple of issues that people have mentioned to me.

First and foremost, flexwires should now be compatible with Flex 4. It still targets Flex 3 and uses the Halo theme, but that shouldn’t stop you from using it within a Flex 4 app now. Secondly, flexwires should be working properly in Adobe AIR now too. Flex’s drag-and-drop works differently depending on whether it’s running in the browser or if it’s in an AIR app, which I didn’t know before. That’s fixed now, and you should properly see placeholder wires while dragging now.

There’s a new flexwires 1.1.0 ZIP to download over at github. The SWC inside is built with the Flex 3.5 SDK, but you should be able to include it in a Flex 4 project without any issues.

Don't let the Open Web lose momentum. Innovate and compete!

by Josh Tynjala

Lately, there has been much hoopla about the battle between Flash and HTML5. Anyone in the Flash community will tell you that the new features of the Open Web are still years behind Flash Player and other plugins. However, I believe that the amazing passion currently growing within that community can lead to exciting opportunities and new innovation. Advocates of the Open Web are currently trying to show that Flash isn’t required in the browser, and I encourage them to compete strongly in the coming months to prove their assertions.

To succeed, to knock Flash off it’s throne as the strongest innovator in web technology, HTML, CSS, and JavaScript need to be pushing out new versions much faster. When did HTML4 come out? Not in this decade. Consider the way everyone has been talking about HTML5 and CSS3 so much lately. I’ve seen so many cool examples that show the improvements over HTML4 and CSS2. To me, it seems like most of the big decisions have already been made. Yes, it may be a while before the standard is officially approved, but the important stuff is there and browsers are implementing things like mad. That’s so awesome!

With that in mind, I strongly suggest that we all should begin thinking about the next versions of Open Web tech very, very soon. You know why? Because Adobe generally has an 18 month release cycle for many of its products. Flash Player will continue to improve with cool new features, and that’s what keeps developers like me sticking with Adobe’s infamous plugin. I’m not saying that HTML needs the same duration for a release cycle. Standards are finalized at a slower pace for good reason. However, I strongly believe that HTML and all of its open friends have been stagnating for far too long, and that the release cycles have been slower than they should be.

Every browser vendor has been committing to new features like crazy lately, and many have been inventing new APIs that greatly improve the web. Keep that up, guys, because I’m impressed. However, I think one extra bit of effort should be combined with all this new stuff. Start throwing things into a bin that will eventually become HTML6, CSS4, and ECMAScript 6. Maybe not immediately, but I think 12 to 24 months from now, the most interesting features of the upcoming Open Web should be considered ready for the majority of smaller websites, and six months away from appearing on major web portals. At that time, developers should be just as excited about HTML6 and other future tech as they are today about HTML5.

I’m a Flash developer, and I’ve been one for nearly six years. I love Flash, and I hope that it continues to improve for a long time to come. However, I understand the role of the open web, and I want to see it follow a similar path. I do not see any sort of epic opposition between Flash and standards. In fact, I think that plugins like Flash Player and Silverlight can help to drive standards by being a test bed. Still, I see excellent opportunities for more friendly competition between plugins and web browsers, much like browsers compete among themselves to provide the best user experience for visiting our favorite websites. However, even with all the passion that has recently grown within the Open Web community, I think that there’s a chance that everyone could all settle down again and leave those technologies in limbo for a while. That would be unfortunate, and I encourage anyone who supports the idea of an Open Web to advocate for quicker standardization and to push for continued innovation in the very near future.

Adobe AIR for Android: Chroma Circuit, Gridshock, and Qrossfire Preview Videos

by Josh Tynjala

Updated! Added a video of Gridshock on a Nexus One.

Recently, the folks at Adobe gave me access to early builds of AIR for Android. With permission, I’m able to share a little bit about my experience so far. For your enjoyment, I’ve also uploaded a couple of videos to YouTube where I demo Chroma Circuit on the Motorola Droid along with Gridshock and Qrossfire on the Google Nexus One.

First, here’s a look at Chroma Circuit:

Since I’ve only been targeting a single platform so far, I hadn’t yet spent a lot of effort making my games resolution independent. With each one, I had to spend a couple hours making adjustments to ensure that the layouts would properly fit the screens of different devices. None of this new code that I wrote is Android-specific. In fact, now that my games have these changes in place, I shouldn’t need to make any adjustments when Adobe brings AIR to other types of smartphones in the future. That’s awesome. Of course, if a platform has an important UI paradigm, like Android’s hardware back button, then yes, I’ll make the necessary tweaks to ensure it is supported.

Now take a peek at Gridshock too:

Performance-wise, AIR for Android is fast. When I was making iPhone apps with Adobe’s Packager for iPhone in Flash CS5, I had to make heavy use of hardware acceleration to make even the most basic animations run smoothly. On Android, my games are all rendering in software, and they feel no less responsive on the phones than they do on my desktop. As Lee Brimelow pointed out, “[Adobe is] able to get tremendous performance on Android devices because Google and the various handset manufacturers have chosen to work closely with us to provide the best possible experience to the end user.”

Finally, here’s my third game, Qrossfire:

With barely any work on my part, I got my three existing mobile games running in AIR for Android. It’s exciting. This week, I’ll be starting a totally new game (finally!), and I plan to target my Android phones first. It’s a side-scrolling shooter, which is a nice change of genre for me, and the control scheme I have planned should be fun to implement with multi-touch.

Addressing color blindness in game design

by Josh Tynjala

As a game developer, I try to be accommodating to all types of players. One thing I learned pretty quickly after I released my first web game, Chroma Circuit, is that choosing colors (especially in puzzle games) is very important and not a task to take lightly. Color blindness can easily make two colors that seem very different to me look almost indistinguishable to others. When gameplay only relies on being able to see the difference between colors, you’ve got a problem.

As soon as I received the first request from a color blind user who was having some trouble with Chroma Circuit, I realized my mistake in simply choosing an aesthetic mix of colors that looked good to my own eyes. Only a couple of the colors seemed similar to the color blind player, but those were enough to take all the fun out of the game, and to make it mostly unplayable. Right away, I started putting together a new palette for Chroma Circuit. I’m no expert in this area, but I do have some tools at my disposal that certainly helped me out.

Photoshop color blindness modes

I think the first thing I did was take screenshots of a few levels from Chroma Circuit to load into Photoshop. Under the View menu, go to the Proof Setup sub-menu. This section lets you preview how your image will look in different color modes. For instance, designers can try CMYK to see how something might look a little different in print. You’ll find two options relevent to color blindness here, Color Blindness — Protanopia-type and Color Blindness — Deuteranopia-type.

Spectrum as seen with Protanopia-type and Deuteranopia-type color blindness

A standard spectrum of hues is shown above. Each of the color blindness proof options is shown for comparison. If you have a moment, and want some more examples, grab screenshots of your favorite websites that use an interesting mix of colors, paste into Photoshop, and take a look at how they change for color blind visitors. Below, you can see Chroma Circuit through the eyes of someone with Deuteranopia-type color blindness. The top half displays a level with the original colors, and the bottom half shows the same level after I made changes to the palette.

Screenshot of Chroma Circuit with color blindness mode enabled

To address the issue with Chroma Circuit, I took a pretty basic approach. I bumped up the contrast among each level’s colors as high as I could so that players could rely on brightness, in addition to hue. I generated the brightness levels based on the number of colors appearing in the level to achieve maximum contrast. If there were four colors required, I might set brightness values to 20%, 40%, 60%, and 80% brightness. If there were only three color needed, I would use 20%, 50% and 80%. The resulting colors weren’t particularly pretty, but they seemed to work well enough for the players who thanked me after I made the change (accessible in the Settings screen).

Screenshot of Chroma Circuit mobile with Pattern Mode enabled

When I brought Chroma Circuit to mobile devices, I decided to take a different approach based on a suggestion from a color-blind player. Rather than creating a palette of high-contrast colors, I decided to augment my regular palette with a set of unique patterns for each color, if “Pattern Mode” is enabled.

Screenshot of Qrossfire's symbols

With Qrossfire, another puzzle game I made, I tried adding something directly to the game, rather than making players enable it from the settings screen. In addition to colors, I created a set of visually unique symbols to display on the game board.

Screenshot of Gridshock with patterns mode enabled

In my most recent mobile game, Gridshock, I went back to making the patterns an option. Still, I feel like I integrated the patterns into the overall design better because I often “forgot” that I had the patterns enabled while testing. Additionally, Gridshock provided a new challenge that I think may have actually helped me design the patterns better. Since the timer bar shows the current color, and it’s a different shape than the squarish blocks in the grid, I had to ensure that the patterns were bold and flexible enough to display within differently-sized regions.

More Real-World Examples

Let’s take a look at some other games out there, including popular commercial titles to see how they handle (or mishandle) colors.

Bioshock screenshots

As I was writing this post, I was lucky to came across some complaints about BioShock 2, an example of a big commercial game that isn’t friendly with colors. Negative Gamer shows us What BioShock 2′s Hacking Looks Like if You’re Colour Blind.

Screenshot of Puzzle Fighter with color blindness comparison

Ars Technica had an article about the developers being unaware of color blindness a couple years ago. It includes the Puzzle Fighter screenshot comparison above, and many other examples described in the text, including first-person shooters, platformers, and more. Notably, New Super Mario Bros. doesn’t provide enough visual cues to easily tell the difference between Mario and Luigi.

Screen shot of Bejeweled showing the different shapes of colored jewels

In Bejeweled, each gem not only has a different color, but a different shape as well. These shapes are integrated into the design, and they’re always on by default. Instantly playable by color blind gamers!

Image of playing cards

I know, I know, it’s not a video game, but standard playing cards are an excellent example of game pieces that can be used by color blind players. Though card games often rely on the difference between red and black suits, color blind players shouldn’t have a problem with that. You might have never noticed, but both red symbols (hearts and diamonds) come to a point at the bottom while the black symbols (spades and clubs) have that little flat handle. Moreover, the contrast between red and black should be more than enough to allow players to note the difference, even if red looks a little more brown or yellow to them.

Don’t ruin the fun!

We all hate when players to stop having fun in our games for any reason. Though we might not be able to make changes to support all disabilities, ones like color blindness are often very simple to address, and I think it’s worth the small amount of effort required. One needs not ruin the aesthetic experience to make it happen either. If you can integrate various helpful tweaks into your main design, great, but a simple setting that can be enabled only when needed can be an acceptable alternative. Don’t forget that Photoshop provides tools that can be a big help in the process.

If you can, try to remember color blindness early in the design process, so that you don’t have to spend time changing an existing design that you might already be happy with. Not only will it save you frustration, but it might allow you to find better solutions that might not be acceptable later in the process.

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...18 19 20 Next