Phil Hassey - game dev blog
Phil Hassey as Snidely Whiplash
"You can't buy awesomeness.
You're born that way."

Archive for December, 2009

How to run your Xcode universal binary under Rosetta on an Intel Mac

Tuesday, December 29th, 2009

Here’s the trick. First, build your universal binary, let’s say under Debug mode. Then from a terminal …

cd build/Debug
/usr/bin/arch -arch ppc MyApp.app/Contents/MacOS/MyApp

This will launch your app using the Rosetta PPC emulator. This way you can test your Universal binaries from an i386 system 🙂

I’m doing it this way, because for some reason the ‘Right Click on Your App > Get Info > General > Open using Rosetta’ checkbox is grayed out. Oh well!

-Phil

P.S. Another technique is to go into Project > Edit Project Settings > Build > check ‘Build Active Architecture Only’ .. Then you can change your active Arch to PPC and the build will only include PPC and will run.  Just be sure to uncheck the box before you send a build to your users.

Elephants! is free on the App Store!

Wednesday, December 23rd, 2009

My gift to you: A totally FREE iPhone game! I made this game several years ago with some other way-cool game-dev friends. In “Elephants!” you save the giraffes while jumping on a rolled up squirrel! More fun than a barrel of pigeons! For Christmas this year I figured I’d port it over to the iPhone for you 🙂 Check it out!

From the dev side, yeah, this is my first attempt at “python” on the iPhone. Even though it’s actually restricted tinypy code. Here’s a sample of game code so you get the idea of what’s behind this game. All this code is converted by tinypy into C++ code so I can compile it with Xcode for the iPhone:

def elephant_new(g:Level,pos:List(int))->Sprite:
    s = Sprite('elephant',pygame.Rect(43-14,8,28,48))
    s.rect.set_centerx(pos[0])
    s.rect.set_bottom(pos[1])
    
    g.sprites.append(s)
    
    s.ball = ball_new(g,(int(s.rect.get_centerx()),int(s.rect.get_bottom())))
    s.suit = ElephantSuit()
    s.vy = 0
    s.vx = 0
    s.jump = 0 
    s.facing = 'e'
    s.score = 0
    s.z = 1
    s.state = 'live'
    s.name = 'elephant'
    
    return s

Merry Christmas – Free game from Galcon.com – Elephants!

Wednesday, December 23rd, 2009

Our gift to you: A totally FREE iPhone game! I made this game several years ago with some other way-cool game-dev friends. In “Elephants!” you save the giraffes while jumping on a rolled up squirrel! More fun than a barrel of pigeons! For Christmas this year I figured I’d port it over to the iPhone for you :) Check it out!

Elephants! First python + pygame game submitted to App Store :)

Saturday, December 19th, 2009

So, I managed to submit a “python” app to the App Store — “Elephants!” Here’s a few crazy things I had to work out to get things going:

  • I found that ObjC doesn’t care much for C++ objects that do their own reference counting.  To have a “Game” object at all, I had to use a pointer to my object instead of using my reference counting object.  It seems that during some of the “magic” of ObjC it copies objects without calling any of the C++ copying methods, so reference counting gets killed.
  • I ported a basic subset of pygame to tinypyC++ and made it work under openGL.  I don’t have this available in my tinypyC++ repository because it takes a good deal of prep-work to use (isn’t out-of-the-box) so it wouldn’t be generally useful to anyone yet.
  • I was able to get pause on call / resume working by saving the game state to a text file.  Since tab-separated files are so easy to create and parse in python this seemed to be the easiest route to getting the project done.
  • I learned a ton about C++ templates.  I still haven’t even touched the tip of the iceberg, and I’m not sure I want to, but at least I’m getting the basics down and that seems to be enough for me to stumble through this project with.

You can check out my current progress at svn://www.imitationpickles.org/tinypy/branches/tinypy2 (in the tinypy/example folder you can check out a julia fractal demo.  It also includes a mini pygame module that depends on SDL not OpenGL, so it actually works out-of-the-box.)

Here are some things I’ve been adding this week in preparation for my next project:

  • I’ve added “weak pointers” .. Since reference counting has the problem of cyclic references never getting collected, I had to do this for some use-cases.  In tinypyC++ weak pointers are just normal pointers, and if the object is collected, the pointer will be invalid, so be careful.  They are created by doing stuff like “x = ptr(GameData())”
  • I’ve added more C style types.  I’ve got uint16, cstr, Array, etc.  This all makes it possible for me to have a different kind of object – a struct in tinypyC++.  The struct is meant to be a C oriented type that can be saved directly to disk.  In Elephants I serialized via saving CSV data.  In the future, if I keep all the game state in C struct type data, I can just use a single simple line like “open(‘data.txt’,’wb’).write(struct_dump(game_data)”
  • I found that STL extensions include a “hash_map” which turns out to be about 2x as fast as the normal “map”.  I’m using that now.

I’m not entirely sure how useful this project is going to be for anyone else, or even for me for that matter.  But I think after my next game project I’ll have a much better feel for what the situation is.  TinypyC++ has some real tradeoffs in terms of being a bit of a hybrid of C++ and of python.  It doesn’t offer the full power of either language.  But I’m doing my best to capture a middle ground between them that will make my life easier.

Restricted tinypy to C++ compiler

Tuesday, December 1st, 2009

elephant1I’ve spent the last week working on a tinypy to C++ converter.  It works!  See the screenshot to the right – I’ve managed to port a pygame game over to C++.

Here’s how (and some of the catches):

  • I require type annotation of all the functions and methods.  “def test(x:str)->str: return x”
  • I do two passes on each file, the first pass to catch all the function types and class members, and the second pass to generate the code.
  • I generate C++ code that has automagic reference counting.  So you have to code your script so it won’t have any cyclic references if you want garbage collected for you.

How is this different from shedskin (really cool project!)?

  • Built-in reference counting, instead of using libgc.
  • I require the user to type annotate everything.
  • It only supports a subset of the tinypy subset of python.  Shedskin supports a much larger subset of python.

So what’s the point?

  • Well, I learned a lot about STL and C++.
  • I know it will produce iPhone friendly code, I’m pretty sure libgc isn’t iPhone friendly?  (At least, I haven’t found anything via a few searches…)
  • Way less magic.  Since everything is annotated, there are no surprises.
  • Implementing C++ modules is pretty easy – the code can be inlined within the python code and it just works.
  • This will make it easier for me to develop C++ games.

Anyway, if you’re super brave, you can check out svn://www.imitationpickles.org/tinypy/branches/tinypy2 .. I don’t have the elephants example in there, but the pygame.py that I include gives you a pretty good example of a complex module.

I’m going to chat with the tinypy folks to see if we’ll merge this into the tinypy trunk or have it as a separate project.  I’m not quite sure what makes sense to everyone else 🙂  The nice bit about merging this in is that I could unify the test suites nicely.  And tinypy would still function as normal, just better tested, and with function annotation parsing supported.  All that said, I should make a tinypy module for tinypyC++ so that I can do some code evals!