This is actually a topic that I've been thinking about for a while now, going back to a conversation I had at with Corvus Elrod at his "moving to the West Coast" party. We were discussing advertising in games, and generated a lot of interesting points. As a storyteller, it is anathema for him to see anything that pulls a player out of the game experience, and have them thinking about products in the real world. I agree with this, to a point. When one thinks of the rise of casual games, and the free product business model, it has to be conceded that advertising is one of the main revenue streams (and therefore driver of) the games industry. Armor Games was a company that I though had nothing but cheesy, vapid fare, until I was given a disk by the people of the Indie Games Showcase. Some of their offerings, particularly in the puzzle category (which I usually avoid), blew my mind with their innovations. This company, which is producing quality (though flash) games, is completely supported by the ads on their site (as far as I can tell).
Tuesday, November 25, 2008
Thoughts on Advertising
Labels: advertising, flash, games, gaming
Wednesday, November 19, 2008
Dealing with Null or "All" Parameters in MS SQL Reporting Services
Monday, November 17, 2008
Tables for Layout?
Wednesday, October 22, 2008
Lock's Quest Recap
This is sort of a game review, but also a discussion about interface design, and the nature of fun in games. I recently purchased Lock's Quest, which was the best Strategy game at E3, which for a DS title, is pretty impressive. It's developers also put out Drawn to Life, a game that I wanted, but never got around to purchasing. Basically, you're a special boy in a war...blah blah blah, the story isn't really that important, but the game itself is really involving.
Monday, October 13, 2008
Using A LIKE Operator With A String Parameter In SSRS
Hey-o,
- Create the String parameter you actually want to search with. Make sure that it can be blank, but don't let it be null. For the sake of the example, I'm calling it Filter.
- Create another, hidden parameter that is also a string. Make sure it is hidden! Then, set the default value to be non-queried ="%" & Parameters!Filter.Value & "%". I gave this parameter the name FilterFormatted. Now, hit okay and close out your Report Parameters.
- Now, in the query, all you need to do is write "WHERE columntofilter LIKE @FilterFormatted". If you're testing the report, make sure you put the "%" before and after your search string, but going to the "Preview" tab will let you test it the way it'll be deployed (though you should probably know that already).
Wednesday, September 24, 2008
OpenSocial Version 0.8 App Development From Scratch
With the newest version of OpenSocial out, I felt compelled to revisit it, despite the fact that my new job couldn't have me farther from it. A labor of love, some would say, to stay up-to-date on a constantly evolving platform, like trying to hold onto pudding with your bare hands. Anyways, where was I?
I'm going to develop an OpenSocial 0.8 app from scratch. Let's get started. First, I need to set up the initial scaffold.
<?xml version="1.0" encoding="UTF-8" ?><Module><ModulePrefs title="Pandaface"><Require feature="opensocial-0.8"/></ModulePrefs><Content type="html"><![CDATA[<div id="gadgetdiv">Panda!</div>]]></Content></Module>
Step 2 is setting up the first data request. In my first request, I like to get the OWNER and VIEWER objects. These will allow me to know if the viewer is looking at their own version of the App or someone else's. To do this, gogoGadget is changed to look like this.
function gogoGadget()This creates a request object, adds two FetchPersonRequests, and sends the request out, saying that the function 'response' will deal with the data response. It is important to note that the callback will not execute until it has all the data. Let's lake a took at the response function.
{
var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest("OWNER"), "get_owner");
request.add(request.newFetchPersonRequest("VIEWER"), "get_viewer");
request.send(response);
};
function response(responseData) { owner = responseData.get('get_owner').getData(); viewer = responseData.get('get_viewer').getData(); };
Not terribly interesting at the moment, but it is important to note a few things. In gogoGadget, the last paramter that is given is a name for the specific response. MAKE SURE THESE MATCH UP. In my other OpenSocial adventures, I got that mixed up at one point, and couldn't for the life of me figure out what was going wrong.
Now, let's pull down some persistent data. I'm just going to have a single variable, face_data, and pull it from the orkut sandbox server. To do this, I have to declare another datarequest, and add a newFetchPersonAppDataRequest. Back in .7, you could just pass the user's id, and the name of the app data you wanted to pull. Now, however, you have to create an IdSpec object for it. This is new, and fairly unintuitive (especially to people who've been working with it as long as I have). Here's the full data request.
var ownerspec = opensocial.newIdSpec({ "userId" : "OWNER" , "groupId" : "SELF"});var datarequest = opensocial.newDataRequest();datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_data"),"face_data");datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_url"),"face_url");datarequest.send(loadUI);
function loadUI(responseData){var facedata = responseData.get('face_data').getData()[owner.getId()];var faceurl = responseData.get('face_url').getData()[owner.getId()];var to_output = owner.getDisplayName() + " is a ";if(facedata == null){to_output += "lazy";}else{to_output += facedata.face_data;}to_output += " panda.";if(faceurl == null){faceurl = "http://www.cs.drexel.edu/~asc38/Google/meh.png";}else{faceurl = faceurl.face_url;}
if(owner.isViewer()){
owner_output = '
';document.getElementById("gadgetdiv").innerHTML += owner_output;}
var updaterequest = opensocial.newDataRequest();updaterequest.add(updaterequest.newUpdatePersonAppDataRequest("VIEWER", "face_data", newemotion), "update1");updaterequest.send(finishUpdate);
function finishUpdate(responseData){var ownerspec = opensocial.newIdSpec({ "userId" : "OWNER" , "groupId" : "SELF"});var datarequest = opensocial.newDataRequest();datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_data"),"face_data");datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_url"),"face_url");datarequest.send(loadUI);}
Monday, September 8, 2008
Browser Inconsistencies: Part 2
Hey-o
Today was my first day at my new job. Exciting, but nothing notable yet. Hence, this is a relatively shorter entry.
Anyways, I was playing around with HTML and CSS again, putting together a chess/checkers-style board with HTML and CSS, and found another browser inconsistency.
I have a 4x4 grid of alternating white and black tiles. The tiles are arranged in rows, and there are tokens that are placed absolutely on top of them. The rows of tiles and tokens are all in a master div. The rows are each divs that have a clear: both property to make them cascade properly. At first, I didn't define the horizontal position of the tokens. In firefox/opera/chrome, you see the following:
The absolutely positioned tokens are removed from where they "should" be, and are placed in the upper-left corner of their containing div (the white token has been defined to be that low). However, in IE8, this happens:
Apparently, if a horizontal position is not specified, the absolutely positioned elements stay where they would, even though they are removed from the box model. You can tell they have still been removed, because if they hadn't, then the border would be surrounding them as well. Setting the left: 0px; property makes IE8 render the same as all the others, but it is still interesting.