I moved to a new URL! Check it out!

posts filed under: general

Dev Log: Shoots and Ladders

Dev Log: Shoots and Ladders
I'm continuing on my journey of focusing on my little platformer prototype and ignoring all of my other projects for the time being. I'm still having fun with it, and it's what I've been working on when I set up in coffee shops around the Phoenix area. I'm still in the middle of moving so I've just been working on my laptop. I no longer have access to four monitors for the time being, but maybe that's a good thing?

Image


I've been poking around with adding ladders to the potential game idea. I like the idea of ladders that can bring the player (or any platformer object) through solids. I don't think I see ladders in many platformers and I'm starting to see why as I try to code these things. I thought it would be pretty straight forward but it's a little bit more tricky than I thought.

Having ladders that can pass an object through solids can create a way to totally separate different spaces of a level which I like, the only problem is the weird edge cases that appear because of those rules. I have ladders mostly working now, but if a moving solid interacts with the player currently on a ladder then some pretty messed up stuff happens. I still have to figure out what's going to happen in that case.

Image


Another thing to consider is moving ladders! Which might make things a little crazy. Right now all of my platforming objects operate independently, but I might move to an approach that involves a manager object that controls the order of execution of certain events. For example having all moving solids, moving ladders, etc, do their thing first might make things way easier. Also having objects check for neighboring objects all at the same time before and after movement would be more ideal than each object just moving and checking in its execution order.

That's it for now. Back to work! I have to catch up on some things I've been neglecting for this project, whoops.

Dev Log: Platforming Prototyping

Dev Log: Platforming Prototyping
My travels for the year still have not ended! As it turns out I'm currently in the process of moving, so everything is at least a little bit chaotic. I'm staying with friends just going to coffee shops with my laptop to work on stuff, and in that way it still feels like I'm on the road even though I'm just a few miles away from where I used to live.

I'm using this time to focus on my platforming prototype for now and totally neglecting almost every other project I have spun up. I suppose at some point I'll do a review blog post to go over the status of all my projects.

Most of what I've been working on is the core "physics" of the platforming stuff. I'm referencing Matt Thorson's technique for most of what I've been working on. One of the things I'm playing with transferring momentum from the platforms to the player when the player stops being a passenger for the platform.

I'm slightly referencing the memory of the Mega Man X games for this which have a little bit of this when you jump out of a moving mech. You keep the platform's speed with you until you collide with something.

Image


On top of that I'm working on slopes, which can be a huge pain in the butt most of the time. It's easy to get them going, but then a lot of the simple assumptions that are made with the physics engine get a little more complex. It's no longer the case that a player is against a wall to the right if they have a slope next to them, and all that kind of stuff.

Image


Whenever I work on a platformer system I always think of the past however-many platformer systems I've made and how they're all pretty much the same. I've more or less been making the same platforming engine since Bonesaw: The Game and I've just been slowly refining it over the years. I still run into a lot of the same issues whenever I go through it which is like some sort of weird Groundhog Day type nightmare, but platformers are the most fun thing to work on (I think) so it's totally worth it.

Dev Log: Map Stuff

Dev Log: Map Stuff
I'm almost at the end of my great travels in the Pacific Northwest, and I've spent a lot of time just jamming on some metroidvania type stuff in Otter. Yeah, I know I probably shouldn't be always starting up new projects when I have a bunch of other projects that still need to be finished, but I think right now I've just decided to do whatever makes me feel good and right now that's make some metroidvania game systems.

Image


I spent some time redoing most of what I had for the map system to enable the ability to have weird shaped rooms. The most common case of a weird shaped room is an L, and more rare than that might be an O shape, but beyond that now nearly any shaped room is possible. After I got that working I changed some of the guts of the code around to support rooms overlapping each other's bounding boxes, so that a 1x1 room can exist inside of a 3x3 O shaped room.

Image


Going back to the desert in just a few days and I'm not sure what I'll be working on when I get back, but for now I'm having fun with this thing.

Live from Canada

Live from Canada
After my time in the four days of sickness and chaos known as PAX I hopped on a bus with wifi that dropped me off in Canada. I'm chilling out at the indie house of Vancouver for the next few days and working on some various game related things.

Image


I have way too many game projects spun up already but this week while I'm in Canada I wanted to spend all of my time on a new prototype and work on some things related to Otter. I'm spinning up a little metroidvania style thing.

Image


I still have Super Sky Sisters, the island game, a dice game, and now this all in the mix... but I tend to just work on whatever thing I feel strongest about at any given time, which now happens to be a metroidvania. At least I do plan on sharing the source for the metroidvania system I made for Otter so that anyone else out there using it can work on their own. I am using Ogmo, and so far just one class that links all the levels together based a position usually set by the player entity.

Otter Example: Tilemaps

Otter Example: Tilemaps
The next Otter example is up and deals with the wild world of using tilemaps. The following example is a way to drop some tiles into a scene and also use the mouse to edit them.

namespace TilemapExample {
class Program {
static void Main(string[] args) {
// Create a Game.
var game = new Game("Tilemap Example");

// Create a Scene.
var scene = new Scene();
// Add the Tiles Entity to the Scene.
scene.Add(new Tiles());

// Set the mouse visibility to true for this example.
game.MouseVisible = true;

// Start the Game.
game.Start(scene);
}
}

class Tiles : Entity {
// The Tilemap Graphic to use for rendering tiles.
public Tilemap Tilemap;
// The grid size to use for the Tilemap.
public static int GridSize = 32;
// The current selected tile to place.
public int CurrentTile;

public Tiles() : base() {
// Create the Tilemap the size of the game window using the defined grid size.
Tilemap = new Tilemap("tiles.png", Game.Instance.Width, Game.Instance.Height, GridSize, GridSize);
// Add the Tilemap to the list of Graphics to render.
AddGraphic(Tilemap);

// Place some tiles.
Tilemap.SetTile(0, 0, 0);
Tilemap.SetTile(1, 0, 0);
Tilemap.SetTile(2, 0, 0);

// Place some more tiles.
Tilemap.SetTile(0, 4, 1);
Tilemap.SetTile(1, 4, 1);
Tilemap.SetTile(2, 4, 1);

// Even more tiles.
Tilemap.SetTile(0, 8, 2);
Tilemap.SetTile(1, 8, 2);
Tilemap.SetTile(2, 8, 2);

// Want more tiles?
Tilemap.SetTile(0, 12, 3);
Tilemap.SetTile(1, 12, 3);
Tilemap.SetTile(2, 12, 3);
}

public override void Update() {
base.Update();

// Determine the grid position of the mouse.
var gridX = (int)Util.SnapToGrid(Input.MouseX, GridSize) / GridSize;
var gridY = (int)Util.SnapToGrid(Input.MouseY, GridSize) / GridSize;

// Switch the current tile to place based on the mouse wheel movement.
CurrentTile += Input.MouseWheelDelta;
CurrentTile %= 4; // Make sure the current tile is always 0 to 3.

if (Input.MouseWheelDelta != 0) {
// Log the current tile value.
Console.WriteLine("Current Tile is now {0}", CurrentTile);
}

// Place a tile when the left mouse button is down.
if (Input.MouseButtonDown(MouseButton.Left)) {
Tilemap.SetTile(gridX, gridY, CurrentTile);
}
// Remove a tile when the right mouse button is down.
if (Input.MouseButtonDown(MouseButton.Right)) {
Tilemap.ClearTile(gridX, gridY);
}
}
}
}
Make sure to download the tilemap source image as well. The final result should end up something like this:

Image


Even more examples on the way!

Status Report

Status Report
It seems like 2015 is really flying by and once again I'm trying to figure out what happened to it! Obviously I have kind of shifted my priorities again to maintain some sort of sanity and happiness. What started out as a year of working on the island game tentatively titled Stratoforce has turned into working on a bunch of smaller stuff. The stress of working on one big thing for a long time got to me so I took a break, and now that break is pretty extended.

Image


I'm still working on finishing Super Sky Sisters which is probably 98% done at this point. There's just a few more things to do, like figure out how I'm releasing it. I've gotten a lot of feedback from people that suggests I should put it on Steam or something, but that honestly sounds like more trouble than it's worth. My current plan is to release on itch.io for a small amount of dollars.

Image


Other than that I'm working on a prototype involving dice. I've posted some gifs and such of it from time to time. I haven't spent a super long time on it yet so there's no real game yet, but I've been trying to figure out how to make rolling digital dice feel cool and not like a chore.

I currently have a contract gig that is taking up some of my time. I'm doing some character art and level tile art for an upcoming indie game that for now I don't think I can say what it is, but it is pretty cool to work on!

On top of that I'm still trying to flesh out all the examples I can for Otter. I think pretty soon I'll be able to call it version 1.0 and figure out what I want to do with it after that. I have tinkered around with some other frameworks and engines, but I still always go back to Otter... I just wish it were easier to export to Mac and Linux.

I think that covers everything! I'm staying busy, still just living that indie life I suppose. Eventually I will have to buckle down and release a new proper game, but for now I still think I'm having fun and keeping my emotional health up which can be very important. Working on small projects that have no expectations is way more comfortable for me, but I know that eventually that won't be paying my bills.