For the latest game in development called The Gap I’ve been doing lots of work in Blender. Learning new tricks and speeding up my workflow. Making a curved cut is something I had not done a lot of and in the past I’ve struggled with the knife tool or knife projects. I’ve been using this method to make curved windows and door arches.
Here is a neat way to make a curved cut in an object with considerable control and only a little bit of mucking about.
Basically we are intersecting one mesh with another and bisecting the meshes with a knife cut to make a simple train tunnel shape.
We are going to start with the default cube which has been scaled up to ten and subdivided 7 times.
Next we are going to add a Nurbs Curve as a second object. This we are going to manipulate into the shape we want and later convert it to a mesh to intersect with our cube. You could use any other object like a Bezier Curve or a Path would be very flexible. I chose a Nurbs Curve because it was reasonably simple shape.
In Edit mode manipulate the curve into the shape you want, subdividing the points if required. I find that enabling snapping is a good way to start to keep everything the same on both sides of the curve and then turning it off for fine tuning.
Once you have the shape you want you can clean up the curve (it’s best to have everything on the same plane).
Once you are happy with it it is now converted to a mesh.
Which is then extended through our cube!
Both Meshes are Joined (Ctrl + J). Select the one last that you want to keep the name of.
Switch to Face Select mode and then the Mesh is Intersected and cut with the knife:
Then you can simply delete the faces from the Nurbs Curve Mesh and you are left with the nice curved cut.
Now you can select all the faces inside your nice curve and extrude them into the cube to make a train tunnel 🙂
A few final notes. As I mentioned before you can do this procedure with any mesh to make cuts and hollows with intersections. It’s a bit like using the boolean modifier. It’s not great in every situation as it can make a mess of your topology if you are not neat with your cuts and you can be left with some very tiny faces or triangles. But if you line things up nicely and merge your close vector points it’s a pretty simple and handy tool in the kit.
One game currently in the pipe line is called The Gap. The game is about the gap between the private internal world of personal histories and how they feed and colour perceptions of the present. Esoteric I know right. But basically it’s an exploring game in an urban setting with lots of indoor areas that need indoor props. So I’ve been doing lots of modelling and researching new methods to make life easier when using Blender (which I love).
Part of this research is reading lots and lots of books and one of them was Blender for Animation and Film-Based Production by Michelangelo Manriqu. The book is great and I’d recommend it to anyone using Blender. One method that I had not seen in any other tutorials or books was this one for making complex cone or cylinder based meshes using Bezier circles and curves. Instead of starting with the basic forms and working complex changes on their geometry this method is quick and simple to make complex (and simple) shapes really fast.
It starts like this: Open a new Scene and add a Bezier Curve and a Bezier Circle:
This is the right view (num 3) with the Bezier Curve moved over a bit on the X axis and rotated 90 degrees on the Z. (R key, −90 , Enter).
Select the Bezier Circle and Click on the little green Bezier Object button from the properties tab on the right.
Open the Geometry and Bevel sections and click on the Object button. Select your Bezier Curve as the Object.
This sets your Bezier Curve as the defining object for the edges and volume of the now filled Bezier Circle.
Now Select the Bezier Curve and move to Edit mode. Subdivide it as much as you want and play with the shape and angle of the curve to get your Bezier Circle to form all sorts of complex shapes.
Once you are happy with what you have you can go back to Object mode and select the Bezier Circle and go to Object -> convert to mesh (or ALT+C Mesh from Curve/Meta/Surf/Text).
Here some examples I did for this post:
I think the Chalice up there shows the power of this method for creating complex small objects very quickly and the relationship between the Bezier Curve and the resultant mesh.
The Gap will not be released for some time yet – years – it’s still early days but I’m really enjoying the process and it’s nice to be doing something personal and meaningful with game development.
The last couple of weeks I’ve been drawing hands. I always feel like I need to draw better and never make the time to do it. I have always liked drawing hands but my output is often pretty sketchy (pun intended). I have a book by George Bridgeman called A Hundred Hands which is one of the few art books I have a physical copy of and I’ve tried before to draw them all at one point or another. Thing is though even though there is more than hundred hand drawings in the book they are often not clear with the detail and when you are copying them you get to the point where the information you want is missing.
The challenge I gave myself was to draw a hundred hands myself. I often see people on the internet showing off their hundred heads or hundred expressions etc. and thought it was a good thing to do. What’s funny is that in doing it I reckon those people on the internet must have drawn way more than a hundred of what they were drawing to look so good. After drawing a hundred hands, and you can see from the images above, some of them are really not looking that great. A different angle or just a bad day at the easel is all it takes to throw the drawing out.
But that said it was really good to go over all the anatomy and learn to see again the angles and shapes of the hand. After doing it I really can’t say that I’m that much better at drawing hands or drawing in general but I’m definitely better at looking at hands and seeing all the angles and components.
I often struggle with the disconnect between drawing from life and drawing templates or symbols for things that live in my head. I find drawing from life pretty easy. But drawing from memory where you are using symbols and learned shapes is very different and that’s one of the things I wanted to get better at. So often I find that drawing is a mixture of the two ways of doing it and one definitely helps the other.
Another thing I found was that it was much more fun and better for the work to be looking at a variety of sources. While I started with George I quickly moved on to every other conceivable source of hands I could think of. I used images from online, copying from life, pinterest, every anatomy source I owned, old comics and old masters.
Anyway I’ve moved on to a hundred forearms and plan to work my way around the body for a few more weeks till I get sick of it and need to go back to doing all the other stuff that I love like making games, and 3D models and music.
This week for my game called The Gap I’ve been doing some house components. The game is set in the suburbs and there will be a lot of house interiors. In what I envision to be the opening scene of the game your main character wakes in his or her bedroom alive with excitement and ready to explore the world. Which has little to do with cornices but it’s these details that make the game look like a world and adds to the immersion.
So here is an example of a cornice that I have made in Blender using the Bevel Modifier.
This starts as a cube with about a quarter cut out of the form and a reduced height. But any straight edge will do. First use the edge select to assign all the relevant parts you want to bevel into a Vector Group. (Select the edge and in the object data panel use the “assign” button under the Vector Group section). Then you add the Bevel Modifier and as you can see in the image above you use the Limit Method by Vector Group and then add your new Vector Group you just assigned. Choose Custom Bevel and use either one of the presets or use the graphing tool window at the bottom to create your own bevel shape. There are a couple of nice cornice style presets in that section to get you started. (It helps to play round with the Amount and Segments section at the top to improve the look – also try Smooth Shading on the object).
Below is a Window frame I used the same technique on but with a different profile. I used ctrl+R to make some loop cuts around the inside of my window frame and used the edge select to assign the cuts to a Vector Group. Then again I used a Bevel Modifier to make a custom set of ridges around the window frame to make it look like the fittings of the aluminium framing around the glazing of the window.
You can see I also added a normal Bevel Modifier to the edge of Window Sill to create the outer wall shape where the rain runs away from the window frame.
I did a quick mock up in Unity to see how they performed under the often difficult lighting environment of the game engine. As you can see below by the shadows on the walls and spot light on the floor it’s not an ideal set up and the cornices are looking pretty crap. At the top of the room on the back wall I have two longer cornice pieces and a corner piece is visible as well. The two at the back are picking up different light sources and one looks lighter than the other. They are clearly three separate objects and not one nice clean line. It might help to add some more surface geometry to the longer pieces so they are not just one long face (loop cuts or subdivisions). Alternatively I could measure them out to fit the room exactly and meet in the corners – but then I would have to make multiple lengths instead of a more modular re-usable approach.
The other thing I did this week that was actually productive is some more character designs. This one is Hippo Boy catching a football and a couple of different shading styles (still playing with Clip Studio and still enjoying it). Next up I’m thinking about all the ways I can program a mugby style football game.
This is more concept art for a protagonist in the new project called The Gap. Okapi Boy – I have always loved Okapi’s. They are shy and remained hidden from the world in the deepest parts of the jungle until they were discovered in the 50’s. Beautiful Zebra like patterns on skin like a Deer. This is a deeply peaceful animal with large soulful eyes. He dreams and offers advice but you have to seek him out and finding him is not always easy or straightforward. In The Gap you get the chance to play as the Okapi for part of the story.
There used to be a great example of this rare creature in the Melbourne Museum Taxidermy collection (which I used to love but has now sadly been taken off the exhibit floor). You can take a virtual tour of the old “Wild” exhibition here.
I have a LOT more concept art to do as I want to get a very clear picture of my characters before I start modelling.
I also stared working on the programming for the game. One element I want to include in the story is a “mini-game” called Fox and Geese. It’s played on a chess board and was one of the first games I remember my dad teaching me how to play. It’s pretty straightforward and uses a chess board and pawns. Four white pawns are the Geese who can only move forward and diagonally one row at a time. The Fox is a black pawn that can move diagonally one space at a time in any direction. Moves are taken in turn and the aim of the game is for either the Fox to break the line of Geese or the Geese to “capture” the Fox so that he cannot move.
It’s early days yet with only the board set up and pawn selection scripts started but it was actually pretty fun setting up the programming that took care of the board. When you learn programming you get to do lots of arrays and nothing screams “ARRAY” like a chess board. So it’s kind of nice to use one of those basic skills that you use in all programming in such a nice simple example. You get to add a little interest to the basic array with the inclusion of alternating colours. Here is the code below:
public class FnG_MakeBoard : MonoBehaviour
public GameObject boardPiece;
public Vector3 positions;
// Start is called before the first frame update
positions = new Vector3;
float start_x_pos = -1.75f;
float start_y_pos = -1.75f;
float rowcount = 0f;
float linecount = 0f;
for (int i = 0; i < positions.Length; i++)
positions[i] = new Vector3(start_x_pos, start_y_pos, 0f);
start_x_pos += 0.5f;
rowcount += 1;
if (rowcount == 8)
start_x_pos = -1.75f;
start_y_pos += 0.5f;
rowcount = 0f;
Instantiate(boardPiece, positions[i], Quaternion.identity);
Color32 myRed = new Color32(185, 48, 48, 255);
Color32 myGray = new Color32(106, 106, 106, 255);
if (i % 2 == 0)
if (linecount % 2 == 0)
boardPiece.GetComponent<SpriteRenderer>().color = myGray;
if (linecount % 2 != 0)
boardPiece.GetComponent<SpriteRenderer>().color = myRed;
if (i % 2 != 0)
if (linecount % 2 == 0)
boardPiece.GetComponent<SpriteRenderer>().color = myRed;
if (linecount % 2 != 0)
boardPiece.GetComponent<SpriteRenderer>().color = myGray;
I finally started work on a new game after much hand wringing and soul searching. After the positive experience with Endless Elevator I decided not to push further into mobile gaming but to pivot to something with a little more scope on the PC platform.
It’s actually pretty hard to be sure that you can complete a game when you are a solo developer. You have to be fairly positive that it’s something you want to do for a long time and have it suck up so much of your free time and energy. I love making games so that’s the easy part. But what sort of game and what to make are different questions.
When I decided to do Endless Elevator it was mostly the good fortune of finding a handy tool set and a simple idea which collided into a quick mock up which I then forced into being as a full game over the space of a year and a half. Looking back that’s quite a chunk of time to spend on an off-the-cuff concept. Luckily by the end of it I was quite proud of what I’d achieved and was well ready to move on to something that was more meaningful to me as a person.
I spent the last month trying to work out what I was going to do next and had some grand ideas for more text based games, or a pixel art platformer game, or a first person fighting game. In the end I moved on to something more personal and gentle with an exploration and narrative based game called…
This is the idea that I jotted down:
The Gap is a suburb in Brisbane, Queensland, Australia. Named for it’s location at the foot of the pass between two mountain ranges… It’s the place I grew up. We used to call it The Void because there was nothing there. The end of the suburbs. The very last stop on the bus route out of the city. Over the ranges was lush open farming country stretching all the way to the Darling Downs but crammed into this river valley to these foothills was nothing but homogenised suburban hell. Brisbane has the largest suburban land mass of any city in the world. It goes on for miles in all directions overflowing and spreading like dirty water from the broken banks of the muddy river. The houses are washed up against the surrounding foothills. The Gap was and felt about as far as you could go. Manicured lawns petered out and stopped here to give way to the lantana and the bush of the ranges. The hills crowded round us on three sides and funnelled the suburb into it. Trains wouldn’t run here. It’s past the end of the line. It’s fed by one main road like an artery that snakes it’s way through the rabbit warren of hills all the way from the city.
It’s just a place though. A setting. This story is about all the other gaps. The gap between people, between adulthood and childhood, fantasy and reality. The gap between the stars. It can be as close as the gap between my skin and bones or as wide as a newly broken friendship. The irony is not lost on me that being a void the gap is being filled by everything it’s not.
Standing above The Gap like three beacons are TV Towers. You can see them from anywhere in the city. They will always point you home…whatever that means to you.
We had another saying, “You can take the boy out of The Gap but you cannot take the gap out of the boy”.
To work it up I used a Storyboarding software that really helped crystalise the ideas: https://wonderunit.com/storyboarder/ I can’t recommend this free software enough. The team who built it make it easy and intuitive to make pictures and text as a narrative in an attractive package.
I also started doing some character studies. I started working with Clip Studio for the artwork and I’m really liking it as a rapid sketching tool for the concept art.
I wanted to do a story about childhood and the suburbs. How the ordinary becomes extra-ordinary and stories charge the undertone of life. All characters have at least one spirit animal or more. I want to use animals to reveal character. Characters morph and change with imaginary purpose.
As an adult childhood has become a mystery land of fable or legend. I want to bring that to life.
It also stems from a place of loss. Loss of innocence and simplicity. Loss of the spirit animal habitats and sadness that the creatures we identify with are disappearing from the wild.
Here are some of the first ideas I did for characters:
Next steps is a lot more concept art and story work and building up into the initial 3D models.
I also updated the infrastructure that runs this site using a new Bitnami image: https://bitnami.com/stack/wordpress it was a very simple and quick migration from my old stack and was complete in an evening. I still have a DNS issue with my domain to figure out but that’s a job for February.
This is a great way to start the New Year. I am really excited to announce that since it’s release in July last year Endless Elevator has been downloaded over 1000 times from the Google Play Store! In less than six months with no advertising budget – it’s something to celebrate.
Since publishing Endless Elevator I’ve been enjoying the freedom to explore other aspects of game development and learning new skills. One of the things I’ve really amped up is the art side of the brain. I’ve been doing Drawabox and Inkober and lots of other things on the side. It’s like the freakin’ Renaissance here.
One thing I’ve really enjoyed with Drawabox is cementing the skills of seeing the world in 3D. To help me get into the groove I did a quick project to make a box in perspective that can be manipulated.
In the Repository there are three versions of the software:
The original Unity Package if you want to import the project into Unity to play with.
A Windows compiled installer.
An Android *.apk.
A small disclaimer for those who use it when working on the 250 box challenge:
The 250 box challenge is intended to develop one’s internal model of 3D space. It’s not uncommon that students will try to use 3D modeling software or something when they struggle, figuring that finding something that will make the task itself easier is a good thing. The problem with this is that it causes them to take a spatial problem and turn it into an observational one, which in turn sidesteps the goal of the task.
So, looking at tools like this in a more general sense to just see how things can rotate and what that does to the lines (frankly this tool’s inclusion of the line extensions makes it considerably better than just looking at 3D models), is okay – but you should not be attempting to draw from it directly.
On Monday Jul 27, 2020 ZuluOneZero released Endless Elevator on the Google Play Store for Android.
It has now been just over two months since release and I wanted to publish the stats of the game and glean a few insights into how it went. It was a “soft” release. This is an indie game by a solo developer (with possibly an undiagnosed split personality disorder). There was never going to be a budget for marketing and the money is not the primary reason why we do this…right?
What I was most excited about was that we got over 500 installs. For a new game on the Play Store with no exposure sitting amongst hundreds of thousands of games I was pretty happy about that. I even did a screen shot on my phone to prove it. I had previously released two other games on the Play Store and they got maybe twenty downloads each so I was pleasantly surprised.
The “marketing” that I did do included posting with #ScreenshotSaturday and #AndroidGames, on Twitter and Instagram. I also put a few announcements into some of the GameDev groups on Reddit and Facebook, a press release in Hacker News, but that was about it. I didn’t “Slam the Socials” from day one, just dribbled out a few notifications now and then over the past couple of months. Which has turned out pretty well. Installs were organic and fairly stable over that time. There was a big hit on the first week but it kept going in dribs and drabs every day since then.
As I said before this game was never about making money, though that would be nice one day. The primary objective was to make a good game and to improve and learn. Endless Elevator is a free game and only has the option to Play an Advertisement once your health get’s low enough to nearly die. If you are dying and want to keep playing the same game you can elect to watch an add or you can dismiss the prompt, eventually die, and just start a new game when you die. I really hate enforced ads in games that make you watch for the pleasure of playing again. This is what the game looks like when you get to that stage…
So in the past two months I’ve made $0.20 dollars. Which looks a lot better on the page than when you tell someone the game has made Twenty Cents!
My reasoning goes that at these rates if I want to make a Hundred Thousand Dollars this year then I need to get Two Hundred and Fifty Million Players in the next Ten Months. Sounds achievable.
The post is similar to a dozen others out there on the interwebs that basically say the same thing.
The gang at Unity reckon that there are three “R’s” to live operations in order to achieve success with a free-to-play game. Or rather three statistics: Reach, Revenue, and Retention.
Reach is the number of new players on Day One and on Day Seven. Revenue is players who watch ads or buy in-app purchases. Retention is how well your game keeps players engaged over time.
Day One retention is a good indicator of whether or not your game is any good. If players are uninstalling it straight away…well. It can also reflect how easy the game is to pick up and play. Endless Elevator is really easy to pick up and play. It has simple controls and follows long established conventions similar to other handheld games.
Day Seven retention lets you know if the game has enough content, or is exciting enough to motivate players to continue playing. The Unity people put a lot of emphasis on this stat as a predictor of overall game health. This is where my game falls down…or does it?
I really hate the new Google Developer Console for graphs. They look like crap but once you get the hang of generating them they can be useful.
First of all let’s have a look at those users… (again these graphs…if you are reading this on a mobile I’m sorry)
The graph is useless this small but the shape of it is the thing. Going up is good. There is a little grey square just before Aug at the middle of the bottom of the graph which indicates the release date. Anything before that is beta testing. Anything after it is post-prod release installs.
The graph above is the Active Users actually playing the game over the first two months since Production Release.
This is where the true picture of success turns on it’s head. The Day One stats are not that bad. When I think about all the games I try and uninstall within 5 seconds I reckon a stat above 20% is doing OK. But Day Seven shows a different picture. Seven days later and most users have stopped playing the game… but at least some players are still enjoying it. Maybe I’m being too hard on myself and it actually takes this amount of churn to get a solid player base – the jury is still out.
This is the real kicker. Sessions Per Player. It looks like people are playing it once, maybe giving it another go but rarely a third play…no retention.
Insights? Well it looks like the game get’s players and that the initial play of the game is good. Hell I even got good reviews on the Play Store (when I didn’t even ask for them). But mostly…most players are not playing more than a couple of times. The game doesn’t have enough “sticky” to keep people’s attention. It’s the computer game equivalent of a one hit wonder. A nice game, and fun to play, but not as much fun as playing Jelly Splash or Candy Crush or Clash of Clans or whatever. People will not invest their lives playing this game and to tell the truth I don’t blame them. I actually still like playing the game but it’s mine so I’m a little blinded by my own ego there.
I reckon the team a Unity would say “Hey Opportunity” or “Fortunately this is fixable”. There are strategies and development angles that we can use to squeeze more interest out of the game. We could add quests, more bad guys to kill, more variety in the environment, special events, upgrades to your weapons and multiple characters. We could even go multiplayer! More, more, more and maybe one day I will but for now I’m happy resting in my meagre laurels and planning new games to make.
As a final bonus to those of you who have read this far is the breakdown of download by Country. This I did find really interesting. We released to 151 Countries supported by the Play Store and the top countries were South Korea and Russia! Who could have guessed that? I did some research and read some reports and apparently South Korea is a big user of the Play Store but not so much Russia. Why is this game of interest to people in Russia? Was it the spy theme? Honestly anyone’s guess.
All countries / regions 500 South Korea 44 Russia 43 United States 38 Brazil 28 Hong Kong 19 Ukraine 18 Japan 16 Philippines 16 Poland 16 Turkey 16 India 15 Malaysia 14 Germany 13 Spain 13 Czechia 11 United Kingdom 10 Iran 9 Egypt 8 Greece 8 Indonesia 8 Thailand 8 Israel 7 France 6 Singapore 6 Taiwan 6 Vietnam 6 Argentina 5 Belarus 5 Italy 5 Serbia 5 Saudi Arabia 5 Canada 4 Kazakhstan 4 Mexico 4
The other surprising thing was that no Australian’s downloaded the game (well only one – thanks mum – oh no that was my dev account).