Options saved.

'; } $checked = ''; if($ping == 1) $checked = 'checked="checked"'; echo '

URIs to Ping

The following services will automatically be pinged/notified when you publish posts. Not when you edit previously published posts, as WordPress does by default.

NB: this list is synchronized with the original update services list.

Separate multiple service URIs with line breaks:

Ping log

These are the lastest actions performed by the plugin.


'; } # telling WordPress to ping if the post is new, but not if it's just been edited function SUP_ping_if_new($id) { global $wpdb, $post_title; if(get_option('SUP_ping') == 1 and get_option('ping_sites') != "") { # fetches data directly from database; the function "get_post" is cached, # and using it here will get the post as is was before the last save $row = mysql_fetch_array(mysql_query( "SELECT post_date,post_modified FROM $wpdb->posts WHERE id=$id")); # if time when created equals time when modified it is a new post, # otherwise the author has edited/modified it if($row["post_date"] == $row["post_modified"]) { if($post_title) SUP_log("Pinging services (new post: “".$post_title."”) ..."); else SUP_log("Pinging services (new post) ..."); SUP_ping_services(); # Try commenting the line above, and uncommenting this line below # if pinging seems to be out of order. Please notify the author if it helps! # generic_ping(); } else { if($post_title) SUP_log("NOT pinging services (“".$post_title."” was edited)"); else SUP_log("NOT pinging services (a post was edited)"); } } else SUP_log("NOT pinging services (disabled by administrator)"); } # More or less a copy of WP's "generic_ping" from functions.php, # but uses another function to send the actual XML-RPC messages. function SUP_ping_services() { $services = get_settings('ping_sites'); $services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines $services = trim($services); if ( '' != $services ) { $services = explode("\n", $services); foreach ($services as $service) SUP_send_xmlrpc($service); } } # A slightly modified version of the WordPress built-in ping functionality ("weblog_ping" in functions.php). # This one uses correct extendedPing format (WP does not), and logs response from service. function SUP_send_xmlrpc($server = '', $path = '') { global $wp_version; include_once (ABSPATH . WPINC . '/class-IXR.php'); // using a timeout of 3 seconds should be enough to cover slow servers $client = new IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path)); $client->timeout = 3; $client->useragent .= ' -- WordPress/'.$wp_version; // when set to true, this outputs debug messages by itself $client->debug = false; $home = trailingslashit( get_option('home') ); # the extendedPing format should be "blog name", "blog url", "check url" (whatever that is), and "feed url", # but it would seem as if the standard has been mixed up. it's therefore best to repeat the feed url. if($client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url'), get_bloginfo('rss2_url'))) { SUP_log("- ".$server." was successfully pinged (extended format)"); } else { # pinging was unsuccessful, trying regular ping format if($client->query('weblogUpdates.ping', get_settings('blogname'), $home)) { SUP_log("- ".$server." was successfully pinged"); } else { SUP_log("- ".$server." could not be pinged. Error message: “".$client->error->message."”"); } } } $post_title = ""; # Receives the title of the post from a filter below function SUP_post_title($title) { global $post_title; $post_title = $title; return $title; } # ----- # Log stuff $logfile = ABSPATH."wp-content/smart-update-pinger.log"; # for debugging function SUP_log($line) { global $logfile; $fh = @fopen($logfile, "a"); @fwrite($fh, strftime("%D %T")."\t$line\n"); @fclose($fh); } function SUP_get_last_log_entries($num) { global $logfile; $lines = @file($logfile); if($lines === false) return "Error reading log file (".$logfile."). This could mean that the wp-content directory is write-protected and no log data can be saved, that you have manually removed the log file, or that you have recently upgraded the plugin."; else { $lines = array_slice($lines, count($lines) - $num); $msg = ""; foreach($lines as $line) $msg .= trim($line)."
"; return $msg; } } # ----- # adds a filter to receive the title of the post before publishing add_filter("title_save_pre", "SUP_post_title"); # adds some hooks # shows the options in the administration panel add_action("admin_menu", "SUP_add_options_page"); # calls SUP_ping whenever a post is published add_action("publish_post", "SUP_ping_if_new"); # calls SUP_ping_draft when changing the status from private/draft to published # add_action("private_to_published', 'SUP_ping_draft'); # removes the "WordPress official" pinging hook remove_action("publish_post", "generic_ping"); # activates pinging if setting doesn't exist in database yet # (before the user has changed the settings the first time) if(get_option("SUP_ping") === false) { update_option("SUP_ping", 1); } ?> Pushbutton Engine - Working With Virtual Controls | .: Blog.FlashGen.Com :: Mike Jones - Creative Technologist :.

./Pushbutton Engine – Working With Virtual Controls

In this article we’re going to look at how you can add virtual controls to your games. This is especially useful if you are looking to port or convert your games to alternative platforms such as tablets and smartphones that tend to be touch-screen driven. I’m not going to go over the process of creating virtual controls in this article as I have already covered this in detail in the article “Virtual Controllers For Touch Based Devices”. You can read part 1 here and part 2 here.
In fact, the thumbstick control used here is the very same one described in that article.

Creating the Boilerplate
As with most of the articles in this series, you’ll need to start with some boilerplate code. Don’t worry if you don’t want to copy and paste the code below – you can just grab the source code for this article from the Related Files section. It is worth noting that this was created using Flash Builder 4.5 and the new ActionScript mobile project that comes with it, so if you want to test the example code I suggest you grab a trial copy of Flash Builder 4.5 otherwise it won’t compile correctly).

If you’ve been following the series you’ll already be familiar with this structure. If not here is a brief recap: there are three methods invoked by the constructor, each one deals with initializing an aspect of the game. Firstly there is the scene view – basically the game playing field. Second, there is the player character – often referred to as the ‘hero’. Finally, in this example there is the background. We’re not going to be doing a great deal with these methods in this article but it is beneficial for you to know what each aspect does. Instead we’re going to look at how you go about adding in the virtual controls I mentioned at the beginning and for that you don’t need to interact with Pushbutton Engine (PBE). (Well you do but I’ll clarify this point when we come to it.)

Adding In Your Controls
First you need to create a new method called initializeControls() and invoke it right after the initializeBackground() method in your constructor. Inside this method you just instantiate the controllers – in this case just a single thumbstick control. You’ll notice in the code below that once the x and y positions have been set you invoke a call to _sceneView.addDisplayObject() and pass it a reference to the thumbstick.

If you track back the variable _sceneView you’ll see it is instantiated and assigned in the initializeScene() method (this is the ‘it does / doesn’t need to interact with PBE’ bit). The SceneView class is one of the UI classes provided by PBE and it allows you to add objects to the SceneView instance (in this case _sceneView) the same way you would add items to the standard ActionScript DisplayList, so it is easy to create your game UIs completely separately to PBE and only wire them in where necessary (you can even leverage Flex for your UIs if you choose).

So How Does The Controller Work?
Without going over the ground the articles about virtual controllers have already covered, the controller does nothing more than dispatch key press events based on the movement of the actual ‘thumb’ of the thumbstick. By default, these are mapped to Up, Down, Left and Right. You will recall from one of the earlier articles how to add user input control to your ‘hero’ entity. Well, with a class called KeyboardController() mapped in to the initializeHero() method as one of the ‘hero’ components, whenever the user moves the thumbstick the relevant key press events are fired and the KeyboardController() class associated with the hero is triggered.

I’ve put a version below, but this has limited functionality when it comes to testing virtual controls for a couple of reasons. Firstly, you’re running in a simulated environment – in the case of the example below it is mapping the controller’s movements to mouse events and not touch events. This is primarily because few people have touch screen computers (although if you look at this article on a Blackberry PlayBook or Android Tablet it should work as expected). Secondly, it isn’t your target platform for these types of controls so performance and functional testing ‘off device’ will only get you so far and are unlikely to give you an ideal representation of real world conditions.

Get Adobe Flash player

In this article you’ve seen how you can easily go about adding in virtual controls to your games just by mapping them back in to existing controllers. And, you can easily add them to the display list of the SceneView class to create whatever additional UI elements you may require. We’ll be looking at more complex user interfaces in future articles so be sure to check back often.

Related Files