I'm the co-founder and programmer of Nakai Entertainment (www.NakaiEntertainment.com), a small mobile games company in Raleigh, NC. I talk a lot about programming, game development and design, and games engines like Unity3d and Unreal.
Friday, December 18, 2009
Flying and broken seatbelts
I flew out to LA today to visit the family for the holidays. The travel time got off to an ominous start when I noticed my seatbelt wasn't actually connected to the seat. That was a weird couple of seconds, holding part of my seatbelt completely free from the seat anchor, and wondering if it was a sign to not fly. Luckily a flight attendant was there to fix the problem.
Sunday, July 26, 2009
Reopened my EVE Online account
So I did something I know I shouldn't have...I started playing EVE Online again. It's a huge time sink, and as some of my co-workers joke, it's basically a glorified spreadsheet...but for some reason I had to see what all changed.
I must admit things have changed quite a lot in the 2 years I've been away. A number of new ships have been introduced, the power blocks have shifted quite a bit and some new features have made drastic changes to what you can do...but at the core it's still the EVE I remember. Hopefully I'll be able to pull myself away from it soon to talk about it more.
Oh, and the family reunion I had a few weeks ago was great, always good to see the family.
I must admit things have changed quite a lot in the 2 years I've been away. A number of new ships have been introduced, the power blocks have shifted quite a bit and some new features have made drastic changes to what you can do...but at the core it's still the EVE I remember. Hopefully I'll be able to pull myself away from it soon to talk about it more.
Oh, and the family reunion I had a few weeks ago was great, always good to see the family.
Wednesday, July 8, 2009
Vacation phobia
I'm heading out for a (very) short vacation tomorrow, something I'm both looking forward to and dreading. On one hand, I can't wait to spend some time in the sun, not thinking about work and visiting family. On the other hand, vacation means traveling, lines, security, chasing baggage, sitting next to someone annoying on the plane, plane restrooms...the list goes on.
I'm neurotic about flying, mainly because I hate, hate, hate feeling rushed at the airport and worrying if I'll miss my flight. Because of that, I usually always get to the airport 2 hours early (like they recommend) and end up sitting around for 1.5 hours waiting. That's fine with me though, just being able to sit around, reading, relaxing and not worrying if I'll make it to the plane is my perfect way to start a trip. Also, I take guilty pleasure watching other people freak out because their plane is boarding, and the security line is 30 minutes long. Does that make me a bad person?
I'm neurotic about flying, mainly because I hate, hate, hate feeling rushed at the airport and worrying if I'll miss my flight. Because of that, I usually always get to the airport 2 hours early (like they recommend) and end up sitting around for 1.5 hours waiting. That's fine with me though, just being able to sit around, reading, relaxing and not worrying if I'll make it to the plane is my perfect way to start a trip. Also, I take guilty pleasure watching other people freak out because their plane is boarding, and the security line is 30 minutes long. Does that make me a bad person?
Sunday, June 28, 2009
Random act of kindness
I decided to hit up a coffee shop today so I could get out of the apartment and get some work done on the mythical iPhone game I'm trying to make. I was at the counter, ordered my coffee and reached for my wallet and...yeah, no wallet. Extremely embarrassed I told the young lady behind the counter I'd forgotten my wallet and I would run home real quick to get it (luckily I live very close). I quickly walked out and headed for my car, and was almost there when I heard, "sir...sir here's your coffee".
The barista had actual run out of the shop to catch me and give me a coffee, on the house, so I didn't have to go all the way back home. It was a very nice gesture, especially since I wasn't expecting it and really didn't mind running home to get my wallet. We joked on the way back into the shop when I told her I thought she'd told me to go home, and she couldn't believe I thought she'd said something so mean.
So Kristen, and Caribou Coffee, thanks for the happy experience today, I'll be back soon.
The barista had actual run out of the shop to catch me and give me a coffee, on the house, so I didn't have to go all the way back home. It was a very nice gesture, especially since I wasn't expecting it and really didn't mind running home to get my wallet. We joked on the way back into the shop when I told her I thought she'd told me to go home, and she couldn't believe I thought she'd said something so mean.
So Kristen, and Caribou Coffee, thanks for the happy experience today, I'll be back soon.
Monday, May 25, 2009
Python script follow-up
I thought I'd give a little follow-up to the Python script I mentioned in an earlier post.
The script is more or less finished for now, however there are a couple things I'd like to clean up and improve to make it a little more general purpose and easy to maintain. One of the big things that annoys me is the size of the script, right now it weighs in at about 1k lines. Luckily a lot of this is empty lines and heavy comments, however there are some areas I can refactor to improve readability and reduce duplication. Overall though, I'm very happy with how the script turned out. It took me about 6 days to get it thought out, designed and implemented up to this point. While this is longer than I hoped it would take, the results definitely speak for themselves. The person using this script has been extremely happy with it and how much time it saves him when he needs to do a Perforce sync.
One thing I had trouble with was analyzing Perforce actions in order to determine what to perform on the target server. From what I found, there are five file operations you need to be able to support (as of Perforce v2008.2):
The script is more or less finished for now, however there are a couple things I'd like to clean up and improve to make it a little more general purpose and easy to maintain. One of the big things that annoys me is the size of the script, right now it weighs in at about 1k lines. Luckily a lot of this is empty lines and heavy comments, however there are some areas I can refactor to improve readability and reduce duplication. Overall though, I'm very happy with how the script turned out. It took me about 6 days to get it thought out, designed and implemented up to this point. While this is longer than I hoped it would take, the results definitely speak for themselves. The person using this script has been extremely happy with it and how much time it saves him when he needs to do a Perforce sync.
One thing I had trouble with was analyzing Perforce actions in order to determine what to perform on the target server. From what I found, there are five file operations you need to be able to support (as of Perforce v2008.2):
- Add - Operation executed when a file is added to P4.
- Delete - Operation executed when a file is deleted from P4. Also issued when a renaming is done (old file is deleted)
- Branch - Operation executed when an existing file is copied to create a new, separate file. Also issued when a renaming is done (new file is branched). In both cases the new file's first operation will be 'branch', not 'add'.
- Integrate - Operation executed when an update from another file is integrated into the file in question. This is very similar to an 'edit' operation, however P4 tracks 'integrate' differently because there is now a relationship between the 2 files when an integration is done.
- Edit - Operation executed whenever a file is modified and submitted.
Figuring out Objective-C++
Today I was tinkering with Xcode and Objective-C while trying to think up some ideas for iPhone apps. Eventually, I found myself trying to get some C++ code to compile and execute in the small iPhone test project I had setup and running. Getting this to work actually took me a bit of time to figure out, and looking back I think it's because I had some trouble grasping the conceptual idea of how Objective-C/C++ and vanilla C++ interact.
I started out creating a new C++ class MyTest with a .cpp and .h file. Once that was compiling, I tried hooking the MyTest class into the project's main.m file by include'ing the .h file and calling:
MyTest* test = new MyTest();
Needless to say, the compiler would have none and this made its opinion very clear with several errors. After reading up on Google and toying around, it finally hit me what I'd done wrong. The problem here is 'new' is C++ syntax, and the main.m file is being compiled as an Objective-C file(courtesy of the .m extension), so the compiler didn't understand what was going on. Additionally, my class's header file wasn't being properly read because it contained a C++ class definition, not an Objective-C definition. Once this light went off, I understood why the Objective-C++ (.mm) extension is needed; it allows Objective-C and C++ syntax to co-exist within the same file. To fix this, I hooked the MyTest C++ .h and instantiation into a separate Obj-C class file and changed the extension on said file to .mm. This compiled and ran just as I expected.
I started out creating a new C++ class MyTest with a .cpp and .h file. Once that was compiling, I tried hooking the MyTest class into the project's main.m file by include'ing the .h file and calling:
MyTest* test = new MyTest();
Needless to say, the compiler would have none and this made its opinion very clear with several errors. After reading up on Google and toying around, it finally hit me what I'd done wrong. The problem here is 'new' is C++ syntax, and the main.m file is being compiled as an Objective-C file(courtesy of the .m extension), so the compiler didn't understand what was going on. Additionally, my class's header file wasn't being properly read because it contained a C++ class definition, not an Objective-C definition. Once this light went off, I understood why the Objective-C++ (.mm) extension is needed; it allows Objective-C and C++ syntax to co-exist within the same file. To fix this, I hooked the MyTest C++ .h and instantiation into a separate Obj-C class file and changed the extension on said file to .mm. This compiled and ran just as I expected.
Tuesday, May 12, 2009
Stupid brain
I keep meaning to post new stuff on here, however my brain always goes dead as soon as I log onto blogger. What makes things more frustrating is during the day, something usually comes up that would be great to talk about. I'm giving serious thought to carrying a pen and paper wherever I go, that way I can take notes on my day and give my brain a kick-start.
I finally finished the Python script I talked about in an earlier post. It ended up being quite a bit more challenging that I thought, and I know it has a lot of room for improvement. However for the short amount of time I spent on it, I'm quite happy with how it turned out and how well it works. There something magical about taking a task which would normally take a couple hours, and seeing it happen in a few seconds. Cross sync'ing the contents of a project in 2 Perforce servers is probably one of the most horrific and mind numbing tasks I've ever done.
I finally finished the Python script I talked about in an earlier post. It ended up being quite a bit more challenging that I thought, and I know it has a lot of room for improvement. However for the short amount of time I spent on it, I'm quite happy with how it turned out and how well it works. There something magical about taking a task which would normally take a couple hours, and seeing it happen in a few seconds. Cross sync'ing the contents of a project in 2 Perforce servers is probably one of the most horrific and mind numbing tasks I've ever done.
Monday, May 4, 2009
Adventures in Python
A couple days ago at work we realized we'd need a script to automate a process that is incredibly error prone and mind-numbingly boring. Naturally I volunteered for the task, seeing as it would give me a chance to try some new things and challenge myself to think outside the box. To create the script I decided to use Python, partially because I've used it before and wanted to get a refresher, and partially because there is a nice API library available to assist what I'm working on.
The project I'm working on is to automate some Perforce tasks, and thankfully there's an API plugin for Python (aptly named P4Python) to make interacting with a Perforce server a snap. This API has been very nice to work with, it allows me to do server queries for Perforce files and recieve the results as lists or dictionaries. In a previous project I did something very similar, however to get information from Perforce, I had to run a commandline query, direct the results into a file, then parse the file. It was very cumbersome and difficult to develop and debug.
Working with Python has been somewhat of a culture shock. I've spent most of my time working in strongly typed languages, so getting adjusted to Python's dynamic type language system has been weird. I will say, being able to simply create a new variable and not worry about type declaration or memory management is great for quick iteration and turnaround. One thing that keeps biting me though is indentation being used as block delimiters. Apparently my fingers love hitting the delete key without me realizing it, so I often get errors about a certain block of code not being indented correctly.
The project I'm working on is to automate some Perforce tasks, and thankfully there's an API plugin for Python (aptly named P4Python) to make interacting with a Perforce server a snap. This API has been very nice to work with, it allows me to do server queries for Perforce files and recieve the results as lists or dictionaries. In a previous project I did something very similar, however to get information from Perforce, I had to run a commandline query, direct the results into a file, then parse the file. It was very cumbersome and difficult to develop and debug.
Working with Python has been somewhat of a culture shock. I've spent most of my time working in strongly typed languages, so getting adjusted to Python's dynamic type language system has been weird. I will say, being able to simply create a new variable and not worry about type declaration or memory management is great for quick iteration and turnaround. One thing that keeps biting me though is indentation being used as block delimiters. Apparently my fingers love hitting the delete key without me realizing it, so I often get errors about a certain block of code not being indented correctly.
Thursday, April 23, 2009
Finally online
So I finally got around to setting this up. I put off doing this for about 2 months because I couldn't figure out a name I liked. Sounds insane now that I think about it...but I'm a stickler for little details like that.
I decided to start this so I could share some of the experiences, lessons, tricks and tweaks I've come across during my time as a games/serious games developer. What are serious games? The short answer is using game technology and ideas to develop engaging training software (Wikipedia's definition if you like). Before I started working full-time, I spent a large portion of my college time as one of the lead programmers for the UT2004 mod Red Orchestra. That was a quite an experience, during my time there we won Phase 2 and 3 of the Make Something Unreal Contest for best FPS mod. The experience and exposure from Red Orchestra is what eventually landed me my first (and still current) job in the industry.
The next couple posts will be advice on how to break into the game industry. I know it's a pretty jaded topic, but since I lived through it I might as well share it.
I decided to start this so I could share some of the experiences, lessons, tricks and tweaks I've come across during my time as a games/serious games developer. What are serious games? The short answer is using game technology and ideas to develop engaging training software (Wikipedia's definition if you like). Before I started working full-time, I spent a large portion of my college time as one of the lead programmers for the UT2004 mod Red Orchestra. That was a quite an experience, during my time there we won Phase 2 and 3 of the Make Something Unreal Contest for best FPS mod. The experience and exposure from Red Orchestra is what eventually landed me my first (and still current) job in the industry.
The next couple posts will be advice on how to break into the game industry. I know it's a pretty jaded topic, but since I lived through it I might as well share it.
Subscribe to:
Posts (Atom)