This weeks major distraction from blogging here has been time. I haven’t lacked it but I have been playing with it.
I really didn’t want to work on time just yet, I wanted to add input control to cepl so that I could let people actually play with what I have been doing. Oddly though my brain wouldn’t let me, it was one of those times in creativity that you get overruled by the voice in your head and no matter how hard you try to start working on something your brain drags you back to what it wants to be working on.
So I gave in and dropped working on input and had a look at time instead.
Time is intrinsically woven into games, and how you handle it has major impacts on how your game code is structured. As I’m working in a very non-standard language I feel very free to go looking for non-standard ways of doing things.
It’s been a beautiful feeling as I have really felt like I’m exploring ideas rather than just implementing them. I go on gut instinct and the mere action of writing the idea out in code reals the pitfalls as well as the advantages to the idea.
While I was noodling around with one particular function a wee voice popped into my head and said “Lexical Time”… which made no sense but sounded cool, but before I got any further it said “temporal lambda” which did sound cool…and also made sense.
The idea that came unbidden with the voice is that you could define functions which only evaluate their body when they meet a certain time condition (or temporal condition so we can sound fancy!). One example of such a condition would be BEFORE.
I must stress that I have no idea how useful these things may be, only that they sounded interesting. So with a little help from a great friend, I created temporal lambdas.
The first thing I am using them for is actually for the input control that my brain wouldn’t let me look at before (It clearly had a plan!). Key combos are very common in games for example you may have to press “A B A B <- ->” within 2 second to perform a special attack. With temporal lambdas, is really easy as it takes care of the ‘within 2 seconds for me”.
The key combo checker could be created like this:
(let ((key_cache nil)) (ct:tlambda (make-time-cache) (make-withinp 0 2000) (key) (setf key_cache (cons key key_cache)) (equal key_cache '(:left :right :b :a :b :a))))
So the programmer only needs to focus on the code to accumulate the keys and check if they are valid, and the temporal lambda makes sure that it will only be valid within 2 seconds (2000 milliseconds)
I’ll hopefully post some videos soon, once I have some control code written, so you can see what I’m yapping about.
I’m also just excited to see where temporal lambdas will be useful, again the idea came out of the ether so I don’t have a real plan for them yet. However if/when I do I will post up whatever I find.
I had an annoying realisation the other day that, while my computers run almost entirely libre software, the majority of the apps on my phone were not open at all.
Given the awesome fact that a huge percentage of mobile devices are now running an open source OS the fact that the apps aren’t is a bloody joke.
Luckily some great people have put together an ‘App Store’ which only contains libre software, its called (FDroid)[http://f-droid.org/]
There are some great wee apps and as the apps are made to be free there are no adverts either.
Missed a day of posting here again but progress is being made.
I seem to be falling into nice rhythm with developing cepl. First I work through some tutorial to add functionality to cepl, then I spend a few days trying to find abstractions for what I’ve just done.
Right now I’m in the later of those two. I’m getting annoyed with having to remember what type of vector I am using when I run vector functions against it so I’m currently working on generic function which take care of calling the correct function for me so I don’t have to think about it. I’ve also got tired of writing:
(make-vector3 1.0 2.0 3.0)
..every time I need a new vector and having to make sure the numbers are floats. To that end I have made a macro v! so that
(v! 1 2 3)
..works exactly the same and the long version except for also handling type conversions.
It works! Turns out it wa a very simple fix as the .obj files start counting from 1 wheras I expected counting from 0. One quick tweak later and we have this:
Sorting algorithms..there’s a whole bundle of them each with advantages and disadvantages over the others. If you want to understand some of these method and have a fairly visual mind this site will probably be right up your alley.
Use that site and play around with different initial conditions and see which method works best. This can really be helpful along some terser text as a way of seeing what the author is on about.
I’m on call this week for work so I best go try grab some shuteye before someone calls.
Well I have tried loading an .obj model in cepl for the first time…and well have a look..
Not so good!..Its meant to look more like the grey version on the lower right. Seems like I’ve still got some issues with indexing or something, but at least its getting vaguely recognisable!
More to come.
I had an interesting little issue the other day where connecting to some servers was taking aroudn 15 seconds before showing a login prompt. Everything after that was speedy so I knew it wasnt going to be a connection time issue.
I ran the following to get verbose connection info: ssh -v servername
and saw this error: debug1: Authentications that can continue: publickey,gssapi-with-mic,password debug1: Next authentication method: gssapi-with-mic debug1: An invalid name was supplied Cannot determine realm for numeric host address
It turns out that ssh is trying to use Kerberos (GSS-API). To turn this off we can simply edit our ssh config file.
# open up ~/.ssh/config # add the following line GSSAPIAuthentication no
And that fixes it!
When I first started getting into using Emacs for all my editing I had major problems trying to get a decent Python setup working. I spent hours messing around on line getting nothing but a headache, it almost made me drop Emacs entirely. However after finding a couple of clearer tutorials I was able to bodge something together, but if I’m honest Its never felt good enough. Luckily it seems that some lovely soul has put together this!
In the author’s words, the goal is “collecting and customising the perfect environment for python development, using the most beautiful emacs customisation to obtain a really modern and exciting (yet stable) way to edit text files.”
Next time I do some Python hacking (i.e. when I can tear myself away from Lisp!) I’ll try this out and let you know how it went.
Hopefully this can help some other Python loving Emacs noobs get started with a really slick python environment.
In other news I’ve written a .obj file parser so I can read some 3D models into cepl (my lisp opengl experiment). I should have something to show you by the end of this week.
As I have been making good headway on studying OpenGL I have been starting to have a look into more of the things I will need to make real games using my tools.
One of the obvious first steps is working out how I will manage all the different types of ‘things’ (lights, boxes, triggers, explosions, hats..and err..BIG HATS) in the games and also how to defining and extending their functionality as easy and powerful as possible.
It doesnt take much googling to see that object-orientated programming is not actually the way to go. This seems strange at first as OO can seem a natural fit for defining types of object. I mean you can have something like this:
character | |__human | |___soldier | |___civilian | |__alien |____alien queen |____alien soldier
But it turns out that in real life, things change (who knew?!) and, as new type of object are need in the game, functionality that use to be specific to one class of game object has to be moved up the tree.
For example, lets look at out pretend object hierarchy above. When the game designers first added the ‘alien solider’ they wanted to let it be able to call re-enforcements, this is fine but the ‘human->solider” also has this functionality. As good coders we want to reduce code duplication but where do we put the ‘call re-enforcements’ functionality? The only shared class is the ‘character’ class so we would have to put it there…but now this means that the ‘civilian’ and the ‘alien queen’ also inherit ‘call re-enforcements’ even though they will never do this in-game.
It turns out that this kind of thing happens a lot, and you start getting classes (like ‘character’ here) which become dumping grounds for functionality. These classes are often called Blobs.
Ok so if this isn’t what we want then what other options do we have?
Well the one that is interesting me is called an Entity System. It detatches the functionality from the data which allows for composition of game objects in a way that is much more flexible than multiple inheritance …well rather than me doing a poor job replicating the articles I have read I will just link them below, hopefully they will help you as much as they have me.
- Entity Systems are the future of MMOG development This is a series of posts on the Entity Sytems, give yourself some time to read throught these.
- Evolve Your Hierarchy - Refactoring Game Entities with Components This has a narrower focus but good explanations, it was the first article I read on the subject.
- Role of systems in entity systems architecture If the above have thrown you a little this is a brilliant breakdown of entity systems.
Right I’m very tired now, Goodnight Everyone!
Well I’ve been very quiet recently and that’s mainly down the my mild addiction to playing with Lisp. I been beavering through Let Over Lambda which ia fantastic book on the crazy stuff in common lisp (code that writes code etc) which has been bending my mind plenty.
I’ve also got sick of how the opengl interface works and have gone on something of a spring clean. I’ve made some tools on top of the exisiting common lisp opengl library in order to make it a nicer to work with.
Its definitely not ‘lispy’ enough yet but pushing data into buffers, making vaos and managing programs and their uniforms is much easier now. I’ve got it all up on github though I wouldn’t recommend playing with it yet as I’m damn sure there will be some HEAVY changes before I’m happy with it.
Here is a quick video of me playing around with a small chunk of code which handles the rotation of the objects in the scene. Notice how errors don’t crash the program and I can simply recompile the offending function and carry on. Also note that the repl still works so I can mess around with the camera position from there.
I’m now bored of these little 3D whatchamagigs now so I need to write an importer .obj files so I can get something interesting up on the screen.