This year, I have re-energized my long standing partnership with Steve Bjorkman, my fabulous illustrator, who’s greeting cards have been a successful staple in retail stores since the early 80s. His softly hand-drawn, humorous style is very popular to a very wide audience, which we have taken advantage of, and harnessed to create iPhone applications for kids and adults alike.
This past week, we published our first iPad app, a Mother’s Day greeting card-style app very similar in concept to the Create a Valentine app we did last year. If you have an iPad, please go take a look at the app, download it, and use it to tell your mom just how much you appreciate her. Your mom will be impressed by the unique, warm style and subtle beauty, and your neighborhood developer will be grateful of your support.
Additionally, I also created a universal app which will run on both the iPhone and the iPad, but unfortunately it just missed being approved in time. It will hit the store on Monday, so if you forgot Mother’s Day (tsk tsk) and have an iPhone, give it a shot! And next year, it’ll still be there.
About the Greeting Card business in the 2010s…
Over the last 10 years or so, digital media has become a prominent form of greeting-sending that traditionally were always paper based. One of the side-effects of this, for a variety of reasons, is that the general quality of such greetings tend to be relatively poor, the receiver often feels as if the sender did not care quite enough to “send a real card.” You have all experienced it at one time or another, I know you have. It’s a very clear case of meaning being codified in the medium, which is fundamentally difficult to change, but we believe it worth attempting to do so.
This effect is something that Steve and I take very seriously, especially Steve, and one of our main aims with our greetings apps is to allow you to create beautiful, thoughtful greetings that evoke those emotions of feeling cared for, loved, appreciated. The attention to detail in Steve’s illustrations, the fact that they are custom-drawn exclusively for these projects, and the similar appearance to traditional greeting cards, these are all things that make what we offer unique, and not something that just anyone can do. His many years of experience in the professional business really shows through his creations, and I feel lucky, honored even to have the chance to work with him. I hope your experience with his work is as wonderful as mine.
An e-card may never fully substitute for a physical one in many circumstances, but it certainly is a welcome addition, and sometimes, it’s just the right thing.
(On a side note, the Valentine iPhone app turned out to be extremely popular, far exceeding my highest hopes. The 2009 distribution was in the thousands…but the 2010 distribution reached well into the hundreds of thousands. This tells me that, most likely, other people see value and appreciate our unique creative approach. Whatever the reason people like it, it helps to build confidence in what we are doing. Not bad for an app that I built after work one day.)
Spellwars development has been banging along, but none so much as the visual development. My designers and artists are just fantastic, though I am always looking for more Spell Artists. If you think you might be interested, please don’t hesitate to contact me (click the contact tab in the top right of the page for direct contact info).
I thought I’d give an update and include some screenshots, showing off some of the more recent work.
I hope you like what you see. There is so much more to come, I can’t wait to get this out to everyone who is waiting and wanting to play.
Collision detection can be a little difficult with complex paths like arbitrary bezier objects. But when the two objects are circles? piece of cake! Find the center of each circle, then compare the distance between them. If that is less than the sum of the two radii, they collide.
The calculation is from high school geometry, and yes most of you have forgotten it. As apparently, did I. You probably recognize this:
x^2 + y^2 = z^2
and you might even remember what it applies to. When programming on the iPhone, we have x and y in coordinates from the UIView. When making the comparison between the above mentioned distance between points and radii, it’s easier to compare the squares of the respective z values, so we don’t have to compute 2 unnecessary and expensive square roots.
So anyway, I implement said solution, and go about my business. Over the next week or so, I notice that my collision detection is a little bit inaccurate. Not a lot, but a little. One night I decide I’m going to get it pixel perfect, since I should be able to pretty easily.
A few hours later, I give up and call in my wife. You see, she actually does this kind of math all day, every day. Well, not all day every day, but on a regular basis, every week. She’s a structural engineer, and they have to do calcs to make sure your house doesn’t fall over because of an over-imaginative and under-detail-oriented architect.
It turns out, I made a small…tiny mistake in how I formed the final equation. Rather than squaring the sum of the two radii, I squared each one separately, then added them together. That is:
rad_1^2 + rad_2^2
(rad_1 + rad_2)^2
Very easy to do in code, so watch out for it. It’s a nasty little bug to track down, because the inaccuracy changes based on the size of the circles…which varies in my app.
The final code I ended up with is below:
CGRect m_frame = [self frame];
CGRect o_frame = [otherView frame];
float m_rad = m_frame.size.width / 2;
float o_rad = o_frame.size.width / 2;
CGPoint m_center = m_frame.origin;
m_center.x += m_rad;
m_center.y += m_rad;
CGPoint o_center = o_frame.origin;
o_center.x += o_rad;
o_center.y += o_rad;
dt.x = m_center.x – o_center.x;
dt.y = m_center.y – o_center.y;
float x_sq = dt.x * dt.x;
float y_sq = dt.y * dt.y;
// this is wrong, I screwed up the original calculation
//float mrad_sq = m_rad * m_rad;
//float orad_sq = o_rad * o_rad;
float rad_sq = (o_rad + m_rad) * (o_rad + m_rad);
return (rad_sq) > (x_sq + y_sq);