Project: Sherlock – Dev Log 1

August 18, 2018 at 4:22 pm (Game Development, Games, Graphics, Java, JavaScript, Processing, Programming, Video games) (, , , , )


This is the first dev log for a project I’ve been working on in my spare time for the past little while. What is it: it’s a game. Kind of a cross between Resident Evil (without the combat) and the overworld map from Super Mario 3. It’s built using the game engine I wrote myself several years ago. Here’s a small list of some engine details:

Game Engine Details:

  • 2D-in-3D sprite-based engine. Characters are 2D billboard sprites, while levels are 3D tiles and blocks
  • Physics engine (JBox2D)
  • Scripting engine (JavaScript)
  • Handles and organizes game and render code (Rendering uses Processing, which uses OpenGL and GLSL)
  • Level editor for building the scenes

 

So what have I done so far? Well, I’ve just finished my 6th iteration/milestone, so I’m going to take some time to work on the design and levels of the game before I implement more features (I have a big/growing list of features to work on though). Here is a brief video demo of the flow of the game at this point in time:

Here is a non-exhaustive list of the interesting stuff and features implemented for this project so far:

  • Set up a new game/app that uses my existing engine. Re-used most of my game art, etc. so I could get it together faster
  • Basic mechanics implemented:
    • Rails movement: Click on nodes to walk to that location
    • Actions: Some locations have specific actions the player can take, such as opening a door, taking an item, or searching that location.
    • Condition system: Some locations or actions have conditions (aka you need an item or to have done something). It uses a Mongo-like expression evaluation system.
  • Title screen and level select screen. Basic stuff, but had to be written
  • New game art:
    • New Character art and animation sequences. Still in progress, but right now it at least looks like a dude walking around the levels
    • New isometric pixel art for random objects in the levels. This is so the levels feel more like a world instead of an empty room
  • Task queuing system. Requirement for this type of game. You give the engine some work to do and it’ll do it in order (stuff like “move here, then play sfx, then do something else”)
  • Session auto-save system. Loads your game session when you boot up a level and manages everything you’ve done in the game (inventory, completed tasks, etc)
  • Various minor engine tweaks: Camera zoom, thicker walls, etc
  • Added a handful of levels and added a bunch of objects like wall art, desks, dressers, etc.

 

 

 

Permalink Leave a Comment

Updates: June 10, 2016

June 10, 2016 at 10:55 am (Art, Java, memory palace, Programming, Rant, Thinking) (, , , , , , , , , , , , )


I’ve been working on a number of different things as well as thinking about my next steps and goals for the year. Here is a point-form list of some of the projects and endeavors I’ve been spending effort on in the past couple weeks:

  • I set up a home Linux server. I wanted a local, private Git repository as well as a machine to host some automated processes and apps. Things have been working out very well on this front. It’s been a great learning experience on top of it as well as I haven’t really used Linux in a decade or more. I installed a desktop version of Ubuntu, but I’ve been sticking to using the terminal as much as possible to expand my sphere of knowledge.
  • I’ve been working on my coding skills and algorithm knowledge. I always have some sort of coding project on the go, but recently I’ve been so focused on my front-end skills that I’ve let my core skills droop a bit. To get back up to par, I’ve been solving a lot of coding problems in Java as well as figuring out some algorithms that I haven’t touched in a while. I decided to start basic with heaps and heapsort, then moved on to KMP string matching, and now I am working on suffix tries/trees. I’m going at a slow pace with this though so I can not only code solutions, but also store them in my mind palace.

   Preparing an algorithm for long-term mind palace storage pretty much consists of tearing the algorithm down to its basic elements in your mind and trying to make a story out of it. For example, I’ve decided to store the KMP string matching algorithm in a kitchen in one of my mind-rooms, so I compared the process to making spaghetti. Comparing noodles of different length was the basis of the story. I also had to work in the generation of the prefix table for the search pattern. For this, I’ve been toying around with adding some sort of “sauce” to the story to indicate the comparisons of the prefix to suffix for each length of the pattern noodle.

   I think that I’m finally starting to outgrow the hub room I’ve been using for my computer science mind palace. It was a good index for classes of algorithms so I could always see what tools were at my disposal, but it’s getting too cluttered now.

  • I’ve also been doing a lot of general-purpose reading. I visited the library not long ago and “accidentally” walked away with between 10-15 books. Some of these were painting-related so I could learn some new techniques and composition skills, but I also picked up some interesting biology books. One of these is a book on viruses (the non-computer version). I’ve been learning a lot about how they operate as well as how they’re being used/manipulated today. Bacteriophages are being produced to one day replace antibiotics, and I find the whole thing fascinating (phages are a type of virus that goes after bacteria instead of humans).
  • In addition to practicing my coding/problem solving skills, I’ve also been working on learning and using some new technologies; at least new to me. I’ve been fiddling with the Play framework, which is a web platform. I wasn’t really impressed with it at the start as you have to use a self-hosted web app just to create a project structure, but beyond that it seems really nifty. My next area of interest within this framework is the Ebean integration, which allows for a fun way to connect objects to databases without having to write scripts and stored procedures. There are also some features to allow syncing a database to ElasticSearch automatically, which will be fun.
  • The Android platform is another area I am learning about lately. I’ve set up my development environment and I’ve been learning about the SDK for creating apps. It seems like there are a lot of different approaches to building Android apps, especially as the SDK has been evolving. It has made things a little awkward to get started (as there are many references on the internet to doing things the “old” ways), but I think I’m past that hurdle now. My only real problem now is that I haven’t been spending enough time on this project.

Permalink Leave a Comment

Progress Update: May 24, 2016

May 24, 2016 at 6:39 pm (Computer Science, Java, Programming, python, Rant) (, , , , , , , )


I know I’ve recently posted about a few of my upcoming goals, but since then I’ve fiddled with a number of things since then and have some updates on my progress.

  • Python Learning. Thanks to a suggestion on the Halihax Slack channel, I picked up a pretty decent IDE for my Python projects (PyCharm). Unfortunately, I learned the hard way that Windows is not the ideal platform for using Python. I wanted to work with a packaged called “sklearn” that I saw during a Google I/O session on machine learning, but it depends on SciPy; a package for scientific calculations. Unfortunately SciPy has some dependencies that do not install cleanly on Windows (LaPack and BLAS are a couple examples). I was really looking forward to toying with the code snippet from the presentation, and I’m sure there are plenty of equivalent libraries I could try out, but the fiddling process wore on me.
  • Android Learning. I’ve been learning about making apps on the Android platform. There was a fair amount of setup and configuration for getting the IDE to work as well as setting up the right emulators to run code on. The annoyances were further compounded by the fact that I don’t want anything installed on my C drive. I use a smaller SSD drive for my C, and then put everything else on another drive; it allows my OS to run lightning fast and lets me get going faster. This guide ended up being really useful in moving the hefty emulators and other odds & ends to my storage drive: http://www.littlecpu.com/android-studio-c-drive.

  I’m in a pretty good “hacking” state right now on this front after some effort. I’m learning about the UI-data model binding within Android page components as well as other architecture aspects. The architecture is fairly straightforward (activities, services, etc) but there seem to be a lot of conventions and gotchas.

  • Java Experiments. I’m also back experimenting with Java as well. I’ve been using Derby (JavaDB) as an embedded database, and it’s pretty simple so far. I had toyed with MapDB a bit, but I’d like something a bit better supported so I can use Hibernate with it to avoid having to do my own schemas. I’ve also been using ElasticSearch in parallel. It’s kind of it’s own document-based database, but without the reliability – it’s usually used in conjunction with a real database and you just sync the data in batches so that Elastic can index the data to make it searchable. These components are all pretty straightforward, but I want to build a decent non-trivial demo project. I was also considering using Akka for the concurrency management to control the batch operations to ES.

Permalink Leave a Comment

Updates: May 2016

May 15, 2016 at 7:03 pm (Computer Science, Java, memory palace, Programming, Rant, Thinking) (, , , , , , , )


It’s been a while since I’ve posted about my recent endeavors outside of painting (this is by design). There’s been a fair amount of things keeping me busy and stressed. That being said, I’ve started putting together and working on my goals for the next several months. A large part of this will be getting my full-stack technical skills back up to a competitive level. I’m going to be focusing mostly on my Java skills as well as commonly-used libraries, since it’s been a while.

As part of this, I spent a bit of time building a small app to back up my development files. Mostly because I needed a good, automated process and didn’t want to go shopping for an app. I needed something that can backup different sets of files at different times, so I could selectively backup specific projects and images, but also my full dev repository. It seems to be working according to my tests, but I’ll be trying it out soon to find out.

I also plan on picking up Python. I think I will use Python 3, although I want to be knowledgeable of the differences from 2 to 3 as well so I can read/port existing code. It shouldn’t take long to pick it up, but I have to learn the specific syntax and rules such as scoping, etc. Some sort of project would help, so I’ll be trying to think of more home automation tasks I could fulfill with Python apps.

Lastly (for this post), I plan on giving my memory palace an upgrade. I need some more rooms, and I need to finish storing algorithms in it. I’m missing tree and graph algorithms (which are pretty important), and I wouldn’t mind adding some more details for implementation as well. This should ensure that I don’t have to review algorithms, data structures, and design patterns when I need to use them; I’ll have them permanently stored.

Permalink Leave a Comment

Ant + Processing = Grief

July 4, 2014 at 8:20 am (Computer Science, Game Development, Java, Processing, Programming) (, , , , , , , , )


This will be a humorous post coming right after the article about how great automation is. After I finished writing my Ant scripts for automating my Java project, I ran into a wall; Ant can’t update a Processing library while the Processing Development Environment is running. For some reason, Eclipse is able to deploy JAR files and have them overwrite the existing library while the PDE is running though!

So now I have to figure out a way to make this work, or else I have to ignore all of the automation I put in. I may still use Ant to back up my code projects to an external hard drive, but that’s about it right now.

And then there was sadness.

Permalink Leave a Comment

Automation 4 U

June 28, 2014 at 2:29 pm (Computer Science, Game Development, Games, Graphics, Java, JavaScript, Processing, Programming, Rant, Teaching) (, , , , , , , )


So, this will be nothing new for some of you. This isn’t even something new to me; I have a day job where I’m a professional software engineer and we do this at my job all the time. I’m talking about automation and automated processes. This could be anything in your project development process where you have the computer automatically do something for you. An example could be a script that backs up your files to a different drive that you can just run when you want. It could be as complex as a build step that automatically deploys your binaries or runs unit tests.

My disclaimer: A lot of this is technical stuff and directed towards programmers, but even if you’re a graph artist, you can still benefit from this. Everybody that uses computers for projects will need to back up their files for instance.

I’ve only recently realized just how important this all is for regular, personal projects. I’ve always known that it saves time, but my initial mindset was that I’d rather get my project up and running and THEN waste time implementing the time-saving stuff after I get it together. I’ve been reading this book I bought from Amazon that talks about indie gaming from a business, “get your act together” perspective. The book can be found here. I’m still reading it, and some may or may not agree that it’s a good book, but it provides some good ideas for how to take your hobby projects to the next level and keep your process renewable. This means saving time and money on mundane processes, etc.

I am still in the process of automating many aspects of my project, but it really crept up on me just how much time I was wasting on manual things. Here are some of the processes I perform just for my Zombie Mansion project:

  • Backing up files from two areas on my system to my external hard drive
  • Deploying JAR files from my Eclipse solution to my Processing solution to use in my game
  • Removing alpha channels from sprite sets (I built a tool to do this, but it’s still manual)
  • Putting together standalone builds of the game software
  • Packing and compressing image resources for game builds
  • Merging animation sequences together for access by the game engine

These are just things I thought of off the top of my head this morning. Some of them will be easier to do than others, and some of them are specific to my project. All of them eat up time though and are tedious things. Here are a few tips and ideas for how I plan on solving some of these issues though. Please read through just in the off chance that it inspires something or gives you an idea or two.

Deploying JAR files to another solution

For this, I intend on using ANT with Eclipse. This is pretty much a standard for serious Java projects, but it’s taken me a long time to start to improve my processes (usually I want to work on the fun stuff or the stuff that has a visual out-come). Visual Studio has its own build steps and things you can run. Alternatively, you could write a script/BAT file that will grab the files from your output directory and deploy them. This doesn’t require a full set-up of a 3rd party tool and it should be quick to do. It just might break and won’t be as robust.

Backing up project files

This is something I’m already part way through implementing. I’ve written most of a BAT script that will grab the project files from specific directories and dump them in one area so I can back them up (it will optionally zip them as well). To make it a bit easier, I’ve started using virtual drives, but this isn’t necessary. If you’re interested in what virtual drives are or how to set them up easily, email me or post a comment. I can give you some resources or just write an article. Here is a snippet of what I have so far (I’ve been taking bits and pieces from the interwebs, so most of it is borrowed code anyway).

I wanted to dump the files into a folder that would be timestamped so I wouldn’t have to worry about overwriting anything. This is one way of how you’d accomplish it using a BAT script in Windows:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set year=%date:~-4%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set datetimef=%day%-%month%-%year%_%hour%-%min%
echo %datetimef%
xcopy "C:\Test\A" "C:\Test\B\Backup\%datetimef%" /E /I

This will copy everything in your source directory (the first argument) and store them in a custom folder with a timestamp. You can use multiple source directories as well if you have things spread out like I do by just putting in an extra line. The last two arguments are switches to tell XCOPY to use the full source directory (and children) and to assume I mean the destination should be a folder.

Removing alpha channels from image resources

This one will be a bit more complicated. I have a tool I wrote to do this, but I want to streamline this. Now, I wrote up a full project plan with a product backlog, but then I realized even that was too ambitious. I plan on taking some items from the list, but I also plan on it being a purely script-based tool. It will run on the command prompt and will use my engine’s scripting engine for customization (as opposed to using config files). At this point in time, it’s cheaper for me to use scripts than config files since I don’t have a streamlined approach to reading them yet. ANYWAY, I will be writing this as a project in my game engine solution and it’ll have a unit test project to go with it. I’m still working out what tests I will need for it since it works with images, but it’ll be centered on testing the RGB values of generated images before and after the script runs. It’ll also test image sizes for when I add the feature to compile multiple animation sequences together.

Anyway! To summarize this; automation is good. It saves a HUGE amount of money (time is money). If you ever have dreamed of selling a game, you NEED to get in the habit of doing this. The more you do it, the easier it will become and the more effective you will be with your time. Be as lazy as possible with your projects; that’s why we’re programmers! (Although you don’t need to be a programmer to benefit from this).

 

 

Permalink Leave a Comment

Quick and Accessible Inversion of Control

March 14, 2014 at 1:37 pm (Computer Science, Games, Graphics, Java, Processing, Programming, Rant, Teaching, Video games) (, , , , , )


So by now you’ve probably at least heard of the magical beast known as “Inversion of Control”. You may even understand what it is. If you’re in this boat, why aren’t you using it more often?? (if you are, you can read the rest of this article with your head held high).

There are tons of places on the interwebs where you can learn all about Inversion of Control (or IOC), so it doesn’t make sense to write up a detail explanation and then have people correct me on it. The short version of it is that it lets you defer your problems to someone else (future you for example). You allow the implementation to be abstracted in such a way that you can conveniently inject it in such a way that would make your college programming professor proud and/or confused.

For this example, I am going to use PicoContainer and Processing. PicoContainer is an IoC library for Java, although you could implement what it provides yourself through a variety of techniques I won’t tell you about here. The idea is just to show you a brief intro to what it can look like. In my example, I have a Graph object. It is the “M” of our MVC, and we want to separate the “V” from it. This means that the bit of code that draws the graph on the screen is going to be extracted. The kicker is that the way we abstract it will allow us to re-skin the graph in whatever way we want, whenever we want. We just inject a new view without changing the model layer and we’re good to go.

/**
  This is our interface for abstracting the View from the model
*/
public interface GraphView {
  public void draw(PGraphics g, Graph graph); 
}

/**
  This is our Model: The object we want to abstract the view from.
*/
public class Graph {
  private MutablePicoContainer graphConfig = null;

  public Graph() {
     graphConfig = new DefaultPicoContainer();
  }

  public MutablePicoContainer getGraphConfig() {
      return graphConfig; 
  }

  public void draw(PGraphics g) {
     // I'd recommend caching the view ahead of time to remove overhead
     GraphView graphView = (GraphView)graphConfig.getComponent(GraphView.class);
     graphView.draw(g, this);
  }
}

Now here is the part that makes it all work. I’ve written this in Processing code, but it is essentially simplified Java anyway. In this snippet of code (although it is a working program if you include the previous snippets), I instantiate our Graph object and then inject a View. In this example I’m just showing the power of IoC by including an anonymous implementation of a View object. In the “real world”, you would have written it as a standard Java object.

import org.picocontainer.*;

Graph graph = null;
void setup() {
  graph = new Graph();
  graph.getGraphConfig().addComponent(new GraphView(){
      public void draw(PGraphics g, Graph graph) {
        g.pushStyle();
        g.stroke(200);
        g.noFill();
        g.ellipse(25, 25, 10, 10);
        g.popStyle();
    }    
  });  
}
void draw() {
  background(0);
  graph.draw(g);
}

Now to summarize, we have accomplished our goal of abstracting the view of the graph from the data represented by the graph object itself. This means that we could completely re-skin the visual representation of our graph without touching any of our previously written code. If we wanted to draw the draw in 3D, we could just inject a new implementation. If we want it to be rendered using only ASCII characters, we got this. In the case that you still don’t see the value of this, consider a game you’re probably writing right now in your spare time:

You have a general “GameCharacter” class that both the PlayerCharacter and AiCharacter classes inherit from (Because you’re object-savy and generally good-looking). Both of these allow you to draw the characters differently. What happens when you decide to add new AiCharacters that act exactly the same, but look different? Well, you could throw in an IF statement and just check a state variable…. OR you could abstract the view, just like in our example! When you construct the AiCharacter objects, you inject a View object that will do all the drawing. As an object-oriented purist, you feel content, and as a game developer you feel pleased that you were able to trim off an “IF” statement from your render loop. You high five yourself.

Permalink Leave a Comment

Javascript Object Inheritance that C#/Java Coders can Understand

February 18, 2014 at 10:22 am (Computer Science, JavaScript, Programming, Teaching) (, , , , , , )


So, at work I’ve been using Javascript as a primary language for a while now. While I am likely not an expert, I’ve picked up some neat tricks. Since I work with an office full of C# coders, I need to write code that they can understand quickly. Therefore, one of my first motivations is to write code that can be understood by non-Javascript purists.

So let’s build a simple example of how to achieve objects and inheritance using Javascript. While there are more than one way to create objects in Javascript, I’ve been using this approach as several good/reputable sources have suggested it, and it resembles C#/Java somewhat. Note: I don’t condone the act of trying to make Javascript into a language it isn’t, but I do support readability. In this case, our reader understands a separate language and they have no reason/incentive to learn ours. So we will commit as few crimes as possible to make our code understandable by people that don’t know Javascript.

So here is our base case: Shape. It holds a position coordinate with a public accessor.

function Shape() {
  var _x = 0,
      _y = 0;  
  /**
  This acts as a constructor for us and looks familiar-ish to C# coders. 
  */
  initializeComponent() {
      _x = 5;
  }
  
  this.getX = function() {
    return _x;
  }

  this.getY = function() {
    return _y;
  }

  /**
  Can't forget to call our own constructor.
  */
  initializeComponent();}

So this is our base class. We’ve defined X and Y and Javascript will treat them as private variables. When you instantiate the object, you can only access them via the public “GetX()” method (I’ll show instantiation shortly). You will also notice the function “initializeComponent”. This is what I call a constructor, but I stick to this function name just by convention. You can call it whatever you want, within reason; Javascript reserves some keywords. You’ll see at the bottom of the class that we are calling this constructor ourselves. What’s with that?? Well, to Javascript, the whole class is a constructor, but if we had our code spilling everywhere then it would be messy and not at all like C#.

The last thing to notice is that our public accessors are attached to a “this” keyword. “This” will refer to the instantiated object, and the function will attach itself as a property of that object. This is different from our private variables, which aren’t properties of the object, but are accessible from within those public functions. Without getting into details, this essentially lets us mimic the behaviour of C#/Java.

Now to the good part: we want to instantiate our object!

var ourObject = new Shape();
ourObject.getX(); // This returns _x
ourObject._x; // This returns undefined as it is not accessible

So this is how to instantiate the object. Everything works as expected. Now lets talk about how to make a new class that inherits from Shape. Incoming code:

function Circle() {
  var _r = 0;
  this.GetRadius = function() {
    return _r;
  }
}
Circle.prototype = new Shape;
Circle.prototype.constructor = Circle;

Okay, so we’ve seen everything in Circle already, but what is that noise after the class definition? So again, without getting into details (which are already everywhere on the interwebs), the first line is setting the class to inherit from. This means that if you instantiate Circle, you can do operations such as:

circle.getX();

This is a valid operation. Exciting. Now what was that second line? We need to set the prototype’s constructor to point back to our Circle class. This allows us to use the “instanceof” operator and have it work as we would expect. Now, it isn’t necessary to do this step, but it plays nice when other people use our code.

So that’s how we can achieve something along the lines of inheritance with Javascript. I’ve hidden lots of important details, but if you want to know more, ask or search for it. I should also note that my example doesn’t give you the power of protected fields. For example, Circle can’t directly access _x.

 

 

Permalink Leave a Comment

Zombie Mansion: Updates and screenshots!

November 13, 2013 at 6:32 pm (Games, Processing, Programming, Video games) (, , , , , , , , )


Yay! Screenshots! I’ve finally had some motivation to post some stuff on my project that isn’t 6 months old. I got a little side tracked with events and stuff, so I’ve been busy and unmotivated. Anyway, I’ve solved the issue I was complaining about in my last post, or at least I have a workaround for it, so it looks nice again. Also, I’ve been using Artisy: Draft for piecing together level designs and other stuff. It makes it a bit easier when I go to make levels in my editor if I have a fancy map telling me where to put stuff.

Anyway, here are some animated GIFs of my “game” right now. Note that they don’t really look right due to the GIF making process I’m using. For example, the animations and movements look really glitchy (and the particle effects die out) because the framerate dies when I record a GIF with the library I’m using. Also, the levels depicted in the GIFs are not finished and polished, so the floors look awkward, etc.

Basic room spin

Basic room spin

Shooting a zombie

Shooting a zombie

Pushing furniture

Pushing furniture

Permalink 2 Comments

Paper Donkey Engine Improvements

February 10, 2013 at 7:12 pm (Uncategorized) (, )


So I spent a bit of time today working on my game engine that I haven’t touched in a while. I’m adding a scripting engine (the Rhino-based one included since Java 6) to it and improving the physics engine. Now you will be able to use javascript files to modify game objects and specify level start states in a MUCH better/easier way. Win!

Permalink Leave a Comment

Next page »