Jump to content
Sign in to follow this  
  • entries
    31
  • comments
    13
  • views
    12240

Building Block Heroes - Choosing an Art Style

Sign in to follow this  
Aggroblakh

1617 views

Building Block Heroes - Choosing an Art Style

I've received some praise for the colourful and cartoony look of Building Block Heroes. The art style of the game was chosen deliberately, and in this feature I discuss why I chose to make Building Block Heroes look the way it does.

Foundation

I've always had some modicum of talent from a young age due to having grown up playing games and reading comics. Nevertheless, until development on this game began I never was able to produce finished artwork, just rather messy sketches.

Sketchbook.jpg

To feasibly produce the artwork for Building Block Heroes, I knew that I would have to learn how to produce finished artwork. Furthermore, I had to learn how to do it on the computer, which I had never attempted before. After purchasing a cheap tablet on Amazon (for about $45 CAD), I got to work practicing digital art.

Pixel Art Failure

I originally intended to produce pixel art due to a perception that it would be easier than producing hand-painted work. I was wrong, so horribly wrong, and my early attempts at pixel art constitute what can only be described as "failed abortions." I realized after about a day or two of creating "pixel art" that it would be too much of a jump to go from sketches on paper to presentable pixel art - I didn't possess the ability or even the patience to do so. The principles of traditional art are far more different from those of pixel art than I thought.

PixelFailure.JPG

I then decided to go back to the basics. Instead of creating art solely for the purpose of game development, I figured that the best way to start creating art digitally was to first simply become familiar with the use of a tablet. With this in mind, I just practiced drawing as if I was drawing on paper. It did take a while to become used to it - more than once I caught myself looking at the tablet and wondering why nothing was appearing before remembering that the lines would appear on the monitor in front of me.

DwarfTest.JPG

Eventually, I was able to recreate my sketches on the screen after about a week or two of practice. The next step was colouring. This was something that I had no real experience with, even on paper.

Keep It Simple, Stupid

I started off painting simple shapes with solid colours until I became somewhat familiar with it. Things like blending colours, or even choosing the right colours, were new to me and took some time to become accustomed to, especially on the tablet/PC. Nevertheless, I managed to learn a few tricks from this simple practice, such as adding a warmer tone to highlights and a cooler tone to shadow when painting solid colours.

Highlights.JPG

However, once I decided to paint something with more substance - in this case, a tree - I quickly realized that it would take me forever to produce finished art with the kind of detail I was accustomed to sketching. Sketching allows the artist to handwave away a bunch of details and be a bit more lax in terms of things like realistic colour and proportions, etc. Producing finished art was a different story, and the tree ended up taking several days to finish. Given that I was learning on the go AND working solo, I knew I needed to reduce the scope of artwork I was going to have to produce. A man's got to know his limitations, after all.

I looked back at the simple-shape, bright-colour paintings I had produced thus far and realized that they looked vaguely cartoony. Thinking that I could extend this over the whole of my game, I went to "work" watching various cartoons and playing cartoony games to see how the professionals did it.

While such graphics weren't exactly light on details either, they definitely were a lot more creative and wacky in terms of colours and proportions. I knew that such creative freedom would compensate for my relative lack of skill in the art department since I wouldn't necessarily have to worry about things looking like their real-world counterparts. It would also make learning how to produce digital art a lot more fun, as I could really experiment with zanier backgrounds and colours.

TreeEvolution.JPG

Rayman, in particular, also provided a template for character animations. I had originally envisioned animating my characters with full bodies, like those in Earthworm Jim. I had no experience with animation, however, and I was worried that learning how to paint AND animate might be a steep hill to climb. Observing that characters in Rayman do not have limbs, I immediately realized that using a similar method of character design would make it much easier to animate them.

NoLimbs.JPG

Run.gif

I extended this compensation further by making the enemies in the game mechanical, meaning that I would be able to move the parts individually, rather than having to animate large creatures by hand.

Boss.gif

Many experienced game developers suggest starting off with a simple game with small scope for newbies getting into the field. Art is no different, and the appearance of Building Block Heroes is my attempt to produce quality art while understanding and working with my limitations. I was genuinely nervous about whether or not I had managed to end up producing attractive work, and thankfully it seems that I've done so.

Hope this was a fun read!

 

Sign in to follow this  


2 Comments


Recommended Comments

It sure was a fun read, but moreover you did an amazing job! 

Good luck with your project!

Share this comment


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Advertisement
  • Blog Entries

  • Similar Content

    • By OConquestGame
      Hello there!
      I’m the creator and producer of an upcoming visual novel / video game. 
      My team and I are looking for artists (character and background), writers (experienced in writing relatable characters and witty dialogue), and programmers (familiar with unity and creating mini games). 
      Our team is a group of close friends looking to break the mold of the traditional visual novel and create something new and positive. This game will be highly promoted and be a great portfolio piece. Rates are negotiable!
      If you are interested please contact/message us today! OConQuestGame@gmail.com
    • By Gas Lantern Games
      Hello!

      I have spent the last year and a half developing a game in my spare time in Unity! I am releasing it soon on Steam. Ant Empire is a strategic remake of some older games. It is influenced by games such as Ant Empire and Civilization.

      I am currently doing a kickstarter to help fund an AI before launch.

      I have attached some images (tried some gifs but they were too large) to show the current stage of Ant Empire, which is nearly completed.







    • By Shaarigan
      Hey,
      I'm currently starting next iteration on my engine project and have some points I'm completely fine with and some other points and/or code parts that need refactoring so this is a refactoring step before starting to add new features. As I want my code to be modular to have features optional installed for certain projects while others have to stay out of sight, I designed a framework that starting from a core component or module, spreads features to several project files that are merged together to a single project solution (in Visual Studio) by our tooling.
      This works great for some parts of the code, naming the Crypto or Input module for example but other parts seem to be at the wrong place and need to be moved. Some features are in the core component that may belong into an own module while I feel uncomfortable splitting those parts and determine what stays in core and what should get it's own module. An example is Math stuff. When using the framework to write a game (engine), I need access to algebra like Vector, Quaternion and Matrix objects but when writing some kind of match-making server, I wouldn't need it so put it into an own module with own directory, build script and package description or just stay in core and take the size and ammount of files as a treat in this case?
      What about naimng? When cleaning the folder structure I want to collect some files together that stay seperated currently. This files are foir example basic type definitions, utility macros and parts of my Reflection/RTTI/Meta system (which is intended to get ipartially t's own module as well because I just need it for editor code currently but supports conditional building to some kind of C# like attributes also).
      I already looked at several projects and they seem to don't care that much about that but growing the code means also grow breaking changes when refactoring in the future. So what are your suggestions/ oppinions to this topic? Do I overcomplicate things and overengeneer modularity or could it even be more modular? Where is the line between usefull and chaotic?
      Thanks in advance!
    • By PlanetExp
      I've been trying to organise a small-medium sized toy game project to supports macOS, iOS and Windows simultaneously in a clean way. But I always get stuck when I cross over to the target platform. I'll try to explain,
      I have organised my project in modules like so:
       
      1. core c++ engine, platform agnostic, has a public c++ api
      2. c api bindings for the c++ api, also platform agnostic, this is actually part of 1 because its such a small project
      3. target platform bindings, on iOS and macOS this is in swift. Basically wraps the c api
      4. target platform code. This part just calls the api. Also in swift.
       
      So in all I have 4 modules going simultaneously, all compiled into a separate static libraries and imported into the next phase/layer. Am I even remotely close to something functional? I seem to getting stuck somewhere between 2 and 3 when I cross over to the target platform. In theory I would just need to call the game loop, but I always end up writing some logic up there anyway.
       
    • By MarkNefedov
      So, initially I was planning to create a base class, and some inherited classes like weapon/armour/etc, and each class will have an enum that specifies its type, and everything was going ok until I hit "usable items".
      I ended up with creating UsableItem class, and tons of inherited classes, like Drink/Apple/SuperApple/MagickPotato/Potion/Landmine/(whatever that player can use) each with unique behaviour. I planned to store items in the SQLite database, but I discovered that there are not many ways of creating variables(pointers) with type determined at runtime (that preferably get their stats/model/icon/etc from DB). So, I think that I need to use some variation of the Factory pattern, but I have no idea how I should implement it for this particular case (giant switch/case 😂 ).
      It would be really nice if you guys can give me some advice on how I should manage this kind of problem or maybe how I should redesign the inventory.
      Inventory storage is an array of pointers. I'm working with CryEngine V, so RTTI can't be used.
      Example code:
      namespace Inventory { enum ItemType { Static, Building, Usable, Weapon, Armour }; class InventoryItem { public: virtual ~InventoryItem() = default; virtual ItemType GetType() = 0; virtual string GetName() = 0; virtual string GetIcon() = 0; virtual void Destroy() { //TODO: Notify inventory storage delete this; } }; class UsableItem : public InventoryItem { public: struct Usage { int Index; string Use_Name; }; virtual CryMT::vector<Usage> GetUsages() = 0; virtual void UseItem(int usage) = 0; }; class TestItem : public UsableItem { int Counter =0; ItemType GetType() override { return ItemType::Usable; } string GetName() override { return "TestItem"; } string GetIcon() override { return "NULL"; } CryMT::vector<Usage> GetUsages() override { CryMT::vector<Usage> Usages; Usages.push_back(Usage{1, "Dec"}); Usages.push_back(Usage{2,"Inc"}); Usages.push_back(Usage{3,"Show"}); return Usages; } void UseItem(int usage) override { CryMT::vector<Usage> uses = GetUsages(); switch (usage) { case 0: for (int i =0; i<uses.size(); i++) { CryLog(uses[i].Use_Name); } break; case 1: Counter--; CryLog("Dec"); CryLog("%d", Counter); break; case 2: Counter++; CryLog("Inc"); CryLog("%d", Counter); break; case 3: CryLog("%d", Counter); break; default: CryLog("WRONG INDEX"); break; } } }; }  
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!