<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6331063102506964061</id><updated>2012-01-13T11:00:14.068-08:00</updated><title type='text'>Made Simple</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-8945586869725206277</id><published>2012-01-13T09:38:00.000-08:00</published><updated>2012-01-13T10:57:51.059-08:00</updated><title type='text'>The Happy House Experiment</title><content type='html'>Hello,&lt;br /&gt;&lt;br /&gt;In the middle of 2011, I found my lease coming to an end. I had a landlord that wanted his son to live where I was living and a sudden attraction to new people and places in Raleigh while simultaneously in Durham Chapel Hill various friendships were ending along with my marriage. &lt;br /&gt;&lt;br /&gt;One of my closest new friends is Jeff Del'Romero. He has a very straightforward approach to communication and resolving conflicts. I remember the first few months going out after work with him, we would get phone numbers from half the tables at a bar. It was exhilarating to face my fear of rejection from strangers and to have so much success. &lt;br /&gt;&lt;br /&gt;I started looking for a new place about 3 months before my lease ended. Davie Circle was such a wonderful place to live that I wasn't interested in settling for a whole lot less. I could walk to downtown Chapel Hill or University Mall from there. I also wanted to live with roommates. Jeff's roommates were some of his closest friends and they all enjoyed playing board games and going out together and playing pool and other group activities. I wanted something like that, a living with friends situation. Jeff was already on a month to month arrangement with his landlord, and another roommate was leaving Raleigh to go to school back home.&lt;br /&gt;&lt;br /&gt;Quickly, it was determined that a downtown Raleigh rental situation for Jeff and I would not be very accommodating. The rent was very high and usually came with pretty tough restrictions regarding pets and parties. I started expanding my search to see if there were any crazy deals on houses next to downtown Raleigh. I didn't want to be a homeowner, but I wasn't going to rent a spot with a roommate who sleeps lightly from 10PM onward. I wanted to be involved in the decision about who I would be living with. After a few weeks of searching, I found two houses that I liked. One was on Boylan Avenue near Western Blvd, but the list price was over $300k, and the other one was at the edge of a neighborhood with high crime rate. Because I was a 1099 contractor and hadn't been at my new job for very long, it took an amazing effort and several months just to get a pretty crappy loan for the cheaper house. Because of my separation agreement, I didn't have much to put towards a down payment.&lt;br /&gt;&lt;br /&gt;Four of us occupy the four bedrooms of this 1300 square foot house and we pay into a pool from which food and alcohol are purchased. Its nice to be able to accomodate guests without unnecessary concerns about whose beer is being consumed. We also save individually because bulk prices tend to be lower than buying small amounts more frequently. We have a pretty late schedule at the house, and are grateful that the sound is well insulated from the outside of the house. We have had no noise complaints from neighbors so far.&lt;br /&gt;&lt;br /&gt;There are interesting lessons here. First, incentives drive behavior. By providing food and alcohol from a pool, guests can be invited over trivially easy and entertained properly, but there is also an incentive to abuse the system. We've worked all that out because of lesson #2. Character trumps incentive. An honest worker will tend to perform well for a client regardless of hourly or fixed bid payment, and an honest client will pay what is owed when the agreed conditions are met.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-8945586869725206277?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/8945586869725206277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2012/01/happy-house-experiment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8945586869725206277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8945586869725206277'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2012/01/happy-house-experiment.html' title='The Happy House Experiment'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-6206366178934907750</id><published>2012-01-02T19:33:00.000-08:00</published><updated>2012-01-02T22:14:43.272-08:00</updated><title type='text'>Rollicking OpenGL ES Performance Adventure</title><content type='html'>I just got done with a crazy weeklong stint of development on my new game. Really, what I did was untangle a neverending mess that started with the downloading of a new Provisioning Profile for BoatGame. This is a good story for those who are curious what exactly a game developer does for a living.&lt;br /&gt;&lt;br /&gt;First off, let me tell you a strange story that is true. Code rots. Just like logs in the woods. This log is RopeBurn, my ill fated but altogether lovely little game which is earning me nearly $4 a quarter, waiting for someone to rediscover on an emulator in 50 years. I'll warn you, its easier to get a new log than restore the old one.&lt;br /&gt;&lt;br /&gt;Last year, the utterly amazing and horrifying 2011, was a "growth" year, meaning that I did a bunch of partying and socializing and swapping out some long time friends for new ones (usually involuntary) and minimal extra efforts on any extracurricular activities. On Halloween 2011, I arrive in Vietnam to fulfill a client contract for my employer and become good friends with a European 3D artist who has had a freakishly similar upbringing and career to my own. He motivated me to start a new project with him, and 2012 seems like a pretty good year to be productive in.&lt;br /&gt;&lt;br /&gt;A few days after Christmas, I start the new project, using the tried and true methods of anyone familiar with IT, by copying and pasting a directory and searching and replacing some names, generally turning "RopeBurn" into "BoatGame". iOS development comes with this crazy locked down system of certificates that requires cryptic console commands and many order dependent steps. iOS development is easy until it does not work, and then it is difficult to figure out what is breaking, but what's new with software development tools. That's always been how it is. We're supposed to be making snappy lightweight programs, but we write them on these bloated monoliths that topple this way and that. I then fiddled with the XCode project to use the new certificates. I got stuck for awhile trying to understand why the debugger refused to believe that BoatGame was on the iPad, even though I saw the icon and could run it, but then I remembered a sneaky way out.&lt;br /&gt;&lt;br /&gt;I could just install XCode 4. It would be like a big reset of whatever mess I left on this laptop. I could just follow the directions and viola! I could have everything working in the same few hours, except this would involve drinking wine and watching a progress bar and seeing who the roommates brought in. You know, I used to be of this mindset not to upgrade ever, and to maintain a static working environment, but I have learned over the years that upgrades are often easy fixes to mystifying problems. I learned that mystifying problems are often bugs in the dependencies. That's what I get for not writing my own compiler.&lt;br /&gt;&lt;br /&gt;So I installed XCode 4 and suddenly everything is working, I can debug on the iPad, except that I keep having to reset the iPad every one or two debug runs. A debug run is when I write the tiniest bit of new code that would cause a visible change, and then I run the game to see how the new code changed what I see on the screen. It is important to be able to perform these little changes quickly, because I do not have written notes about the algorithm that I am debugging, just a bunch of code to stare at and random thoughts of trees and grids and whatnot in my head. Resetting the iPad takes two minutes. A quick run can be done in about 20 seconds. Two minutes feels like forever.&lt;br /&gt;&lt;br /&gt;I try to restore the iPad, but there are none of my previously installed iOS images available in the XCode drop down. I take the plunge, updating the iPad to whatever the latest and greatest happens to be. I know that this version of iOS is probably designed to work better with XCode and I wouldn't have to reset the iPad constantly.&lt;br /&gt;&lt;br /&gt;Well, I did change a few things by this point. Remember, everything that I just told you is just the stuff that I have to do to do the stuff that I need to do. I like to write game code and graphics code. I want to make a visible thing, and then make it do something. I don't like to google error messages and restore iPads to factory settings and find bugs in the Windows NVidia OpenGL drivers. I like to &lt;a href="http://www.programming-motherfucker.com/"&gt;program&lt;/a&gt;. I had changed a number of graphics, and turned the tapering grass and ceiling style terrain to a curvy beach island. The new algorithm took up significantly more triangles than the old one. Now that I could switch between the debugger and the profiler easily, it would be simple to optimize my game, which was good since it was no longer hugging a solid 60 frames per second.&lt;br /&gt;&lt;br /&gt;Well, here's the funny thing. Once the tool could tell me what was going on, it became very clear I had some serious unresolved issues. This new iOS had some new graphics driver inefficiencies, and my redundant state commands needed to be removed. The problem is essentially this. Say that I give you a paintbrush and blue paint. I ask you to paint a board on a wall blue. Then I ask you to wash the brush clean, and I'll think about what color I want you to paint next. I think we both can imagine a more efficient method of working together. I wrote an algorithm to manage multiple types of paints and layers, bringing the game from 34 fps to 39 fps.&lt;br /&gt;&lt;br /&gt;Then, the panick hit. I brought the hundreds of redundant commands per frame down to less than 10, and the framerate didn't change very much. The last little bit wouldn't be worth the effort and the framerate was still far short of 60. I found a nifty new tool that came with XCode 4, called the OpenGL ES Performance Detective. It is very easy to use. I tell it which program to run on the iPad, and when I am ready, I click a button on the Mac and suddenly a progress bar starts going while the iPad freezes up and appears to crash. I see a message on the Mac warning me not to mess with the iPad and the iPad displays a funky little screen with this wierd gear lock key thingie, for developers only I suppose. Come to my house sometime and I'll show you, but I warn you that unless you are drunk, its going to be a disappointment. &lt;br /&gt;&lt;br /&gt;Anyhow, the OpenGL ES Performance Detective finishes chomping on whatever data it managed to glean from the iPad and displays a text readout with suggestions on how to speed up the program. OpenGL was at fault, not the CPU. I knew that from the 2% usage, but thanks. There were other interesting hints, and something about Vertex Array Objects. Well, this is a funny thing in programmer land, but we have no problem making up confusing names, but we do it differently than doctors. Doctors like to make up long funny names from languages no one uses, producing words that don't appear to have any meaning, but supposedly we can trust them that the whole word does. Programmers like to do something like that, but we like to take small sets of words that have a specific meaning and change one word to come up with another meaning for the phrase, and to top it all off, toss in some abbreviations. VBOs and VAOs are not the same thing. One is a vertex buffer object, an earlier lesson in using pointless refactoring to limbo the entire game under some crappy graphics driver's limitations. The other is a vertex array object, which stores just a little bit more information about a triangle mesh and allows me to use one command to perform the usual extra steps in one command. This ended up being a dead end, although I did get the game up to 42 fps with a minimal change in just one part of the graphics engine.&lt;br /&gt;&lt;br /&gt;I start googling and discovered that the panic was well founded. The iPad barely has enough fill rate to do 60 frames per second. This didn't quite seem right since Carmack supposedly got Rage to run on the iPad at 60fps, but that's what the article was saying and I was seeing. I was even able to find good confirmation of this fill rate limitation. It didn't seem right, because RopeBurn was less efficiently written than what I currently had BoatGame doing, and it always ran at a solid 60. I could turn off just the water, which was nothing more than a single giant quad with a GL_REPEAT water texture, and get a solid 60 fps.&lt;br /&gt;&lt;br /&gt;As a last ditch effort, I added a depth buffer. If the grass is drawn above the water, first, then the depth buffer can be used to stop some of the water from getting drawn. A little more fps gain after I get past the white screen problem. That problem ended up being an undocumented OpenGL ES requirement, that the last render buffer bound is the color buffer, not the depth buffer, which shouldn't have mattered because I already bound the frame buffer. &lt;br /&gt;&lt;br /&gt;I sprinkled more fine tuned OpenGL state control and used it to allow me to skip some slightly costly operations. Opaque objects can be drawn quicker than transparent objects. Objects that aren't used to block other objects don't need to write to the depth buffer. The depth and color buffers can be discarded at the end of each frame. There is this special little discard buffer command and sure enough, I got another fps.&lt;br /&gt;&lt;br /&gt;Right now, my game runs at 50 fps. I can't conceive how to make it any more efficient. I am frustrated, because I now know that iOS 5 has some serious OpenGL performance bottlenecks, and that this is a widely reported problem on older iOS devices. I don't have a convenient downgrade path back to a performant iPad 1. I have an engine that is nominally optimized for newer iOSes. I could live with [displayLink setFrameInterval:2]; or get an iPad 2. Decisions, decisions. People are biting at my $350 offer for the iPad, so maybe I can make this sale and justify spending $100 for a solid 60 fps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-6206366178934907750?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/6206366178934907750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2012/01/rollicking-opengl-es-performance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6206366178934907750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6206366178934907750'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2012/01/rollicking-opengl-es-performance.html' title='Rollicking OpenGL ES Performance Adventure'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-9195617349479236999</id><published>2011-04-16T15:41:00.000-07:00</published><updated>2011-04-16T20:41:15.197-07:00</updated><title type='text'>Letter to a friend</title><content type='html'>The spiritual world is among us, and it affects each person. According to the biblical perspective, relationships are the one thing that we take into the next life. Even among secular-minded groups, eulogies, funerals, obituaries, biographies, awards to deceased scientists or other ambitious individuals, it is a given that something about the effect that an individual had while alive, stays with the living friends. Sure, we can look at cause and effect and both arrive at the conclusion that ideas, thoughts, and social viewpoints reinforce this common social belief that a person can die, yet "live on in our hearts". I tend to believe my gut feelings, perhaps you do too, and as much as evidence doesn't make it clear which to choose (belief in afterlife or annihilation), I have sometimes chosen towards God. The bible says that it is possible to not obey God, even if you saw a body raised from the dead. Belief or unbelief is a choice among reasonable looking options. Its much like a walk in the woods at night with a flashlight, you only discover more of what you are exploring.&lt;br /&gt;&lt;br /&gt;The origin of the universe, the origin of life, the origin of mathematics, the origin of a diverse and interesting set of physical laws, with edge cases such as electricity which can be exploited in order to do cool things that follow the edge of man's ability to dream, beauty, these things are all unexplained, mysterious, and an integral part of our existence. They emerge in our mind, possibly 100% explainable with physical laws, but there still is the question, of why this possibility, rather than other possibilities.&lt;br /&gt;&lt;br /&gt;What does one do with a life? This cannot be answered without accepting one worldview, living out the life, and hopefully being attentive to feedback that life gives, so that you can tune your game, and completely change strategies when necessary. The fact that so many Christians, myself included until recently, can offend with activism and outreach, and think, "gee this is hard, I need to try harder", when "you only have the right to speak into a person's life as much as you become their friend" is the truth, that's a problem. As far as I am concerned, only 3 worldviews seem useful or correct enough in their compatibility with science, and the first is something that is either mostly correct, or just a very useful conceptual model that doesn't seem to contradict the other two in significant ways.&lt;br /&gt;&lt;br /&gt;Buddism says that the point of life is to feast. To be yourself. The idea is that all pain and suffering comes from one's focus on self. Begin being aware of all, perceptive of what is outside of ourself, and there is an agreement in spirit and intent with the biblical message of "die to self and live". The ultimate goal is to feast on the experience of being alive by using your life to bless the other individuals around you, helping lead them, and being generous to them, and working with a servant's heart.&lt;br /&gt;&lt;br /&gt;Christianity just goes a step further, and there is this second identity, really a unique person, whose personality is a superset of all personalities on this planet, in their purest form, without any corruption, shining brightly with the depth of the undiscovered abilities within us. Jesus is both Man and God, and He is limited in the same way that a man is limited by, which is to say that an eternity from now, there will be a complete revelation of God to each individual who lives in Heaven.&lt;br /&gt;&lt;br /&gt;Atheism is a sensible worldview, in the sense that combined with activism, socialization, volunteerism, or other motivating viewpoints on what's important to do with one's life, it provides what currently appears to be a complete system within our universe, for both the origin of the universe and what to do with one's life.&lt;br /&gt;&lt;br /&gt;I think that why do I exist and who am I are important questions, and would not be satisfied with just a realistic answer and then just going along in it. Eventually, we all could reach a place in life where we question our mortality, and the pointlessness of it all, and may choose to do anything. The world you see, it is a test, and it is a fucked up version of what is supposed to be, but still shows a taste of all the options in the afterlife, a clash of two systems. I think from how you've spent your time, you also figured out that paychecks aren't a reason to live a life, although they are nice to get, sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-9195617349479236999?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/9195617349479236999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/04/letter-to-friend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9195617349479236999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9195617349479236999'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/04/letter-to-friend.html' title='Letter to a friend'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-802582701498444320</id><published>2011-03-28T22:18:00.000-07:00</published><updated>2011-03-29T21:32:41.489-07:00</updated><title type='text'>Windows port of RopeBurn (runs great on older PCs)</title><content type='html'>See disclaimer at bottom of this post!&lt;br /&gt;&lt;br /&gt;Email ptymn1447 at hotmail. Attach a picture/link to youtube video of yourself playing RopeBurn on an iPad, a picture/video that you are willing for me to publish on this blog, and I will send you a Windows build of RopeBurn that will run fine on just about any PC. &lt;br /&gt;&lt;br /&gt;iPhone, OSX versions coming soon. I will also be working hard to reduce load time, reducing the download size, and adding a few new gameplay elements. I hope that you have found in RopeBurn an intriguing game with rich gameplay * and some unique strategic thinking ** ***. &lt;br /&gt;&lt;br /&gt;Also, you will have the ability to create your own levels on the desktop versions, using 100% fully open source software. (Inkscape, in case you wondered.). It's pretty neat...&lt;br /&gt;&lt;br /&gt;* Remember to use all your fingers and sweep up those coins. &lt;br /&gt;** Not all stars speed you up all the time.&lt;br /&gt;*** Your position and speed when the rope first connects with the star can cause varied results. Experiment to see if you can get to new places or combine with jumps to skip entire sections.&lt;br /&gt;&lt;br /&gt;P.S. If any user levels are sent to me, and are high quality enough to be included in a future version, I'm happy to talk rev-share with you; doubly so, if you can make really cool graphics. I think that you'll find the game engine to be fun to make new games with.&lt;br /&gt;&lt;br /&gt;******* The exact details of this offer, or its existence are subject to change, and those details are reflected in updates to this particular blog post and no other source, until superseded by www.ropeburngame.com, coming soon. *********&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-802582701498444320?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/802582701498444320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/03/windows-port-of-ropeburn-runs-great-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/802582701498444320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/802582701498444320'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/03/windows-port-of-ropeburn-runs-great-on.html' title='Windows port of RopeBurn (runs great on older PCs)'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-6927296959917321162</id><published>2011-03-21T16:14:00.000-07:00</published><updated>2011-03-21T16:17:17.132-07:00</updated><title type='text'>RopeBurn is for sale!</title><content type='html'>RopeBurn is live in the app store! I'm thrilled!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-6927296959917321162?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/6927296959917321162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/03/ropeburn-is-for-sale.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6927296959917321162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6927296959917321162'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/03/ropeburn-is-for-sale.html' title='RopeBurn is for sale!'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-3383187435515057355</id><published>2011-03-16T12:45:00.000-07:00</published><updated>2011-03-16T12:46:40.598-07:00</updated><title type='text'>RopeBurn is in review!</title><content type='html'>w00! RopeBurn is in review on iTunes Connect. I hope it passes and gets into the app store soon. I can't wait to start watching copies get sold, and to feel the satisfaction that other people get to try RopeBurn. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-3383187435515057355?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/3383187435515057355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/03/ropeburn-is-in-review.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3383187435515057355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3383187435515057355'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/03/ropeburn-is-in-review.html' title='RopeBurn is in review!'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-7663527356799244227</id><published>2011-03-12T21:34:00.000-08:00</published><updated>2011-03-12T21:37:51.333-08:00</updated><title type='text'>Fixing codesign exits with return value of 1</title><content type='html'>Every other time I was trying to build and run for an ios device, I was getting a codesign exits with return value of 1. Here's the steps that fixed it.&lt;br /&gt;&lt;br /&gt;Remove all .mobileprofile files that have GUID filenames from ~/Library/MobileDevice/Provisioning Profiles&lt;br /&gt;&lt;br /&gt;Copy in your .mobileprofile file that you have just downloaded to that directory. It should not have a GUID filename. That fixed it for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-7663527356799244227?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/7663527356799244227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/03/fixing-codesign-exits-with-return-value.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7663527356799244227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7663527356799244227'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/03/fixing-codesign-exits-with-return-value.html' title='Fixing codesign exits with return value of 1'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-8495042780394770863</id><published>2011-02-09T17:11:00.000-08:00</published><updated>2011-02-09T17:15:52.635-08:00</updated><title type='text'>Two tips for iOS development</title><content type='html'>In XCode, if you have a malloc or C++ [] operator that contains a ++ incrementor or ? : shorthand, the compiler could corrupt the stack pointer for ya and cause all kinds of problems. Untested to be an issue in Objective C or .mm files.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second: do not use lowp for your vertex shader texcoord inputs, it will cause texture wrapping problems. Not sure what other implications there are to this. In my case, the game looked great on the simulator, and on the iPad, after the ground texture appeared once, the other times it had clamping occur. This is somehow related to the different way that lowp is handled in a GLSL vertex shader on the device.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-8495042780394770863?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/8495042780394770863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/02/two-tips-for-ios-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8495042780394770863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8495042780394770863'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/02/two-tips-for-ios-development.html' title='Two tips for iOS development'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1712794165309142229</id><published>2011-01-11T17:26:00.000-08:00</published><updated>2011-01-11T19:05:49.844-08:00</updated><title type='text'>SVG Box2D level loader and tilemap viewer on iPad</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VV8LWo-1uO4/TS0D2AXLaVI/AAAAAAAAAB8/qBaXwDKUu9g/s1600/ipadsample.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://3.bp.blogspot.com/_VV8LWo-1uO4/TS0D2AXLaVI/AAAAAAAAAB8/qBaXwDKUu9g/s320/ipadsample.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5561105341217466706" /&gt;&lt;/a&gt;&lt;div class="postbody" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;a href="https://github.com/timkerchmar/TrippySoftLib"&gt;https://github.com/timkerchmar/TrippySoftLib&lt;/a&gt;&lt;/div&gt;&lt;div class="postbody" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px; "&gt;The SVG parser in C++ is usable. The same SVG parser is used on the C++ side as will be demonstrated in the AS3 version. I ripped out some of the core SVG parsing routines from SVGWeb, creating MiniSVGWeb. Using a pretty generic delegate class, you can draw to Box2D or anything else if you wanted. On an actual iPad, the SVG parsing is still pretty slow.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;There are several very nice gems in this iPad app:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;1. minimal objective C (kept quarentined in a few particular files).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;2. shows a satisfying scroll/throw touch handling&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;3. renders everything with OpenGL ES 2.0 shaders &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;4. same numbers and math can be used for OpenGL or upcoming AS3 version (screen goes from 0-1024 wide on both)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;5. Allows easy override of SVG unit -&gt; box2D unit scale, and box2D -&gt; screen unit scale&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;6. Shows DrawDebugDataInAABB (which I lazily stuck directly into b2World). &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;The repository is public, so if you are interested, please use and update. This is for us all.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 1.3em; line-height: 1.4em; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px;"&gt;The Box2Scene work is still pending. Translating from AS3's containers and GC conveniences to C++'s is quite a chore.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: rgb(50, 61, 79); font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 10px; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1712794165309142229?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1712794165309142229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2011/01/svg-box2d-level-loader-and-tilemap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1712794165309142229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1712794165309142229'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2011/01/svg-box2d-level-loader-and-tilemap.html' title='SVG Box2D level loader and tilemap viewer on iPad'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_VV8LWo-1uO4/TS0D2AXLaVI/AAAAAAAAAB8/qBaXwDKUu9g/s72-c/ipadsample.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-8454989766709028977</id><published>2010-12-01T08:38:00.000-08:00</published><updated>2010-12-01T08:41:57.281-08:00</updated><title type='text'>XCode's OpenGL iOS template ported to C++</title><content type='html'>Hello,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am trying to create a portable OpenGL application that will run on the iPad. I started with XCode 3.2's OpenGL iOS application template, and modified it so that a C++ class TSRenderer does all the work. There is still a need for an application delegate and a UIView subclass, but otherwise, the port was pretty straightforward. Enjoy!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-Tim Kerchmar&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/OpenGLonIOS.zip"&gt;OpenGLonIOS.zip&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-8454989766709028977?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/8454989766709028977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/12/xcodes-opengl-ios-template-ported-to-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8454989766709028977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/8454989766709028977'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/12/xcodes-opengl-ios-template-ported-to-c.html' title='XCode&apos;s OpenGL iOS template ported to C++'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-2300991521756299591</id><published>2010-10-25T06:40:00.001-07:00</published><updated>2010-10-25T07:27:10.589-07:00</updated><title type='text'>Proposal for GPU accelerated drawTriangles/masks on iPhone</title><content type='html'>I have a game whose foreground layer is composed of a horizontally and vertically repeating texture. The level data is loaded from an Inkscape generated svg file, and the level is way too large to bitmap cache. It would take .5 gb to cache my 20,000 x 5,000 pixel levels. The terrain texture is masked a Shape that is generated from the svg level data. This means that currently, the terrain cannot be hardware accelerated.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also draw a horizontally repeating floor and ceiling texture on the top and bottom edges of the terrain, similar to how the terrain is drawn in the Worms games. Those textures are drawn using Graphics.beginBitmapFill and Graphics.drawTriangles. These items are also difficult to hardware accelerate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My thought is this, create an air build of my application that writes a giant png snapshot of the entire level. A native OSX/Win32 utility processes the png, producing a sequence of large atlas pngs with all the unique tiles from the level snapshot and an xml file with indices that point to the unique tiles in the atlases. Then, the game render loop can render the foreground layer using full hardware acceleration, converting the altases into small GPU accelerated bitmaps that are tiled to draw the foreground. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One advantage of this scheme is that small tiles can compress the level to a smaller amount of bitmap data in the atlases, and the bitmaps that are scrolled across the screen to represent the foreground layer can still be a multiple of the tile size. This allows a very smooth and flexible assembly of the bitmap resources that are required for hardware acceleration, without requiring a great amount of runtime memory usage, or requiring the slowdown of rendering a very large object to many smaller bitmaps. The CPU cost to assemble these new bitmaps before they scroll onto the screen can be spread out evenly over a few frames. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Already done: AS3 class that can draw a screen's worth of tiles to a backbuffer bitmapdata. Native app that can create tilemap and atlas from large png.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To do: Create AS3 png dumper that can write a large movieclip to a large png (when built as AIR). Modify class that draws tiles to use Bitmap objects that don't disable GPU acceleration.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-2300991521756299591?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/2300991521756299591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/10/proposal-for-gpu-accelerated.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/2300991521756299591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/2300991521756299591'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/10/proposal-for-gpu-accelerated.html' title='Proposal for GPU accelerated drawTriangles/masks on iPhone'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-997692708783157165</id><published>2010-09-11T13:29:00.000-07:00</published><updated>2010-09-11T13:39:08.014-07:00</updated><title type='text'>Flash on iOS</title><content type='html'>YES! Thank you Apple for relenting and thank you Adobe for moving forward positively. Us little guys are going to be able to just get the work done in an environment that we like. I have had a game sitting on my hard drive for the past few months, and the Objective C port was riddled with problems that prevented release. This is really good news!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-997692708783157165?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/997692708783157165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/09/flash-on-ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/997692708783157165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/997692708783157165'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/09/flash-on-ios.html' title='Flash on iOS'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-2385852458127315755</id><published>2010-09-08T09:38:00.000-07:00</published><updated>2010-09-08T10:01:54.298-07:00</updated><title type='text'>SBCL Flash Server Example</title><content type='html'>Hello Reader!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The server.lisp part is full of awesomes, but the Flash part was pretty easy to write. I'm working on a project that can compile and hot swap swfs on the fly, something that acts as a game container for me to fiddle around with in an SBCL environment, but also is meant for easy deployability. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My latest game only calls addChild to put a full screen bitmap up, and yet has performance equal to flixel, but for games that aren't tile based. I hope to quickly build up a work environment that is fun to use and will let me tweak values without constantly publishing new swfs. I also hope to use the lean and mean flash bitmap renderer that I wrote in a way that is easily translated to iPhone's UIImage or even OpenGL surfaces. Without the immediate pressure for money, but with a future that is always sure to be scattered with future iPhone/Android/Flash contracts, I would like to be able to easily deploy any game I write to any of those platforms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am somewhat disappointed in the amount of effort it took to try to use HaXe because of the awful state of its documentation. In the end, I think that they were trying to solve the right problem, but were distracted by too many other cool, but unnecessary things. All developers want, is to save on effort and be more productive. Having to hand translate a Flash application to iPhone is no joke, nor is having to integrate a data management system (even if it is just a framework for hot reloading xml files with various tweakable constants). I want the entire thing to be very suitable for quick iteration, and easy deployment. We'll see. I have attempted most of the parts of this project in the past, but never all integrated. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The gotchas that I encountered while writing this app:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. AS3's Socket.writeUTF/readUTF prefix or expect unsigned short (big endian) string lengths before the string. This requires the lisp server to use a socket stream of type (unsigned-byte 8)&lt;/div&gt;&lt;div&gt;2. Even with non-blocking mode sockets, because the underlying stream implementations are blocking, the SBCL side of this application will block.&lt;/div&gt;&lt;div&gt;3. I'm a complete idiot when it comes to asdf/packages, so what you see there is a mess.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You are free to use this code as you wish. If you make billions off of it, I may require you to buy me a beer next time you are in NC. Please let me know about nitpicky details or any issues you have. This code was only tested on SBCL 1.0.39 on OSX 10.6.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/sbcl_flash_server.zip"&gt;Download the SBCL Flash Server Example&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Example usage:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;? (load "/Users/pTymN/flisp/server.lisp")&lt;/div&gt;&lt;div&gt;T&lt;/div&gt;&lt;div&gt;? (start-server)&lt;/div&gt;&lt;div&gt;#&lt;sb-thread:thread&gt;&lt;/div&gt;&lt;div&gt;? (compile-flash-client)&lt;/div&gt;&lt;div&gt;started server&lt;/div&gt;&lt;div&gt;Loading configuration file /Users/pTymN/Downloads/flex_sdk_3/frameworks/flex-config.xml&lt;/div&gt;&lt;div&gt;/Users/pTymN/flisp/flisp.swf (1405 bytes)&lt;/div&gt;&lt;div&gt;#&lt;sb-impl::process&gt;&lt;/div&gt;&lt;div&gt;? (start-flash-client)&lt;/div&gt;&lt;div&gt;#&lt;sb-impl::process&gt;&lt;/div&gt;&lt;div&gt;? server accepted connection&lt;/div&gt;&lt;div&gt;? handler received input&lt;/div&gt;&lt;div&gt;? Receive from client 'Hello' and 'Goodbye'&lt;/div&gt;&lt;div&gt;? &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-2385852458127315755?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/2385852458127315755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/09/sbcl-flash-server-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/2385852458127315755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/2385852458127315755'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/09/sbcl-flash-server-example.html' title='SBCL Flash Server Example'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-781689420629357390</id><published>2010-09-07T18:41:00.001-07:00</published><updated>2010-09-07T18:52:57.353-07:00</updated><title type='text'>3 ways to use sb-bsd-sockets</title><content type='html'>&lt;div&gt;Using SBCL, I needed to be able to shut down a server that was blocking on a sb-bsd-sockets:socket-accept call. The first thing that I did was make a special call on the freshly created socket:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(setf (sb-bsd-sockets:non-blocking-mode *server*) t)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that, any call dealing with that socket will return immediately. I'm confused about how to put a socket into async mode in sbcl and how async is different than non-blocking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;You can read/write data using sb-bsd-sockets:inet-socket in 3 unique ways:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. socket-send/socket-receive for raw octet writing and reading. Very painful to serialize anything.&lt;/div&gt;&lt;div&gt;2. socket-make-stream and all the ordinary stream handling routines in lisp. The calls seem to block even with non-blocking sockets.&lt;/div&gt;&lt;div&gt;3. socket-make-stream + fd-handlers. Allows you to specify callbacks for incoming input and to use the regular stream routines.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For my server, I need a single threaded event loop that can respond to events generated from the user thread and fire off events to the client(s). The client is a running swf or iPhone app that can respond to messages from the server. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Any SBCL socket pros, please respond with tips or hints!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bonus note: For non-blocking client sockets on SBCL 1.0.39, I wrap the call to socket-connect in an ignore-errors block, because sockint::connect returns -1 with an errno of 36 (EAGAIN or equivalent). You can use the socket when socket-open-p returns T.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-781689420629357390?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/781689420629357390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/09/3-ways-to-use-sb-bsd-sockets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/781689420629357390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/781689420629357390'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/09/3-ways-to-use-sb-bsd-sockets.html' title='3 ways to use sb-bsd-sockets'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-6942988971535483618</id><published>2010-09-07T13:45:00.000-07:00</published><updated>2010-09-07T13:47:41.972-07:00</updated><title type='text'>Open document in SBCL on OSX</title><content type='html'>&lt;div&gt;You can use a command such as the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;(sb-ext:run-program "/usr/bin/open" '("/Users/pTymN/test/test.png"))&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That command would open test.png in Preview on my machine.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-6942988971535483618?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/6942988971535483618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/09/open-document-in-sbcl-on-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6942988971535483618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6942988971535483618'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/09/open-document-in-sbcl-on-osx.html' title='Open document in SBCL on OSX'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1855549320888769386</id><published>2010-09-03T13:27:00.001-07:00</published><updated>2010-09-03T13:38:45.343-07:00</updated><title type='text'>multithreaded trace in sbcl, and info about load</title><content type='html'>&lt;div&gt;Coming from a C++/all things with braces and semicolons background, all things lisp are still quite confusing. Here's my latest gems that I found:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;*default-pathname-defaults* will be the directory from which sbcl is launched. When you call (load "somefile.lisp"), it needs to be in the directory specified by *default-pathname-defaults* because you did not specify an absolute directory. As it turns out, the "working directory" according to your lisp implementation may have little or nothing to do with the OS "working directory" for that process. Just another oddity where lisp has decades of diverging behavior from everyone else on the planet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If I start sbcl from the Terminal (by just typing "sbcl" and hitting enter), I can try this command:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(sb-thread:make-thread (lambda () (format t "hello from a thread~%")))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and I will see the output. But from swank (which is used by slime, cusp, MCLIDE, virtually anything except possibly lispworks or the corman lisp ide), you'll only see some syntax describing a thread, and possibly NIL, which describes the return value of that lambda expression. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you happen to have textmate installed and can launch it with the command "mate" from your Terminal, then you can mate ~/.swank.lisp and add this one line to the possibly empty file:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;(setq swank:*globally-redirect-io* T)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This works for MCLIDE, and probably works for everything else too. With this line, I can see:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Welcome to SBCL 1.0.39!&lt;/div&gt;&lt;div&gt;? (sb-thread:make-thread (lambda () (format t "hello")))&lt;/div&gt;&lt;div&gt;#&lt;sb-thread:thread&gt;&lt;/div&gt;&lt;div&gt;hello&lt;/div&gt;&lt;div&gt;? &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Without that ~/.swank.lisp file, I would not see the "hello" line. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As always please leave comments or questions if you need help getting lisp up and running on your laptop. I am part of the new guard, those who are happy to help other lisp newbies without being insulting. Erik and those other guys are probably brilliant minds, but they were a pain in the ass, and sometimes I think that common lisp reflects that mindset in some ways.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1855549320888769386?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1855549320888769386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/09/multithreaded-trace-in-sbcl-and-info.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1855549320888769386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1855549320888769386'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/09/multithreaded-trace-in-sbcl-and-info.html' title='multithreaded trace in sbcl, and info about load'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1443359432405887226</id><published>2010-08-29T18:11:00.000-07:00</published><updated>2010-08-29T18:50:44.807-07:00</updated><title type='text'>A mistake and a lesson on MacPorts</title><content type='html'>So I was cleaning up my user directory, which I haven't done since I got this laptop almost a year ago. I deleted ~/ports, apparently a bad call. If you see the "Warning: Can't open index file for source" error from most port commands, try editing one of the .conf files in /opt/local/etc/macports. Because macports was located in /opt/local/var/macports and had a ~/.macports folder, I didn't even think to look in yet another spot for the ACTUAL .conf files that affected my macports installation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1443359432405887226?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1443359432405887226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/08/mistake-and-lesson-on-macports.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1443359432405887226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1443359432405887226'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/08/mistake-and-lesson-on-macports.html' title='A mistake and a lesson on MacPorts'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-5642031882526224178</id><published>2010-08-12T09:37:00.000-07:00</published><updated>2010-08-12T09:52:24.386-07:00</updated><title type='text'>Tips for SBCL MacPorts if running sbcl complains about missing sbcl.core</title><content type='html'>If you see one of these errors when launching MacPorts sbcl from Terminal, &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- contains the words "sbcl.core"&lt;/div&gt;&lt;div&gt;- version is wrong&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;first, edit ~/.MacOSX/environment.plist, even if it doesn't exist. Mine is:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;"SBCL_HOME" = "/opt/local/var/macports/software/sbcl/1.0.39_0+html+threads/opt/local/lib/sbcl";&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, reboot. If sbcl still does not work, or is the wrong version, then &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;sudo rm -f /opt/local/bin/sbcl&lt;/div&gt;&lt;div&gt;sudo port uninstall sbcl&lt;/div&gt;&lt;div&gt;sudo port install sbcl +threads&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Threading support may cause issues, but I'd rather have access to them than not.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Confirm that echo $SBCL_HOME returns the path in quotes above, specifically without a trailing /.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a bonus tip, MCLIDE can work without run-sbcl.sh, you just gotta remove "sh " from ~/Library/Preferences/com.in-progress.mclide/lisp-implementations-4. Here's my sbcl section:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;#|(|SBCL| ("sh \"$exec\" --load \"$loader\" --eval \"$initform\"") &lt;/div&gt;&lt;div&gt;       :init NIL&lt;/div&gt;&lt;div&gt;       :default "run-sbcl.sh")|#&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(|SBCL| ("\"$exec\" --load \"$loader\" --eval \"$initform\"") &lt;/div&gt;&lt;div&gt;       :init NIL&lt;/div&gt;&lt;div&gt;       :default "sbcl")&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-5642031882526224178?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/5642031882526224178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/08/tips-for-sbcl-macports-if-running-sbcl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5642031882526224178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5642031882526224178'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/08/tips-for-sbcl-macports-if-running-sbcl.html' title='Tips for SBCL MacPorts if running sbcl complains about missing sbcl.core'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1103736801095342855</id><published>2010-08-12T08:42:00.001-07:00</published><updated>2010-08-12T09:29:44.127-07:00</updated><title type='text'>Interesting update</title><content type='html'>Hello Reader,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wonder who you are, if you would, say something interesting about yourself and/or a hello! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have learned so much this year. 2010 will go down as one of the most productive years of my life, but not in the way I ever would have thought. In a nutshell, in May of last year, I quit my full time job, the first one since college, go far out of the USA for a month with my wife, and when I get back, immediately land a contract with some interesting folks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Their goal was to take advantage of the window of time where electronic gambling games were still legal, "internet sweepstakes". I massively helped them get a start, but when I saw the end result, actually with the customers, I felt bad and left them, after only 3 months. I was paid handsomely, but when I returned home with several large checks in hand, I had kicked off a process that would continue for awhile. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before I found any more work, and because I had enough saved up to live off of for a few weeks, I began thinking deeply about what I actually wanted to do with my life. Video game programming was very difficult, the technology broken, and the good technology requiring a large upfront investment (emacs/slime, Eclipse + plugins, build a TextMate bundle to interact with swank, lisp in general).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used Flash exclusively, because I learned well from my previous job how the client was never content to hear that "oh, these things just happen sometimes with C++, but its really fast and powerful". One thing that I loved about Flash was how quickly you could get something cool up and running. If you have an idea of what you want and you are either a quick artist, or already have the art ready to plug in, you can easily get a game running in 1 week, that is, untuned, resources need polish, and some edge cases and menu states aren't complete, but the gameplay itself has no outstanding issues.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ain't Murphy's law just the truth. This planet really is cursed, and because of how what you envision in your head either:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- is very difficult to transcribe cleanly to code&lt;/div&gt;&lt;div&gt;- requires weaving libraries together with a complex dance of polling, event handlers, and callbacks&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I am learning about life is that although new information (wisdom) that changes the game almost implicitly makes you feel like an idiot for not catching on sooner, your best bet is to forgive yourself quickly and just begin implementing the required changes in your lifestyle so that you grow and begin enjoying a new freedom in life. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lisp forces me to also think in the same way. I program, I notice patterns, and when I see them, I adapt to them, creating macros that encompass the new patterns that emerge from the code. Macros are like habits. You do something so often, you begin to think about the process as just the inputs and outputs, and you don't worry how it works in the middle, as long as you write it cleanly. For example, gensym in your macros will save you lots of heartache. I had to learn that one the hard way. Never happened again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After I got out of the funk that I was in about video game programming (felt very burnt out!), I was somewhat receptive to finding some new work, and I was working on a game concept. Near the end of the year (2009), I agreed to work, starting in January 2010 with the awesome guys that built GateGuru. I learned constantly and worked on very short deadlines. They were awesome and kept communication open in a way that accelerated us all. Eventually, I wondered if the iPad would be a great platform for some of my game concepts, requiring more screen area than an iPhone has. I left them on good terms after just a few intense weeks of pressure and exhilaration and growth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I worked even harder for myself, pushing with every last bit of effort in my mind, trying to eat healthy, without slowing down or stopping work, and trying to stay awake as long as possible, but go to sleep when I knew that in the long run the sleep would be more valuable than the staying up. The iPad would be released in just a couple of months, and I had to take the Flash version to a state where I could release it as advertisement for the iPad, but the iPad would have all new levels and even better gameplay, because of the touch aspect. I came very close, literally in the middle of uploading my first successfully built binary that ran and shut down without crashing (ported from AS3 to Objective C in the course of a few days) when the iPad first-release application submission deadline expired. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One gamble was correct, it was better to write the entire game in Flash and port it, than to write the program directly in Objective-C. For those who insist that video games are just like any other software, they should have a testing framework, I can definitely say that a high level testing framework like Cucumber is required, and due to the nature of physics based games (can be non-deterministic from one run to the very next on same PC, due to leftover state in the FPU and other small variances) I would have trouble seeing how writing methods to verify tests of that nature would be worth your time. You can just see the mistakes, literally staring at you on the screen. First step, reproduce bug. Second step, figure out how to do it with regularity if clues from first step weren't enough to solve the problem. Debug the problem as much as possible. Don't be afraid. Just find the line of code where you can still figure out what is going on, and when you step over that line of code, the program begins to "crash", whatever that means in your situation. If you can't solve the problem directly, grab senior engineer, or search/post on an active newsgroup. I use GameDev.net, some more active newsgroups, and Box2d forums. I found Objective-C to incorporate all the hairiness of C/C++, with some of its own wonderful talents, and then a little more oddities for the interactions between the two languages. Pick, crappy std containers, or serialization/deserialization to/from NSArray and its ilk. You lose. Oh, and if you like Objective-C's syntax, I do have a nice house to sell you in Hillsborough.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(love :target '(belinda lisp) :source *me*)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How do I define this function? Why is it so easy in life to get unenamored with the good qualities of someone/thing that you could interact with on a daily basis? Why are the good things so hard to get, and why do I insist almost from the beginning before I can really think it through, to do so many things the hard way, and then act proud of myself when I catch myself being foolish like that? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So after I failed on my game, because art is expensive, not easy to come up with that kind of cash, I was very discouraged, because that was my life dream, I gave it a shot, and I understood that I needed significantly more funds to make something releasable, or I could work on something that could be cool for free, but I was already feeling burnt out, and programming for no profit didn't seem worth my time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had left my wife estranged throughout all of this, but after a difficult period of decision making (I had been trying to live two lives at once, and both weren't that great), I began to make decisive choices and start changing habits and change situations around to protect progress and encourage further growth. I had worked almost nonstop for a full year, and I was completely burnt out on programming. I began to fall back in love with her, and spent time with my dog, and began exploring new hobbies and upping my cooking skills, doubling the garlic/ranch/lime when appropriate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now suddenly, a few week old application to Joystick labs that I just sent out on a hunch is resulting in a phone call from one of the founders. I may just have to get back up and do this thing. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1103736801095342855?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1103736801095342855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/08/interesting-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1103736801095342855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1103736801095342855'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/08/interesting-update.html' title='Interesting update'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1721895959305296054</id><published>2010-04-17T12:09:00.000-07:00</published><updated>2010-04-17T12:40:38.707-07:00</updated><title type='text'>FAST FAST FAST AS3 renderer</title><content type='html'>Hello,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this post, I have assembled a nice little library that I have been enjoying using on my own projects and for clients. It is an optimized AS3 renderer (if you can even call it that), which performs on par with Flixel, but there is no framework to cut out, because its just 3 useful classes which you can use to accelerate your application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Features:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Supports dynamically loaded png image, jpg image, and swf animations or MovieClips in your main FLA.&lt;/div&gt;&lt;div&gt;2. Reuses bitmapdata, so your memory usage will level off.&lt;/div&gt;&lt;div&gt;3. All per frame draw operations are performed with BitmapData.CopyPixels, so it is very fast.&lt;/div&gt;&lt;div&gt;4. No game framework for you to conform to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://tim.kerchmar.com/ptymn.blogspot.com/TrippySoftBitmapLib.zip&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Known issues:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Source images need to be square for rotation to work properly.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1721895959305296054?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1721895959305296054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/04/fast-fast-fast-as3-renderer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1721895959305296054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1721895959305296054'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/04/fast-fast-fast-as3-renderer.html' title='FAST FAST FAST AS3 renderer'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-565870325528822121</id><published>2010-02-15T20:33:00.000-08:00</published><updated>2010-02-15T21:00:58.562-08:00</updated><title type='text'>Tile Ripper utility and AS3 viewer</title><content type='html'>W00! I just finished my tile ripper and Flash viewer. &lt;a href="http://tim.kerchmar.com/largeimage.html"&gt;Check it out &lt;/a&gt;(give it a minute to load, sorry there isn't any feedback on how much progress it made while loading the tiles!).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created a utility which compresses a large image in a very Flash-friendly way, by compressing the image into the &lt;a href="http://tim.kerchmar.com/level1-tiles.png"&gt;smallest number of unique tiles&lt;/a&gt; required to recreate the original image along with an &lt;a href="http://tim.kerchmar.com/level1-tilemap.xml"&gt;XML file which lists the tile index to use for each tile&lt;/a&gt; sized position in the original image.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download the source (SWF image viewer and executable included) &lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/TileRipper.zip"&gt;here&lt;/a&gt;. The TileRipper executable was created with XCode on Mac OSX 10.6. If someone links me to a Windows version of the utility, I will gladly update the blog post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the swf viewer, click with the mouse and move the cursor to the edges to look around. Right now you have to remain on the image or glitches will occur, when using the bitmapData.scroll optimization. For the utility, specify the source png name and the tile width and height that you want to try creating the tile atlas with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even if your project does not use Flash, you can still use the XML and PNG tile output!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-565870325528822121?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/565870325528822121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/02/tile-ripper-utility-and-as3-viewer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/565870325528822121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/565870325528822121'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/02/tile-ripper-utility-and-as3-viewer.html' title='Tile Ripper utility and AS3 viewer'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-5439881895094262021</id><published>2010-02-06T11:49:00.000-08:00</published><updated>2010-02-06T12:37:25.960-08:00</updated><title type='text'>A nifty onscreen logging utility (useful for Box2D)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tim.kerchmar.com/ptymn.blogspot.com/Box2DDebugger.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 974px; height: 678px;" src="http://tim.kerchmar.com/ptymn.blogspot.com/Box2DDebugger.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I created a nifty little tool that has been a huge help along the way. With it, I can log text right to the screen, and if I try to write more text to the same point on the screen, that text is appended as a log instead of just overwriting the previous text.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main method that can be called for this tool is:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;public function drawText(text, position, color, permanent = false)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Permanent text is drawn once and kept around during the lifetime of the Box2DDebugger, and the non-permanent text is re-added by calling the drawText routine each frame (can be a useful paradigm). The very nice thing is that non-permanent TextFields are pooled and reused, so it doesn't slow down your application too much. I was using it to print out vertex locations and ray-cast results and polygon point order.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/Box2DDebugger.as"&gt;Get it now!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-5439881895094262021?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/5439881895094262021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/02/nifty-onscreen-logging-utility-useful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5439881895094262021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5439881895094262021'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/02/nifty-onscreen-logging-utility-useful.html' title='A nifty onscreen logging utility (useful for Box2D)'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-630231370790892077</id><published>2010-02-06T10:46:00.000-08:00</published><updated>2010-02-06T10:55:02.638-08:00</updated><title type='text'>Bayazit Polygon Decomposition in AS3</title><content type='html'>I needed to somehow break down simple non-self-intersecting polygons into convex polygons. Many of the algorithms that I tried had problems:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- couldn't handle concavities at all (the Delauney implementation in AS3 that I tried)&lt;/div&gt;&lt;div&gt;- produced a bunch of triangles that needed to be recombined to produce polygons (I wasn't looking for a science project)&lt;/div&gt;&lt;div&gt;- was freakin slow (Keil's Algorithm was causing error 1502, the 15 second timeout problem in AS3)&lt;/div&gt;&lt;div&gt;- or had inconsistent results (my own attempt and a few I tried from the Box2D forums and google)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I found &lt;a href="http://mnbayazit.com/406/bayazit"&gt;Bayazit's Algorithm&lt;/a&gt; which he describes with illustrations and code instead of a white paper. Very nice! He is very harsh on his own algorithm, pointing out the flaws, but in practice it has produced consistent quality results and is so fast that my app's startup time for decomposing the shapes is nearly instant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the &lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/PolyDecompBayazit.as"&gt;AS3 port of Bayazit's algorithm&lt;/a&gt;. I also updated the Box2DSVGWeb.as to show how it is used.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-630231370790892077?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/630231370790892077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/02/bayazit-polygon-decomposition-in-as3.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/630231370790892077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/630231370790892077'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/02/bayazit-polygon-decomposition-in-as3.html' title='Bayazit Polygon Decomposition in AS3'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-642281881401306815</id><published>2010-01-28T14:21:00.000-08:00</published><updated>2010-01-28T14:27:37.393-08:00</updated><title type='text'>A link to a working implementation of Box2DSVG + source</title><content type='html'>&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/Box2DSVGWeb.as"&gt;Box2DSVGWeb.as for translating graphics calls into Box2D shape definitions.&lt;/a&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/SVGNode.as"&gt;SVGNode.as for routing low level graphics calls to Box2DAS3.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/RopeBurn.swf"&gt;RopeBurn, a game using Box2D with SVGWeb.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-642281881401306815?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/642281881401306815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/01/link-to-working-implementation-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/642281881401306815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/642281881401306815'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/01/link-to-working-implementation-of.html' title='A link to a working implementation of Box2DSVG + source'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-3121384502009166774</id><published>2010-01-26T12:06:00.001-08:00</published><updated>2010-01-26T13:17:41.776-08:00</updated><title type='text'>SVG Parser for Inkscape Box2DAS3 layouts.</title><content type='html'>I love open source software. In the last 5/10 years, the open source community has really solidified the user interfaces and interoperability between various software packages in a way that allows developers to leverage tools to get the job done. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Big companies jumped on board by releasing low level tools that begin to make everything stable and easier. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- The libraries exist that have changed a good developer from the one who is&lt;/div&gt;&lt;div&gt;         good at writing maintainable code =&gt; quicker to listen than to speak&lt;/div&gt;&lt;div&gt;                                                                              googling effectively&lt;/div&gt;&lt;div&gt;and leveraging various user/developer support channels that come with each project, even if they are kind of old school formats.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is all to get to the point and say that I see alot of potential in the SVG web standard, which I just started studying in order to make Box2D layouts in Inkscape, a very worthy SVG editor and a much better flexibility than focussing on the pixels first. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To set up a svgweb test .fla in CS4, follow these steps:&lt;/div&gt;&lt;div&gt;1. svn checkout svgweb (the command on the google code page can be copy and pasted while in the home directory and will work in the terminal)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Find the file called SVGFilterNode.as and change line 42 from:&lt;/div&gt;&lt;div&gt;&lt;div&gt;            if (list.length) {&lt;/div&gt;&lt;div&gt;to:       if (list.length()) {&lt;/div&gt;&lt;div&gt;without this command, &lt;/div&gt;&lt;div&gt;Flash will think that its looking for a variable on list called length, &lt;/div&gt;&lt;div&gt;and return the value, which is null,&lt;/div&gt;&lt;div&gt;and skips that first conditional block. The fix causes Flash to call the length method, which returns the actual length of the list.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Download my example code and open up the .fla file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Navigate to File/Publish Settings/Settings.../Source path&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. That list should be . and ../svgweb-read-only/src (use an absolute path if you can't figure out the relative path).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. Compile and debug movie. You should see a starry background, which my friendly artist made just after installing Inkscape.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7. I had to save the svg file from Inkscape with the plain svg format. If you know more about this than I do, please leave a comment or email me if I broke comments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Suggest a free host, and for now the link is &lt;a href="http://ptymn.0catch.com/flashsvg.zip"&gt;http://ptymn.0catch.com/flashsvg.zip&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-3121384502009166774?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/3121384502009166774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2010/01/svg-parser-for-inkscape-box2das3.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3121384502009166774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3121384502009166774'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2010/01/svg-parser-for-inkscape-box2das3.html' title='SVG Parser for Inkscape Box2DAS3 layouts.'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1389903419936160152</id><published>2009-11-19T12:42:00.000-08:00</published><updated>2009-11-19T13:05:38.925-08:00</updated><title type='text'>Updated Fridge Magnets app for Red5 0.9.0 RC2!</title><content type='html'>&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/FridgeMagnets.zip"&gt;Fridge magnets application&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download the zip and dump its contents into the &lt;red5&gt;/dist/webapps/ directory. You should be able to navigate to http://your-server-url&lt;red5-server&gt;:5080/WeeklyQuest/Fridge.swf and be able to interact with persistent letters. If someone else happens to be dragging letters around when you are viewing, then you can see them move in real time.&lt;/red5-server&gt;&lt;/red5&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll need to ensure that you update the swf (publish from the fla) to use a different server URL if you aren't trying to set this application up on localhost.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, there was a ton of misinformation that I found online. You don't need the META-INF folder, you don't need JAR or WAR anything, and by default, red5 serves from the red5-root/dist/webapps directory, not from the red5-root/webapps folder of your red5 installation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com:5080/WeeklyQuest/Fridge.swf"&gt;Here, try my fridge magnets setup.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.elctech.com/tutorials/tutorial---red5-as3-fc4-and-shared-fridge-magnets"&gt;The original and partially useful but also partially incomplete tutorial.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1389903419936160152?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1389903419936160152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/updated-fridge-magnets-app-for-red5-090.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1389903419936160152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1389903419936160152'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/updated-fridge-magnets-app-for-red5-090.html' title='Updated Fridge Magnets app for Red5 0.9.0 RC2!'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-3246562355914480700</id><published>2009-11-18T01:05:00.000-08:00</published><updated>2009-11-18T01:14:19.703-08:00</updated><title type='text'>Setting up logging in your Red5 TestApp</title><content type='html'>Continuing from last post,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Copy the listener, filter, and filter-mapping blocks that are related to logging from oflaDemo's web.xml to the TestApp's web.xml.&lt;/div&gt;&lt;div&gt;2. cp ~/red5-server/dist/webapps/oflaDemo/WEB-INF/classes/logback-oflaDemo.xml ~/red5-server/dist/webapps/TestApp/WEB-INF/classes/logback-TestApp.xml&lt;/div&gt;&lt;div&gt;3. In the new xml file, replace oflaDemo and oflademo with TestApp, and replace OFLA with TA.&lt;/div&gt;&lt;div&gt;4. When you restart your Red5 server, and use the TestApp url in the Shared Ball sample, you should be able to see a new ~/red5-server/dist/log/TestApp.log file with a line saying that the context TestApp has started.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-3246562355914480700?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/3246562355914480700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/setting-up-logging-in-your-red5-testapp.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3246562355914480700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/3246562355914480700'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/setting-up-logging-in-your-red5-testapp.html' title='Setting up logging in your Red5 TestApp'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-7058872093131087631</id><published>2009-11-17T23:07:00.000-08:00</published><updated>2009-11-18T00:14:13.942-08:00</updated><title type='text'>Making a new application for Red5 0.9.0 RC2</title><content type='html'>Hello,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been having a heck of a time getting any sort of http://localhost:5080/TestApp url to work with the SOSample or getting any hand made application to work in Red5. Here's what I found so far that seems to work with the latest Red5 version:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. cd ~ (or whereever you want to download the Red5 server source)&lt;/div&gt;&lt;div&gt;2. svn checkout http://red5.googlecode.com/svn/java/server/trunk/ red5-server&lt;/div&gt;&lt;div&gt;3. cd red5-server&lt;/div&gt;&lt;div&gt;4. ant (I haven't needed to do any other steps)&lt;/div&gt;&lt;div&gt;5. cd dist&lt;/div&gt;&lt;div&gt;6. sh ./red5.sh&lt;/div&gt;&lt;div&gt;7. Open http://localhost:5080/ in your browser.&lt;/div&gt;&lt;div&gt;8. Install at least SOSample from http://localhost:5080/installer/&lt;/div&gt;&lt;div&gt;9. cd ~/red5-server/dist/webapps (from new terminal window)&lt;/div&gt;&lt;div&gt;10. cp -r SOSample TestApp&lt;/div&gt;&lt;div&gt;11. cd TestApp/WEB-INF&lt;/div&gt;&lt;div&gt;11. Fix webapp.contextPath in red5-web.properties to webapp.contextPath=/TestApp&lt;/div&gt;&lt;div&gt;12. Fix web.xml similarly.&lt;/div&gt;&lt;div&gt;13. Go back to the first terminal window.&lt;/div&gt;&lt;div&gt;14. You should be able to CTRL-C to stop the Red5 server from the first terminal window.&lt;/div&gt;&lt;div&gt;15. Restart red5 with sh ./red5.sh (from dist directory)&lt;/div&gt;&lt;div&gt;16. Now, see if you can use rtmp://localhost/TestApp for http://localhost:5080/demos/BallControl.html&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-7058872093131087631?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/7058872093131087631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/making-new-application-for-red5-090-rc2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7058872093131087631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7058872093131087631'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/making-new-application-for-red5-090-rc2.html' title='Making a new application for Red5 0.9.0 RC2'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-1200320301242350517</id><published>2009-11-05T22:42:00.000-08:00</published><updated>2009-11-05T22:56:29.068-08:00</updated><title type='text'>MonsterDebugger working with HaXe app!</title><content type='html'>&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/MonsterDebuggerHaXe.zip"&gt;De MonsterDebugger ready for use in HaXe&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll still need to install the De MonsterDebugger first, and then you can use the contents of this zip in your HaXe program. Be sure to add this option to your hxml:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;-swf-lib MonsterDebuggerClient.swf&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, if you get this setup working at all, are you able to see a live tree view of your project and edit properties. Right now, all I can see are traces and the fps/memory monitor, but nothing wildly exciting as of yet.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-1200320301242350517?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/1200320301242350517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/monsterdebugger-working-with-haxe-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1200320301242350517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/1200320301242350517'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/monsterdebugger-working-with-haxe-app.html' title='MonsterDebugger working with HaXe app!'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-6582191499038020071</id><published>2009-11-05T21:04:00.000-08:00</published><updated>2009-11-05T21:06:27.852-08:00</updated><title type='text'>MonsterDebugger</title><content type='html'>&lt;a href="http://demonsterdebugger.com/"&gt;De MonsterDebugger&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It seems even better than Xray, and I'm about to see how well it works with HaXe. The trace takes a snapshot of your object at the time of the trace, and you can view that object with the same kind of interface that you can use to inspect and update objects.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-6582191499038020071?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/6582191499038020071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/monsterdebugger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6582191499038020071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6582191499038020071'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/monsterdebugger.html' title='MonsterDebugger'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-9097628276419398680</id><published>2009-11-03T12:47:00.000-08:00</published><updated>2009-11-03T12:51:00.107-08:00</updated><title type='text'>Box2Dhx</title><content type='html'>For new HaXe users, I recommend checking out this full port of Box2DAS3 to HaXe. I had found a previous swfified version of Box2D that was usable in HaXe, but this port can theoretically take advantage of the leaner bytecode that the HaXe compiler can generate, and looks great:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://code.google.com/p/box2dhx/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From start to finish:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;svn checkout http://box2dhx.googlecode.com/svn/trunk/ box2dhx&lt;/div&gt;&lt;div&gt;cd box2dhx&lt;/div&gt;&lt;div&gt;haxe compile_flash.hxml&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The resulting PhysTest.swf should be visible with the Flash player or any browser. It has good performance.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-9097628276419398680?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/9097628276419398680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/box2dhx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9097628276419398680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9097628276419398680'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/box2dhx.html' title='Box2Dhx'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-6865107409690154444</id><published>2009-11-02T19:51:00.001-08:00</published><updated>2009-11-02T19:53:52.861-08:00</updated><title type='text'>HaXe and SamHaXe on SnowLeopard</title><content type='html'>If you are having trouble getting HaXe, SamHaxe, Neko and all that other stuff up and running on OSX 10.6, drop me a line. I'll take the time to compile this mess into a reasonable set of instructions. All said and done, it seems that switching to OSX from WinXP right when they are dealing with their own 64 bit mess was a bad time. However, I am extremely excited about what it appears that HaXe can do for unlocking the full potential of the Flash 10 VM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-6865107409690154444?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/6865107409690154444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/11/haxe-and-samhaxe-on-snowleopard.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6865107409690154444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/6865107409690154444'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/11/haxe-and-samhaxe-on-snowleopard.html' title='HaXe and SamHaXe on SnowLeopard'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-9102166447134046462</id><published>2009-10-28T13:53:00.001-07:00</published><updated>2009-10-28T14:09:46.508-07:00</updated><title type='text'>WeeklyQuest featuring Bob the Stickman</title><content type='html'>I've decided to start a webcomic that will accompany this blog. In the webcomic, I will incorporate a game with voiceovers and a linear plot. I will release the full source fla and as files for each game on this blog, so that you can learn!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://tim.kerchmar.com/ptymn.blogspot.com/stickruns.zip"&gt;http://tim.kerchmar.com/ptymn.blogspot.com/stickruns.zip&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It shows off a basic Box2D integration with the Box2D debugging overlay, and also shows off a basic update loop with a moving avatar.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-9102166447134046462?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/9102166447134046462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/10/weeklyquest-featuring-bob-stickman.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9102166447134046462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/9102166447134046462'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/10/weeklyquest-featuring-bob-stickman.html' title='WeeklyQuest featuring Bob the Stickman'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-5796322712379763550</id><published>2009-10-17T15:05:00.000-07:00</published><updated>2009-10-17T16:02:23.103-07:00</updated><title type='text'>Flash intro for game industry programmers</title><content type='html'>If you are used to the typical stack of C++ and various game libs, you are going to love Flash. I could wholeheartedly recommend that anyone trying to break into the indie games scene use Flash. Another very nice perk is that Adobe just announced that Flash CS5 will have out of the box iPhone support with minimal changes to your project, and although this sounds dubious, supposedly you'll be able to develop your iPhone Flash games on a PC.&lt;br /&gt;&lt;br /&gt;Flash gives you a ton out of the box, networking, sound, animation management (2D), and some 3D stuff although the projects that I've worked on up til date have not used any of the 3D stuff, so I'm not in a position to say what Flash can or cannot do with 3D. That said, my resume in Flash currently includes 8 games all written in under 1.5 weeks per game, and I've not been using it very long.&lt;br /&gt;&lt;br /&gt;The games that I wrote for the past few contracts started with over 1GB each of raw .wav and .png files, so in future posts, I'll be discussing techniques for handling your own memory management and performance tweaks, so that you can control how hard the GC has to work.&lt;br /&gt;&lt;br /&gt;First off, here's what I do know about the technical capabilities of Flash:&lt;br /&gt;&lt;br /&gt;ActionScript 3 has robust support for closures, and mastering closures can allow you to skip making classes that are only used in one place. The only downside to closures is that you lose the ability to step through closures and set breakpoints. Your breakpoints will still be hit, but you cannot see the stack at that point. Lame, but they were a net win on my last project, making 6 games in 2 months.&lt;br /&gt;&lt;br /&gt;The Flash debugger is pretty lame overall, especially if you are used to the suite of debuggers that are available in all the languages that Visual Studio supports. You cannot set arbitrary expressions for watches, you cannot move the execution cursor around, and for some reason, DisplayObjectContainers (Sprites and MovieClips) do not have a "children" array that you can browse with all the children listed.&lt;br /&gt;&lt;br /&gt;The out of the box sound support is great. Wav and mp3 files work exactly as you would expect, and you can start and stop sounds at arbitrary times. I've heard of some problems with mp3 encoder lead-ins being a problem, particularly if you are trying to string several sounds together, but other than issues that might crop up on many platforms, you won't get any unexpected new ones from Flash. One feature that I like a ton is that because the execution of some commands are latent, Flash automatically syncs sounds with animations, by starting the sound at the same time that the accompanying animation starts playing. This can be a pain to set up in a regular game engine, where your sound play command is usually instant or mixed in to the master channel on a delayed schedule that doesn't corrospond to the framerate at all.&lt;br /&gt;&lt;br /&gt;During the past projects, I did not get a chance to investigate the low level capabilities of the Flash renderer, so I do not have any comment about rendering most of your objects with raw BitmapData objects. All ordinary renderer commands (create movieclip, add to main scene somewhere, ect) are latent, meaning that they do not take effect immediately, but are delayed by one extra frame. I have not been able to find a solid reason why Flash behaves this way, but it could be related to how well sounds and animations are synced. The frame based paradigm for rendering objects and advancing through frames is simple and surprisingly well adapted to typical animation behaviors that you'd want to implement.&lt;br /&gt;&lt;br /&gt;The Flash networking model is somewhat disappointing. You cannot do UDP or peer to peer networking, you must strictly use a server client model. My personal projects will help me flesh out how well Flash networking works for various common game implementation tasks, so future posts will contain some more information about that front. I do think that the Flash Red5 Open Source Media Server is the best way to get something up and running quickly.&lt;br /&gt;&lt;br /&gt;The Flash IDE sucks pretty badly, but I don't know of a better option at this point. Not only is the debugger pretty bad, but the IDE is bloated, slow, and crashes at least daily. I found a Save and a separate Save and Compact option in the menu. Save and Compact will reduce the size of your FLA (all binary) project file, but frequent use of this option will bloat your source control commits with giant FLA binary diffs. There is a useful visual layout tool that can save you a ton of work, but sadly it can be buggy when using multiple frames, because presumably Flash isn't very good about reusing an instance of an object with the same instance name across multiple frames.&lt;br /&gt;&lt;br /&gt;ActionScript 3 is subtly different than JavaScript in many ways that will confuse an expert JavaScript programmer, but the ability to add members and methods on the fly to any object instance is very useful in practice, as well as full support for closures.&lt;br /&gt;&lt;br /&gt;All in all, Flash is a very very widely supported platform and although the runtime and tools give me an impression of untrustworthy, I keep finding myself producing complete projects very quickly, and enjoying how easily other people with a wide variety of setups are able to use the final swf files from any computer. You should not brush this platform aside if you want to go indie.&lt;br /&gt;&lt;br /&gt;-Tim Kerchmar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-5796322712379763550?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/5796322712379763550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/10/flash-intro-for-game-industry.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5796322712379763550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/5796322712379763550'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/10/flash-intro-for-game-industry.html' title='Flash intro for game industry programmers'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6331063102506964061.post-7796447680961878447</id><published>2009-07-17T09:20:00.000-07:00</published><updated>2009-07-17T09:23:15.738-07:00</updated><title type='text'>Moved from http://nightschool.near-time.net/</title><content type='html'>I decided to move the blog to this address, since near-time's days are numbered. You can check out the old blog (mostly about Lisp for games and 2D physics) here: http://nightschool.near-time.net/&lt;br /&gt;&lt;br /&gt;I have recently left my full time job to make flash (and possibly iPhone soon) prototypes of the many ideas that I have saved up. So far, I'm feeling very productive and having a blast.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6331063102506964061-7796447680961878447?l=ptymn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ptymn.blogspot.com/feeds/7796447680961878447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ptymn.blogspot.com/2009/07/moved-from-httpnightschoolnear-timenet.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7796447680961878447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6331063102506964061/posts/default/7796447680961878447'/><link rel='alternate' type='text/html' href='http://ptymn.blogspot.com/2009/07/moved-from-httpnightschoolnear-timenet.html' title='Moved from http://nightschool.near-time.net/'/><author><name>Tim Kerchmar</name><uri>http://www.blogger.com/profile/09060694036507842361</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_VV8LWo-1uO4/SmCog88ST3I/AAAAAAAAAAs/p8kYy3AMRtM/S220/100_2848.JPG'/></author><thr:total>1</thr:total></entry></feed>
