I have a recurring idea that it would be sweet to make some sort of 2D platform type game but with really awesome character animation, like if not actually rotoscoped then approaching rotoscope-caliber.
Sometimes I even start trying to animate a walk cycle before I remember that making awesome character animation is actually really difficult, and if you can pull it off then it is pretty much enough to carry a hit game. I have literally wanted to do something along these lines since I was making crappy games on the Mac using Ingemar's Sprite Animation Toolkit. And it haunts me yet!
The latest incarnation of this lunacy was an idea I had, while walking the dog, that there should be a game where the player is a dog, but only it's animated totally awesome and you can sit down and gallop and stuff and it looks like the movements of an actual dog, albeit 2D and lo-res. Amazing right!
And actually there is a game where you're a dog, but it's 3D and for the Playstation Deuce and the character animation is not even that good. (No disrespect, the animators did a great job, but it looks like they didn't use motion capture, so it's both not quite realistic and damned impressive that it looks as realistic as it does.)
And thus did I find myself searching for visual references regarding the canine walk cycle, which led me to this link, and damn. That page is huge! And loaded with diagrams! And very heavily footnoted!
And then I scrolt up to the top of the page and it was chapter ninety-one! Of what?!? A textbook with the best cover graphic ever.
Wednesday, July 15, 2009
If only Netflix had been around during college
Just remembering all those all-night bull sessions spent debating which Meatballs sequel was most Lynchian.
Tuesday, July 14, 2009
Personal Virtue as a Poor Substitute for Political Change
Via the Just Seeds blog, a great article summing up the flaws inherent in the personal virtue model of social change.
Not a new idea by any means, but one that I've always found interesting and thought-provoking. I've always liked Noam Chomsky's succinct rejoinder along these lines:
And it really is a distraction, as teeth-gnashing over one's contribution to gentrification, for example, ends up being "white guilt" of the most pointless sort: you either waste your time twisting yourself into knots, trying to explain how you're actually not part of the problem; or you shrug your shoulders and resign yourself to being an irredeemable oppressor, and thus liberated from any responsibility to change the system.
Not a new idea by any means, but one that I've always found interesting and thought-provoking. I've always liked Noam Chomsky's succinct rejoinder along these lines:
Q: [H]ow can you justify living a bourgeois life and driving a nice car?Just so. It's an obvious point, but so easy to lose track of in our culture, even once you're aware of the dynamic at work.
A: ... When I go to visit peasants in southern Colombia, they don't want me to give up my car. They want me to help them.
And it really is a distraction, as teeth-gnashing over one's contribution to gentrification, for example, ends up being "white guilt" of the most pointless sort: you either waste your time twisting yourself into knots, trying to explain how you're actually not part of the problem; or you shrug your shoulders and resign yourself to being an irredeemable oppressor, and thus liberated from any responsibility to change the system.
Monday, July 13, 2009
Dog Walk Conversation
"How much did you pay for that dog?"
"He's from a shelter, so nothing."
"What's his name, German shepherd?"
"Uh, it's Prancy."
"Okay, Fancy. Don't bite me."
"Oh, he doesn't bite."
"Yes he does."
"He's from a shelter, so nothing."
"What's his name, German shepherd?"
"Uh, it's Prancy."
"Okay, Fancy. Don't bite me."
"Oh, he doesn't bite."
"Yes he does."
Calorie Labeling
Ezra has an anecdote about how a restaurant labeling its menu items with calorie counts would have changed his lunch order. At the Mets game Saturdy we noticed that the roving food vendors now wear buttons advertising the calorie counts of their wares. It was a welcome bit of information, and did lead one of our number away from the fallacious "not sure if I could eat a whole hot dog, maybe just a soft pretzel" line of thinking.
The game, by the way, was great, and we all had a blast on our first visits to Citi Field. Santana was amazing, and though for the most of the game he didn't leave the rest of the Mets defense with much to do (probably a good thing), we did get to see a double play in the latter innings. And though rain threatened from about the seventh inning stretch on, it held off until we were on the way home.
The game, by the way, was great, and we all had a blast on our first visits to Citi Field. Santana was amazing, and though for the most of the game he didn't leave the rest of the Mets defense with much to do (probably a good thing), we did get to see a double play in the latter innings. And though rain threatened from about the seventh inning stretch on, it held off until we were on the way home.
Friday, June 26, 2009
Boo
The program I wanted to write for my phone was simple: I wanted to be able to select which side of the street my car was parked on, and have it add alarms to the calendar reminding me to move my car for street cleaning on the appropriate days of the coming week.
It was easy! And it runs perfectly in the Nokia emulator, but when I tried running it on my actual phone...SecurityException!
And basically I'm screwed, as it seems T-Mobile locks everything down...no "third party" access to user data (such as the calendar) at all.
Of course, I'm not even a "third party," I'm the second party, the owner of the phone. How annoying.
Needless to say, my next telephone will run Lunix.
And my code I hereby release into the public domain:
package street;
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.pim.*;
/**
* @author Travis
*/
public class StreetCleaning extends MIDlet implements ItemStateListener {
public void startApp() {
Form form = new Form("Street Cleaning");
options = new ChoiceGroup(null, Choice.EXCLUSIVE);
options.append("North (Mon/Thu)", null);
options.append("South (Tue/Fri)", null);
options.append("None", null);
form.append(options);
form.setItemStateListener(this);
Display.getDisplay(this).setCurrent(form);
}
ChoiceGroup options;
static final String summary = "Move car";
public void itemStateChanged(Item item) {
PIM pim = PIM.getInstance();
String reminders = pim.listPIMLists(PIM.EVENT_LIST)[4];
Calendar today = Calendar.getInstance();
try {
EventList events = (EventList)pim.openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE, reminders);
// get rid of existing notices
for (Enumeration items = events.items(); items.hasMoreElements(); ) {
Event event = (Event)items.nextElement();
if (event.getString(Event.SUMMARY, PIMItem.ATTR_NONE).equals(summary))
events.removeEvent(event);
}
// select days of week based on side of street
int[] days;
int side = options.getSelectedIndex();
if (side == 0) {
days = new int[2];
days[0] = Calendar.MONDAY;
days[1] = Calendar.THURSDAY;
}
else if (side == 1) {
days = new int[2];
days[0] = Calendar.TUESDAY;
days[1] = Calendar.FRIDAY;
}
else
days = new int[0];
for (int i = 0; i < days.length; i++) {
// set alarms for next coming weekday
int apart = days[i] - today.get(Calendar.DAY_OF_WEEK);
if (apart < 0 ||
apart == 0 && today.get(Calendar.HOUR_OF_DAY) > 10)
apart += 7;
// first event
Calendar day = Calendar.getInstance();
day.setTime(new Date(day.getTime().getTime() + apart * 24 * 3600 * 1000));
day.set(Calendar.HOUR_OF_DAY, 8);
day.set(Calendar.MINUTE, 20);
day.set(Calendar.SECOND, 0);
day.set(Calendar.MILLISECOND, 0);
Event event = events.createEvent();
event.addDate(Event.START, PIMItem.ATTR_NONE, day.getTime().getTime());
event.addInt(Event.ALARM, PIMItem.ATTR_NONE, 1);
event.addString(Event.SUMMARY, PIMItem.ATTR_NONE, summary);
events.importEvent(event).commit();
// second event
day.set(Calendar.HOUR_OF_DAY, 9);
day.set(Calendar.MINUTE, 50);
event = events.createEvent();
event.addDate(Event.START, PIMItem.ATTR_NONE, day.getTime().getTime());
event.addInt(Event.ALARM, PIMItem.ATTR_NONE, 1);
event.addString(Event.SUMMARY, PIMItem.ATTR_NONE, summary);
events.importEvent(event).commit();
}
}
catch (PIMException ex) {
Display.getDisplay(this).setCurrent(new Alert(ex.getMessage()));
}
destroyApp(false);
notifyDestroyed();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
It was easy! And it runs perfectly in the Nokia emulator, but when I tried running it on my actual phone...SecurityException!
And basically I'm screwed, as it seems T-Mobile locks everything down...no "third party" access to user data (such as the calendar) at all.
Of course, I'm not even a "third party," I'm the second party, the owner of the phone. How annoying.
Needless to say, my next telephone will run Lunix.
And my code I hereby release into the public domain:
package street;
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.pim.*;
/**
* @author Travis
*/
public class StreetCleaning extends MIDlet implements ItemStateListener {
public void startApp() {
Form form = new Form("Street Cleaning");
options = new ChoiceGroup(null, Choice.EXCLUSIVE);
options.append("North (Mon/Thu)", null);
options.append("South (Tue/Fri)", null);
options.append("None", null);
form.append(options);
form.setItemStateListener(this);
Display.getDisplay(this).setCurrent(form);
}
ChoiceGroup options;
static final String summary = "Move car";
public void itemStateChanged(Item item) {
PIM pim = PIM.getInstance();
String reminders = pim.listPIMLists(PIM.EVENT_LIST)[4];
Calendar today = Calendar.getInstance();
try {
EventList events = (EventList)pim.openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE, reminders);
// get rid of existing notices
for (Enumeration items = events.items(); items.hasMoreElements(); ) {
Event event = (Event)items.nextElement();
if (event.getString(Event.SUMMARY, PIMItem.ATTR_NONE).equals(summary))
events.removeEvent(event);
}
// select days of week based on side of street
int[] days;
int side = options.getSelectedIndex();
if (side == 0) {
days = new int[2];
days[0] = Calendar.MONDAY;
days[1] = Calendar.THURSDAY;
}
else if (side == 1) {
days = new int[2];
days[0] = Calendar.TUESDAY;
days[1] = Calendar.FRIDAY;
}
else
days = new int[0];
for (int i = 0; i < days.length; i++) {
// set alarms for next coming weekday
int apart = days[i] - today.get(Calendar.DAY_OF_WEEK);
if (apart < 0 ||
apart == 0 && today.get(Calendar.HOUR_OF_DAY) > 10)
apart += 7;
// first event
Calendar day = Calendar.getInstance();
day.setTime(new Date(day.getTime().getTime() + apart * 24 * 3600 * 1000));
day.set(Calendar.HOUR_OF_DAY, 8);
day.set(Calendar.MINUTE, 20);
day.set(Calendar.SECOND, 0);
day.set(Calendar.MILLISECOND, 0);
Event event = events.createEvent();
event.addDate(Event.START, PIMItem.ATTR_NONE, day.getTime().getTime());
event.addInt(Event.ALARM, PIMItem.ATTR_NONE, 1);
event.addString(Event.SUMMARY, PIMItem.ATTR_NONE, summary);
events.importEvent(event).commit();
// second event
day.set(Calendar.HOUR_OF_DAY, 9);
day.set(Calendar.MINUTE, 50);
event = events.createEvent();
event.addDate(Event.START, PIMItem.ATTR_NONE, day.getTime().getTime());
event.addInt(Event.ALARM, PIMItem.ATTR_NONE, 1);
event.addString(Event.SUMMARY, PIMItem.ATTR_NONE, summary);
events.importEvent(event).commit();
}
}
catch (PIMException ex) {
Display.getDisplay(this).setCurrent(new Alert(ex.getMessage()));
}
destroyApp(false);
notifyDestroyed();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
New Level of Nerddom
Somehow both Andrew and Dmitry were under the impression that, back when Andrew and Jay and I all had Palms III, I had actually written software for it to track my expenses. I did have a program like that, but I sure didn't write it.
I can't remember if I ever actually tried setting up a Palm development environment; at the time my only computers were a beige Mac and a couple PC's running Slackware, so it's quite possible there wasn't anything available, or available for free. I am pretty sure I had a Palm simulator for the Mac, but I think I only used it to play Parking Lot.
In any case, I just downloaded NetBeans and the Nokia S40 platform SDK. :( I want to write a program that sets my alarm clock for street cleaning. :((((((((((((((
I can't remember if I ever actually tried setting up a Palm development environment; at the time my only computers were a beige Mac and a couple PC's running Slackware, so it's quite possible there wasn't anything available, or available for free. I am pretty sure I had a Palm simulator for the Mac, but I think I only used it to play Parking Lot.
In any case, I just downloaded NetBeans and the Nokia S40 platform SDK. :( I want to write a program that sets my alarm clock for street cleaning. :((((((((((((((
Tuesday, June 23, 2009
Friday, June 19, 2009
Herack Oboover
I have not yet gotten to the Obama-as-Hoover article in the current Harper's (I am weirdly fastidious about reading each issue completely, and in strict order, though on occasion I do read "Findings" without having finished the crossword), but this sounds very accurate to me:
Obama’s failure would be unthinkable. And yet the best indications now are that he will fail, because he will be unable—indeed he will refuse—to seize the radical moment at hand.
Wednesday, June 17, 2009
Subscribe to:
Posts (Atom)
