text:
11 December 2012
By clicking Submit, you accept the Adobe Terms of Use.
To make the most of this article you need intermediate knowledge of C/C++ and ActionScript 3.
If you've been wondering how to use C++ code in a Flash game, you'll be happy to hear that Adobe has introduced Flash C++ Compiler (FlasCC). Flascc is a complete BSD-like C/C++ development environment based on GCC that lets you compile your C/C++ code and create full SWFs or SWCs to be used in the development of Flash games.
This article introduces ActionScript 3 developers to flascc by walking through the development of a C++ path finding library for a simple Flash game. If you are going to use C++ code in your Flash game or if you just want to learn how flascc fits into the Flash ecosystem, this article is a useful guide for getting started based on a real world use case.
To see the chasing game that you will build in this article live, visit http://renaun.com/flash/pathfinder. The article will cover creating, debugging, and optimizing SWCs with flascc, as well as how to integrate an SWC into your Adobe Flash Builder ActionScript 3 project.
The flascc SDK comes with helpful documentation for getting started. Installation instructions for both Windows and Mac OS are found in the README.html file at the root of the flascc package. The following are some installation notes for following along with this article. The files you are interested in are located at
sdk/usr/bin/g++ and
sdk/usr/lib/asc2.jar, both relative to the flascc installation root folder.
Note: The recommended installation root folders for flascc,
C:\flascc\ on Windows and
~/flascc/ on Mac OS, are used for this article.
The flascc samples and the sample files of this article include makefiles. On Mac OS you might need Xcode to get the required make application, so for this article I'll also show you how to use the command line instead of make. If you're using Window you can get a version of make by installing Cygwin. I recommend using the included run.bat file to install the flascc-specific Cygwin version that includes all the required packages.
To simplify instructions for the remainder of this article, I'm going to prescribe a location for saving and building the samples for this article.
samples folder and create a new folder named
samples/PathFinder folder you just created.
You should see subfolders named
Step1 through
Step10; these contain the code that is shown throughout the article. You can use them to follow along if you don't want to write code or commands by hand. The compile.sh, debug.sh, or optimize.sh files in the Step folders also contain the commands to run the specific steps in the command-line shell. For more explanation of the files and folders in the sample files refer to the README file that is included in the root folder of this article's sample files.
Note: The article references paths relative to the
samples/PathFinder folder. If you unzip the sample files in another location you will need to change the path values and commands given in this article.
Follow these steps to compile a SWF from a C application:
samples/PathFinder/sandbox folder that you created above.
Step1 folder):
#include <stdio.h>
int main()
printf("Hello World!\n");
Mac> ~/flascc/sdk/usr/bin/gcc hello.c -emit-swf -o hello.swf
Win> /cygdrive/c/flascc/sdk/usr/bin/gcc.exe hello.c -emit-swf -o hello.swf
You can run the SWF in a standalone Flash Player and see the Hello World text display in the Flash application. Notice the use of the
–emit-swf flag, which is not commonly used with GCC. Typically GCC creates an executable; flascc supports this option as well with the ability to create a Flash projector application with a copy of the ActionScript Virtual Machine (AVM) runtime. For a list of flascc specific GCC compiler flags see the reference documentation under "FlasCC-Specific GCC Command Line Options". You will learn more of these flascc specific GCC command-line options as you progress through the steps in this article.
Now that you've compiled a simple C application, you are ready for something a little more advanced: compiling an application with a C++ class.
samples/PathFinder/sandbox folder create three files named pathfinder.h, pathfinder.cpp, and main.cpp (you can find sample copies in the
Step2 folder).
You will create a basic C++ class with two properties x and y and one method called move.
class Pather {
int x, y;
void move(int dx, int dy);
#include "pathfinder.h"
void Pather::move(int dx, int dy) {
x += dx;
y += dy;
The move method is implemented by adding deltas to the x and y properties of the class.
To try out the class you'll need to compile a SWF. But this class by itself is not an application so you need to create one in the main.cpp file.
#include <stdio.h>
#include "pathfinder.h"
int main()
Pather *p = new Pather();
p->x = 10;
p->y = 15;
printf("Pather x/y: %d/%d\n", p->x, p->y);
p->move(5, 10);
printf("Pather x/y: %d/%d\n", p->x, p->y);
The application will create an instance of the Pather class, set the x and y properties, and then call move to update the x and y values.
Mac> ~/flascc/sdk/usr/bin/g++ pathfinder.cpp main.cpp -emit-swf -o main.swf
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe pathfinder.cpp main.cpp -emit-swf -o main.swf
Notice that you are using g++ instead of gcc now since you are compiling a C++ class. Also you need to specify all the classes to compile, which means you include both main.cpp and pathfinder.cpp file in the compiler arguments.
Run the resulting main.swf file and inspect the output (see Figure 1).
You have created a full SWF application from C++ with no ActionScript 3 code. The goal, however, is to create a SWC library from the C++ code with flascc and use it in a normal ActionScript 3 project.
Flascc relies on the Low Level Virtual Machine (LLVM) compiler infrastructure to turn C/C++ code into an intermediate representation (IR) format. The flascc compiling tools take the IR and generate ActionScript bytecode. As you may know, code in the ActionScript Byte Code (abc) format runs in the AVM when a SWF container file is run in Flash Player. Traditionally, the Flex compiler (mxmlc) or Flash compilers (asc and asc2) produce SWF files but some of the tools can create abc code directly, which I'll cover later.
The magic of the tools goes only so far. It doesn't automatically make your C++ code work as Flash Player classes. It also doesn't magically know all the Flash Player APIs and hook up everything for you. This is important to understand because it means you have to help bring the two sides together. This is done in a few ways and there are a few options on the C++ side to bring ActionScript 3 into your code through the C++ inline feature.
There are several basic changes that need to be addressed. The big one is memory. Flash Player has a garbage collector, whereas in C++ you have to manage all memory allocation and deallocation explicitly. To facilitate manual memory management Flash Player added a feature called domainMemory. It allows direct access to a block of memory. This allows the IR code for
malloc and
new in C/C++ to work inside Flash Player.
This means the Pather class you created in the last section needs to be created and destroyed manually inside the domain memory, not automatically like a normal ActionScript object. From an ActionScript 3 developer standpoint this is very important to understand, because you will have to manage code generated by flascc in the C/C++ memory mindset.
The next step is to create a SWC to use in a normal ActionScript project.
C++ is all about pointers. The main.cpp file from Step 2 includes this line of code:
Pather *p = new Pather();
This defines p as a pointer to the memory that holds the new instance of the Pather class. The AVM doesn't know what a C++ Pather class is. The abc code produced by flascc does, but it knows it in terms of how C++ handles classes. This means all communication between ActionScript and flascc generated abc code has to work on some common level. This common level is pointers. Some basic types like strings and integers can be converted by flascc helper functions, but generally you should think of the interface between flascc abc code and ActionScript 3 in terms of passing pointers.
For the Pather example, in the SWC you want to be able to create a Pather class and access the x, y, and move class members. The ActionScript 3 side can't create a Pather class directly so it has to ask the flascc abc code to create the class and pass back a pointer. Pointers are int values that hold the value of the memory address. Then, when the ActionScript 3 side wants to interact with the Pather class it passes in this pointer value, which enables the abc code to pull up the class and access the properties and methods on that instance. These helper methods are your ActionScript 3 interface to the flascc abc code.
Next you'll create some of these interface methods to get a better understanding of how they work. In the GCC spec, the
__attribute__ feature enables developers to decorate functions to help the compiler do something with them. Using the
__attribute__ feature and the LLVM
annotate() feature you can help the IR process along to define an interface API in C++ that ActionScript will understand; for example:
void someFunction() __attribute__((used, annotate("as3sig:public function someFunctionAS3():int"), annotate("as3package:com.renaun.flascc_interface")));
The first parameter of
__attribute__ is used; this tells the compiler to keep this function in the generated object file even though it might not be referenced by the code. This is needed because the API functions are not going to be called on the C++ side, but rather on the ActionScript 3 side. The annotate method is used by LLVM to generate from the IR a method signature that ActionScript 3 understands.
Now you can put it all together and create an interface for your Pather class. You'll want to be able to create a Pather class, destroy a Pather class, set and get x and y, and call the move method on a Pather instance from ActionScript 3.
Begin by creating a new file called as3api.cpp (an example is in the
Step3 folder) with the following code:
#include "pathfinder.h"
#include "AS3/AS3.h"
// First we mark the function declaration with a GCC attribute specifying the
// AS3 signature
////** flascc_createPather **////
void flascc_createPather() __attribute__((used,
annotate("as3sig:public function flascc_createPather():int"),
void flascc_createPather()
// Create an instance of the Class
Pather *result;
result = (Pather *)new Pather();
// Create int for the pointer into memory for this object instance
AS3_DeclareVar(asresult, int);
AS3_CopyScalarToVar(asresult, result);
// return the pointer value of this object in memory
////** flascc_deletePather **////
void flascc_deletePather() __attribute__((used,
annotate("as3sig:public function flascc_deletePather(self):void"),
void flascc_deletePather()
Pather *arg1 = (Pather *) 0 ;
AS3_GetScalarFromVar(arg1, self);
delete arg1;
////** flascc_set_x **////
void flascc_set_x() __attribute__((used,
annotate("as3sig:public function flascc_set_x(self, x:Number):void"),
void flascc_set_x()
Pather *arg1 = (Pather *) 0 ;
double arg2 ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, x);
// apply to object
if (arg1) (arg1)->x = arg2;
// return void
////** flascc_get_x **////
void flascc_get_x() __attribute__((used,
annotate("as3sig:public function flascc_get_x(self):Number"),
void flascc_get_x()
Pather *arg1 = (Pather *) 0 ;
double result ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
// apply to object
result = (double) ((arg1)->x);
// return Number
AS3_DeclareVar(asresult, Number);
AS3_CopyScalarToVar(asresult, result);
////** flascc_set_y **////
void flascc_set_y() __attribute__((used,
annotate("as3sig:public function flascc_set_y(self, y:Number):void"),
void flascc_set_y()
Pather *arg1 = (Pather *) 0 ;
double arg2 ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, y);
// apply to object
if (arg1) (arg1)->y = arg2;
// return void
////** flascc_get_y **////
void flascc_get_y() __attribute__((used,
annotate("as3sig:public function flascc_get_y(self):Number"),
void flascc_get_y()
Pather *arg1 = (Pather *) 0 ;
double result ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
// apply to object
result = (double) ((arg1)->y);
// return Number
AS3_DeclareVar(asresult, Number);
AS3_CopyScalarToVar(asresult, result);
////** flascc_move **////
void flascc_move() __attribute__((used,
annotate("as3sig:public function flascc_move(self, dx:int, dy:int):void"),
void flascc_move()
Pather *arg1 = (Pather *) 0 ;
int arg2 ;
int arg3 ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, dx);
AS3_GetScalarFromVar(arg3, dy);
// apply to object
// return void
I use the flascc_ prefix as a way to help me keep track of what methods are my interface between flascc and ActionScript 3 code. I also picked an arbitrary namespace,
com.renaun.flascc_interface, for the methods. The main point is to pick something that makes it easy to identify the ActionScript 3 and flascc interface methods.
These methods are still C/C++ methods, they just have special annotations to help with the cross compiling. This is also where the flascc-specific helper methods come into play to do any marshalling of method parameters and return types. Take a look at the
flascc_createPather method and the comments in uppercase:
////** flascc_createPather **////
void flascc_createPather() __attribute__((used,
// ActionScript 3 WILL EXPECT A RETURN VALUE OF "int"
annotate("as3sig:public function flascc_createPather():int"),
void flascc_createPather()
// Create an instance of the Class
Pather *result;
result = (Pather *)new Pather();
// Create int for the pointer into memory for this object instance
// CREATING A NEW VARIABLE THAT ActionScript 3 UNDERSTANDS
AS3_DeclareVar(asresult, int);
// CONVERTING TO A VALUE THAT ActionScript 3 UNDERSTANDS
AS3_CopyScalarToVar(asresult, result);
// return the pointer value of this object in memory
When flascc_createPather is called in ActionScript 3 it will return the pointer value of the newly instantiated Pather class. This pointer is later passed into the other methods, for example flascc_set_x:
////** flascc_set_x **////
void flascc_set_x() __attribute__((used,
// ActionScript 3 WILL PASS IN THE POINTER TO THE Pather INSTANCE AND THE NEW "x" VALUE, THEN EXPECT A RETURN VALUE OF "void"
annotate("as3sig:public function flascc_set_x(self, x:Number):void"),
void flascc_set_x()
Pather *arg1 = (Pather *) 0 ;
double arg2 ;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, x);
// apply to object
if (arg1) (arg1)->x = arg2;
// return void
The next step is to compile the interface code into a SWC instead of a SWF using the flascc-specific GCC compiler argument
–emit-swc. Although similar to
–emit-swc requires a namespace; for example,
–emit-swc=com.renaun.flascc. You can use this to ensure multiple flascc generated SWCs do not overlap.
When creating any flascc code you still have to have a main C run loop. For this SWC, you want to break the C main loop to be able to load control when the code is started in your ActionScript 3 project. There are three ActionScript 3 flascc helper functions on the
com.adobe.flascc.CModule class that help manage starting the main C run loop:
CModule.startAsync(), and
CModule.startBackground(). They are used for a standard start, starting a broken main C run loop, and starting a main C run loop in a Flash background worker respectively. To break the main C run loop on the C side you call the
AS3_GoAsync(), defined in
Open main.cpp (a copy can be found in the
Step3 folder) and replace the contents of the file with the following code to break the main C run loop:
#include "AS3/AS3.h"
int main()
The main C run loop is broken before any static initializers, which can put the library in a bad state, are called. To compile the SWC use one of the following commands:
Mac> ~/flascc/sdk/usr/bin/g++ pathfinder.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe pathfinder.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
These commands produce a PathFinder.swc file that can be used in an ActionScript 3 project.
In this article you will continue to create your interface code by hand. However, the Simplified Wrapper and Interface Generator (SWIG) tool can help you generate interface code from classes. There is an ActionScript 3 implementation of SWIG included with flascc (
sdk/usr/bin/swig). Use of SWIG is beyond the scope of this article, but there are some samples found in the flascc SDK that show how to use it. It's worth exploring if you are planning on using an existing library. If you do use SWIG, be prepared to learn how to use SWIG configuration files to optimize your interface by ignoring some methods and including only the methods that you want to expose as your interface.
Why would you want make a SWC more AS3 friendly? After you create a project and use the current version of PathFinder.swc the answer to this question will be clear.
samples/PathFinder/sandbox/PathFinderAS3Project location.
samples/PathFinder/sandbox/PathFinder.swc and add the SWC to your library path.
PathFinderAS3Project.as, and start typing flascc_. You should see the functions declared in as3api.cpp (see Figure 2).
Follow these steps to use PathFinder.SWC in your project:
Step4 folder)into it:
import com.renaun.flascc.CModule;
import com.renaun.flascc_interface.*;
import flash.display.Sprite;
import flash.text.TextField;
public class PathFinderAS3Project extends Sprite
public function PathFinderAS3Project()
var tf:TextField = new TextField();
tf.multiline = true;
tf.width = tf.height = 600;
var patherPtr:int = flascc_createPather();
flascc_set_x(patherPtr, 10);
flascc_set_y(patherPtr, 15);
tf.appendText("Pather x/y: " + flascc_get_x(patherPtr + "/" + flascc_get_y(patherPtr) + "\n");
flascc_move(patherPtr, 5, 10);
tf.appendText("Pather x/y: " + flascc_get_x(patherPtr)
+ "/" + flascc_get_y(patherPtr) + "\n");
CModule.startAsync(this) tells the SWC's flascc code to continue its main C run loop. Although you don't have anything in main.cpp, it kept the static initializers from loading until this point.
If you look at the code above, you'll notice that it doesn't look like what you expect when using a well structured ActionScript 3 object-oriented library. You really want code that looks like this:
var pather:PathFinder = new PathFinder();
pather.x = 10;
pather.y = 15;
pather.move(5, 10);
You can create your own ActionScript 3 classes and add them to the SWC by including the abc format in the compile process.
samples/PathFinder/sandbox/PathFinderWrapper.as. Here is the code for PathFinderWrapper.as (which can be found in the
Step5 folder):
package com.renaun
import com.renaun.flascc_interface.*;
import com.renaun.flascc.CModule;
public class PathFinder
public function PathFinder():void
objectPtr = flascc_createPather();
private var objectPtr:int;
public function get x():Number
return flascc_get_x(objectPtr);
public function set x(value:Number):void
flascc_set_x(objectPtr, value);
public function get y():Number
return flascc_get_y(objectPtr);
public function set y(value:Number):void
flascc_set_y(objectPtr, value);
public function move(dx:Number, dy:Number):void
flascc_move(objectPtr, dx, dy);
public function destroy():void
This is a straightforward ActionScript 3 class. In the constructor it calls the
flascc_createPather() method and then keeps the pointer value as a private variable to use in the other methods.
PathFinderWrapper.as to ActionScript Byte Code, or an ABC file. Execute one of the following commands (you'll need java to be in your command-line shell path):
Mac> java -jar ~/flascc/sdk/usr/lib/asc2.jar -merge -md -abcfuture -AS3 -import ~/flascc/sdk/usr/lib/builtin.abc –import ~/flascc/sdk/usr/lib/playerglobal.abc PathFinderWrapper.as
Win> java -jar /cygdrive/c/flascc/sdk/lib/asc2.jar -merge -md -abcfuture -AS3 –import /cygdrive/c/flascc/sdk/lib/builtin.abc –import /cygdrive/c/flascc/sdk/lib/playerglobal.abc PathFinderWrapper.as
This creates a
PathFinderWrapper.abc file in the same location.
Mac> ~/flascc/sdk/usr/bin/g++ PathFinderWrapper.abc pathfinder.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe PathFinderWrapper.abc pathfinder.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Now PathFinder.swc has the
com.renaun.PathFinder ActionScript 3 wrapper class, which is much easier to use than the methods defined in as3api.cpp.
PathFinderAS3Project/src/PathFinderAS3Project.as (found in Step5 folder) and change the bottom section of code to:
var pather:PathFinder = new PathFinder();
pather.x = 10;
pather.y = 15;
tf.appendText("PathFinder x/y: " + pather.x + "/" + pather.y + "\n");
pather.move(5, 10);
tf.appendText("PathFinder x/y: " + pather.x + "/" + pather.y + "\n");
Now that you understand the basics of how to create a SWC out of C++ files with flascc its time to do the actual path finding implementation. I chose to use an open source project implementation of the A* path finding algorithm called MicroPather. It's really only two classes but it is a good exercise in reusing existing code. The micropather.h and micropather.cpp files are included in the sample files (in the
Step6 folder) for this article. Alternatively, you can get the source from http://www.grinninglizard.com/MicroPather/.
As a first step, copy these two files into
The MicroPather class works by instantiating the class with a reference to a class that extends Graph. Your goal is to extend the Pather class and implement the abstract Graph class. There are three virtual methods that need to be implemented for the abstract Graph class:
virtual float LeastCostEstimate(void* nodeStart, void* nodeEnd);
virtual void AdjacentCost(void* node, std::vector< StateCost > *neighbors);
virtual void PrintStateInfo( void* node );
You won't need to print any state from the C++ side so
PrintStateInfo will not implement anything. The other two methods are where the specific A* implementation defines tile weights to be used to make decisions about paths are calculated. For example, you could weigh different terrain on a map, hill versus valley, with different values. In this case you are going to do basic distance-based weighting of 1 for up, down, left, and right and the cost of a diagonal move as 1.4. MicroPather will not handle the map itself, which means you'll need a way to know the size of the map and what locations on the map are passable. You also need some helper methods to translate between the map array indexing (0…col*row) and finding a location on the map with X and Y values. With all those implementation methods you want two methods that will be called from the ActionScript 3 side. There needs to be a way to set the map in memory and after it is set to ask for a path between two points.
Follow these steps to begin implementing the MicroPather class in the Pather class:
#include <math.h>
#include <vector>
#include "micropather.h"
using namespace micropather;
class Pather : public Graph {
unsigned char *map;
MicroPather* pather;
int mapColSize;
int mapRowSize;
Pather() {
virtual ~Pather() {
delete pather;
void setMap(unsigned char* buffer, int colSize, int rowSize);
int* getPath(int sx, int sy, int nx, int ny);
int Passable(int nx, int ny);
void NodeToXY(void* node, int* x, int* y);
void* XYToNode(int x, int y);
virtual float LeastCostEstimate(void* nodeStart, void* nodeEnd);
virtual void AdjacentCost(void* node, std::vector< StateCost > *neighbors);
virtual void PrintStateInfo( void* node );
samples/PathFinder/sandbox/patherfinder.cpp and replace the contents with the following code:
#include "pathfinder.h"
void Pather::setMap(unsigned char* buffer, int colSize, int rowSize) {
map = buffer;
mapColSize = colSize;
mapRowSize = rowSize;
int memSize = mapColSize * mapRowSize;
if (memSize > 1000) memSize /= 4;
pather = new MicroPather(this, memSize);
int* Pather::getPath( int sx, int sy, int nx, int ny )
// micropather uses this
std::vector<void*> path;
// I want to change to my own format and return with pathResult and size of path, could add total cost too, possible memory leak
unsigned short int* result;
int pathResult = MicroPather::NO_SOLUTION;
unsigned int size = 0;
if ( Passable( sx, sy ) == 1 && Passable( nx, ny ) == 1 )
float totalCost;
pathResult = pather->Solve( XYToNode( sx, sy ), XYToNode( nx, ny ), &path, &totalCost );
if ( pathResult == MicroPather::SOLVED ) {
size = path.size();
result = new unsigned short int[(size*2)+2];
result[0] = pathResult;
result[1] = size;
unsigned k;
for( k=0; k<size; ++k ) {
int x, y;
NodeToXY( path[k], &x, &y );
result[(k*2)+2] = x;
result[(k*2)+3] = y;
result = new unsigned short int[2];
result[0] = pathResult;
result[1] = size;
return (int*)result;
int Pather::Passable( int nx, int ny )
if ( nx >= 0 && nx < mapColSize
&& ny >= 0 && ny < mapRowSize )
int index = ny*mapColSize+nx;
return map[ index ];
return 0;
void Pather::NodeToXY( void* node, int* x, int* y )
int index = (intptr_t)node;
*y = index / mapColSize;
*x = index - *y * mapColSize;
void* Pather::XYToNode( int x, int y )
return (void*) ( y*mapColSize + x );
float Pather::LeastCostEstimate( void* nodeStart, void* nodeEnd )
int xStart, yStart, xEnd, yEnd;
NodeToXY( nodeStart, &xStart, &yStart );
NodeToXY( nodeEnd, &xEnd, &yEnd );
/* Compute the minimum path cost using distance measurement. It is possible
to compute the exact minimum path using the fact that you can move only
on a straight line or on a diagonal, and this will yield a better result.
int dx = xStart - xEnd;
int dy = yStart - yEnd;
return (float) sqrt( (double)(dx*dx) + (double)(dy*dy) );
void Pather::AdjacentCost( void* node, std::vector< StateCost > *neighbors )
int x, y;
const int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
const int dy[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
const float cost[8] = { 1.0f, 1.41f, 1.0f, 1.41f, 1.0f, 1.41f, 1.0f, 1.41f };
NodeToXY( node, &x, &y );
for( int i=0; i<8; ++i ) {
int nx = x + dx[i];
int ny = y + dy[i];
int pass = Passable( nx, ny );
if ( pass == 1 )
// Normal floor
StateCost nodeCost = { XYToNode( nx, ny ), cost[i] };
neighbors->push_back( nodeCost );
void Pather::PrintStateInfo( void* node )
Passable method checks to make sure the coordinates are inside the map and that it is a passable tile. The
NodeToXY and
XYToNode methods are helper methods that convert between the array index and x and y locations. The actual call to the MicroPather
Solve method is in the
getPath method.
samples/PathFinder/sandbox/as3api.cpp file and replace the contents with the following code (found in the
Step6 folder):
#include "pathfinder.h"
#include "AS3/AS3.h"
// First we mark the function declaration with a GCC attribute specifying the
// AS3 signature
////** flascc_createPather **////
void flascc_createPather() __attribute__((used,
annotate("as3sig:public function flascc_createPather():int"),
void flascc_createPather()
// Create an instance of the Class
Pather *result;
result = (Pather *)new Pather();
// Create int for the pointer into memory for this object instance
AS3_DeclareVar(asresult, int);
AS3_CopyScalarToVar(asresult, result);
// return the pointer value of this object in memory
////** flascc_deletePather **////
void flascc_deletePather() __attribute__((used,
annotate("as3sig:public function flascc_deletePather(self):void"),
void flascc_deletePather()
Pather *arg1 = (Pather *) 0 ;
AS3_GetScalarFromVar(arg1, self);
delete arg1;
////** flascc_setMap **////
void flascc_setMap() __attribute__((used,
annotate("as3sig:public function flascc_setMap(self, buffer:int, colSize:int, rowSize:int):void"),
void flascc_setMap()
Pather *arg1 = (Pather *) 0 ;
unsigned char *arg2 = (unsigned char *) 0 ;
int arg3;
int arg4;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, buffer);
AS3_GetScalarFromVar(arg3, colSize);
AS3_GetScalarFromVar(arg4, rowSize);
// apply to object
(arg1)->setMap((unsigned char *)arg2, arg3, arg4);
// return void
////** flascc_getPath **////
void flascc_getPath() __attribute__((used,
annotate("as3sig:public function flascc_getPath(self, sx:int, sy:int, nx:int, ny:int):int"),
void flascc_getPath()
Pather *arg1 = (Pather *) 0 ;
int arg2;
int arg3;
int arg4;
int arg5;
int* result;
// convert arguments
AS3_GetScalarFromVar(arg1, self);
AS3_GetScalarFromVar(arg2, sx);
AS3_GetScalarFromVar(arg3, sy);
AS3_GetScalarFromVar(arg4, nx);
AS3_GetScalarFromVar(arg5, ny);
// apply to object
result = (arg1)->getPath(arg2, arg3, arg4, arg5);
// return Number
AS3_DeclareVar(asresult, int);
AS3_CopyScalarToVar(asresult, result);
getPath() and
setMap() interface methods in the
as3api.cpp file you need to update the ActionScript 3 wrapper class PathFinderWrapper.as. Open
samples/PathFinder/sandbox/PathFinderWrapper.as file and replace the contents with the following code (found in the
Step6 folder):
package com.renaun
import com.renaun.flascc_interface.*;
import com.renaun.flascc.CModule;
import com.renaun.flascc.ram;
import flash.utils.ByteArray;
public class PathFinder
public function PathFinder(map:ByteArray, colSize:int, rowSize:int):void
objectPtr = flascc_createPather();
mapColSize = colSize;
mapRowSize = rowSize;
if (map.length != colSize * rowSize)
throw new Error("Map size doesn't equal col * row size");
// Setup bytes to be written to Flascc memory
map.position = 0;
mapByteArrayPtr = CModule.malloc(map.length);
CModule.writeBytes(mapByteArrayPtr, map.length, map);
flascc_setMap(objectPtr, mapByteArrayPtr, colSize, rowSize);
public var mapColSize:int;
public var mapRowSize:int;
private var objectPtr:int;
public var mapByteArrayPtr:int;
public function getMap():ByteArray
var mapBytes:ByteArray = new ByteArray();
ram.position = mapByteArrayPtr;
ram.readBytes(mapBytes, 0, mapColSize * mapRowSize);
return mapBytes;
public function getPath(sx:int, sy:int, nx:int, ny:int):Array
var pathPtr:int = flascc_getPath(objectPtr, sx, sy, nx, ny);
ram.position = pathPtr;
var result:int = ram.readShort();
var size:int = ram.readShort();
var pathXYs:Array = [];
if (size > 0)
for (var j:int = 1; j < size; j++)
return pathXYs;
public function destroy():void
This implements a useful library that takes a map as input and provides a path between two points. The map is made up of 1s for passable and 0s for non-passable points.
Mac> ~/flascc/sdk/usr/bin/g++ PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
To try out the newly implemented path finding code, you'll need to create a new application that uses the SWC.
PathFinderAS3Project/src/PathFinderAS3Project.as and replace its contents with the following code (found in the
Step7 folder):
import com.renaun.PathFinder;
import com.renaun.flascc.CModule;
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.ByteArray;
[SWF(frameRate="60", width="640" height="640", backgroundColor="#336699")]
public class PathFinderAS3Project extends Sprite
public function PathFinderAS3Project()
var tf:TextField = new TextField();
tf.multiline = true;
tf.width = tf.height = 600;
// Create Checker Board map Map
var map:ByteArray = new ByteArray();
var mapCols:int = 10;
var mapRows:int = 10;
for (var i:int = 0; i < mapCols * mapRows; i++)
map.writeByte(int((1+i+i/mapCols) % 2));
var pf:PathFinder = new PathFinder(map, mapCols, mapRows);
tf.appendText("Path Between (0,0 , 9, 5): " + pf.getPath(0, 0, 9, 5) + "\n");
The code above creates a checkerboard map and then finds a path between points 0,0 and 9,5 (see Figure 4).
Now you're ready to build a more complex game to make use of the new PathFinder.swc. The idea of the game is to have a blue box that the user controls by clicking on valid map tiles. The game will create a random number of red circles that will chase the blue circle by changing their paths every certain number of frames (see Figure 5). The blue circle will move faster than the red circles so it will be easy to move around and see the red circles' paths change. To see a live version of the game, visit http://renaun.com/flash/pathfinder/.
Next, you'll make a class that knows how to render blue and red circles, move them by location, and move them along a path. It is a good practice to encapsulate specific class logic into the class to which it's related.
Step8 folder):
package com.renaun.game
import flash.display.Sprite;
public class MovableEntity extends Sprite
public function MovableEntity(size:int = 10, type:String = "enemy")
this.size = size;
graphics.beginFill( ((type == "enemy") ?
0xCC0000 : 0x3333AA), 0.8);
graphics.lineStyle(2, 0x222222, 0.8);
graphics.drawCircle(size/2, size/2, size/2);
protected var size:int = 10;
public var tileX:int = 0;
public var tileY:int = 0;
public var currentPath:Array;
public function move(tileX:int, tileY:int):void
this.tileX = tileX;
this.tileY = tileY;
x = tileX * size;
y = tileY * size;
public function moveByPath():void
if (!currentPath || currentPath.length == 0)
var newX:int = currentPath.shift();
var newY:int = currentPath.shift();
move( newX, newY);
The MovableEntity class draws a blue or red circle based on the size and type passed into the constructor. It supports moves to a specified tile and along a path specified by the
currentPath value. The currentPath value will be set in our game logic loop with the result of our path finder library call between the current red circle and the blue circle. This is a fairly simple class but it will make implementing game logic easier.
Another good place to encapsulate logic is the code that renders the map. It's just a grid of 1s and 0s. So for simplicity, you'll just use two different colors and draw the grid based on a fixed size.
package com.renaun.game
import flash.display.Sprite;
import flash.utils.ByteArray;
import com.renaun.PathFinder;
public class BoardRenderer extends Sprite
public function BoardRenderer(pather:PathFinder, squareSize:int = 20)
this.pather = pather;
this.squareSize = squareSize;
protected var pather:PathFinder;
protected var squareSize:int;
private function render():void
var mapBytes:ByteArray = pather.getMap();
for (var i:int = 0; i < pather.mapRowSize; i++)
for (var j:int = 0; j < pather.mapColSize; j++)
drawTile(mapBytes.readByte(), j, i);
private function drawTile(type:int, x:int, y:int):void
var color:uint = (type == 1) ? 0xAAAAAA : 0x663333;
graphics.lineStyle(1, 0x222222, 0.5);
graphics.drawRect(x*squareSize, y*squareSize, squareSize, squareSize);
public function drawPath(path:Array):void
graphics.lineStyle(squareSize/3, 0xff0000);
for (var i:int = 0; i < path.length/2; i++)
if (i == 0)
graphics.moveTo( (path[i*2]*squareSize)+(squareSize/2), (path[(i*2)+1]*squareSize)+(squareSize/2));
graphics.lineTo( (path[i*2]*squareSize)+(squareSize/2), (path[(i*2)+1]*squareSize)+(squareSize/2));
You pass this class the tile size and a reference to the Pather instance, so it can get the map values and know how to render it. The
render() method draws different colored squares based upon the map values.
The final step in putting all the pieces together is to implement the setup and game logic. The game logic includes the following tasks:
There is also some setup code to randomize the map each time and randomly pick starting points for the circles. The setup keeps track of valid tiles so the circles can move immediately at the start.
Replace the contents of
PathFinderAS3Project/src/PathFinderAS3Project.as with the following code (found in the
Step8 folder):
import com.renaun.PathFinder;
import com.renaun.flascc.CModule;
import com.renaun.flascc.ram;
import com.renaun.game.BoardRenderer;
import com.renaun.game.MovableEntity;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.ByteArray;
[SWF(frameRate="60", width="640" height="640", backgroundColor="#336699")]
public class PathFinderAS3Project extends Sprite
public static const TILE_SIZE:int = 10;
public static const TIME_SLICE_GUY:int = 6;
public static const TIME_SLICE_ENEMY:int = 30;
private var timeSlice:int = 0;
private var validStartTiles:Array;
private var mapCols:int;
private var mapRows:int;
private var theGuy:MovableEntity;
private var enemies:Array = [];
private var lastX:int = -1;
private var lastY:int = -1;
private var pf:PathFinder;
public function PathFinderAS3Project()
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
protected function addedToStageHandler(event:Event):void
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
// Generate random map and keep track of valid start tiles
var map:ByteArray = new ByteArray();
validStartTiles = [];
mapCols = 60;
mapRows = 60;
var temp:int = 0;
for (var i:int = 0; i < mapCols * mapRows; i++)
temp = (int(Math.random()*0xffff) % 2 == 1) ? 0 : 1;
if (temp == 1) validStartTiles.push(i);
pf = new PathFinder(map, mapCols, mapRows);
var debugRender:BoardRenderer = new BoardRenderer(pf, PathFinderAS3Project.TILE_SIZE);
// Make Blue and Red Circles
for (var k:int = 0; k < 60; k++)
// Set up event methods for run loop and mouse down
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
private function createEntities(type:String = "enemy"):void
var guy:MovableEntity = new MovableEntity(TILE_SIZE, type);
var startIndex:int = validStartTiles[int(Math.random() * validStartTiles.length)];
var tileY:int = startIndex / mapCols;
guy.move(startIndex - (mapCols * tileY), tileY);
if (type == "enemy")
theGuy = guy;
protected function mouseDownHandler(event:MouseEvent):void
var tileX:int = int(event.stageX / TILE_SIZE);
var tileY:int = int(event.stageY / TILE_SIZE);
if (tileX < mapCols && tileY < mapRows)
theGuy.currentPath = pf.getPath(theGuy.tileX, theGuy.tileY, tileX, tileY);
protected function enterFrameHandler(event:Event):void
var i:int;
if (timeSlice % TIME_SLICE_GUY == 0)
// Has The guy changed locations? if so re do the paths
if (lastX != theGuy.tileX || lastY != theGuy.tileY)
lastX = theGuy.tileX;
lastY = theGuy.tileY;
for (i = 0; i < enemies.length; i++)
enemies[i].currentPath = pf.getPath(enemies[i].tileX, enemies[i].tileY, theGuy.tileX, theGuy.tileY);
if (timeSlice % TIME_SLICE_ENEMY == 0)
var hits:int = 0;
for (i = 0; i < enemies.length; i++)
if (enemies[i].tileX == theGuy.tileX && enemies[i].tileY == theGuy.tileY)
if (hits > 5) restartGame();
if (timeSlice > 360)
timeSlice = 0;
protected function restartGame():void
timeSlice = 0;
var startIndex:int = validStartTiles[int(Math.random() * validStartTiles.length)];
var tileY:int = startIndex / mapCols;
theGuy.move(startIndex - (mapCols * tileY), tileY);
for (var i:int = 0; i < enemies.length; i++)
startIndex = validStartTiles[int(Math.random() * validStartTiles.length)];
tileY = startIndex / mapCols;
enemies[i].move(startIndex - (mapCols * tileY), tileY);
That is all the code for the game. Run the game in Flash Builder to see it all working together. You can play around with the map size or the number of red circles generated by making a few changes to PathFinderAS3Project.as.
You can debug the C++ code in flascc-generated SWFs or SWCs. This is done using the modified flascc GDB found at
sdk/usr/bin/gdb. It's important to point out that the flascc GDB only debugs C++ code and not ActionScript 3 code in your ActionScript 3 project.
Mac> ~/flascc/sdk/usr/bin/g++ -g PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe -g PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
The next step is to tell the flascc GDB where the debug version of Flash Player or a browser with a debug version of Flash Player is located. I recommend pointing directly to the standalone player the first time you try and get GDB working.
FLASCC_GDB_RUNTIME environment variable. You can do this with one of the following commands (assuming the standalone Flash Player is in the folder
/FlashPlayers or
Mac> export FLASCC_GDB_RUNTIME=/FlashPlayers/Flash\ Player\ Debugger.app
Win> export FLASCC_GDB_RUNTIME=C:\FlashPlayers\flashplayer_11_sa_debug.exe
To get the latest standalone debug Flash Player, visit http://www.adobe.com/support/flashplayer/downloads.html.
The next step is to recompile the PathFinderAS3Project SWF with the PathFinder.swc that has the debug symbols. Since a SWF could have multiple flascc SWCs with different namespaces you need to tell GDB what namespace to use. This namespace is the value set with
–emit-swc=com.renaun.flascc in the SWC compile command. The GDB command to set the correct namespace is set
as3namespace com.renaun.flascc. Instead of typing commands in the GDB command prompt each time, you can set up a GDB script file.
sandbox/gdb_commands.txt and add the following text (found in the
Step9 folder):
set as3namespace com.renaun.flascc
set breakpoint pending on
b flascc_setMap
The first command sets the namespace as discussed above. The second command sets the default value of "yes" for a warning about setting break points to code that hasn't had its symbols loaded yet. The third line sets a break point to a function called
flascc_setMap, which is in the C++ as3api.cpp file. The fourth and final line runs the debugger.
Mac> ~/flascc/sdk/usr/bin/gdb -x gdb_commands.txt PathFinderAS3Project/bin-debug/PathFinderAS3Project.swf
Win> /cygdrive/c/flascc/sdk/usr/bin/gdb.exe -x gdb_commands.txt PathFinderAS3Project/bin-debug/PathFinderAS3Project.swf
You should see the standalone Flash Player launch and the following output in your command-line shell:
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin10 --target=avm2-elf".
For bug reporting instructions, please see:
No symbol table is loaded. Use the "file" command.
Breakpoint 1 (flascc_setMap) pending.
0xdddddddd in ?? ()
Breakpoint 1, 0xf0009822 in flascc_setMap () at as3api.cpp:57
57 Pather *arg1 = (Pather *) 0 ;
This indicates that GDB stopped at the
flascc_setMap() breakpoint and you can now use the normal GDB commands to debug the C++ code.
As far as GDB knows, it is remotely debugging a real native C/C++ application, so when it prints out information about the current call stack or local variables, it prints out the current C/C++ call stack or the current C/C++ local variables. To see further up the call stack into ActionScript code, or to inspect the values of ActionScript local variables, flascc implements several AS3-specific versions of the regular GDB commands, prefixed with as3. A list of these commands and descriptions are found in the flascc documentation Reference.html page.
Note: The use of –g –O0 might be needed if you are not getting all your debug symbols. The extra –O0 flag turns off all optimization that might strip symbols.
When creating a SWF or SWC, flascc compiles every symbol that it finds in the code. Most likely, you do not need every symbol. For example, you don't want to include object symbols that are never used because they take up space. You might also want to only include object symbols that are used in your SWC interface so you can keep the size small.
In the process of creating and using SWC libraries with Flash Builder 4.7 (or compc), you specify in Flash Builder (or compc) which classes you want included. For example, in the ActionScript library project shown in Figure 6, I include only certain classes into my SWC. Then when a SWF compiles against the SWC it will only include the objects that are used.
Flash Builder will still pull in any classes that are referenced inside the included classes. The process of optimizing the GCC tool workflow to limit what object symbols are present in the final bits through inclusion or exclusion is a bit different than just giving it a list of class names. Also you still need to include all used object code, you just don't want to include it as public interfaces, which in the flascc process would create additional unwanted code.
The first step optimizing the SWC size is to identify the object symbols for the methods included as the public API for the flascc produced SWC. To create just object files with g++ (and not link them into the final output) use the
-c flag. Since this is a flascc
g++ it will create abc object code, which you do not want at this step. The other flag that is needed to produce LLVM bitcode is
–emit-llvm or
–O4 (that is capital letter O not zero). In this case, use the
–O4 flag, which is similar
–emit-llvm but with a few other optimizations. You have to decide what public API you want included in the optimized SWC. This is simple because all of the interface code is in the as3api.cpp file. You can generate LLVM bitcode with the following command:
Mac> ~/flascc/sdk/usr/bin/g++ -O4 –c as3api.cpp
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe -O4 –c as3api.cpp
This will generate an as3api.o file in the same directory. This binary file contains the object code as well as the names of the symbols. You want to filter out the symbol names to use as a list of symbols for the LLVM tool chain to use. To do this you can use a few common tools:
awk, and
nm tool lists symbols from binary object files. Since the flascc tools generate and use specific object code you will need to use the nm version included in the flascc SDK, which is located at
sdk/usr/bin/nm; for example:
Mac> ~/flascc/sdk/usr/bin/nm as3api.o
Win> /cygdrive/c/flascc/sdk/usr/bin/nm.exe as3api.o
The preceding commands generate the following output:
00000000 T __Z13flascc_setMapv
00000000 T __Z14flascc_getPathv
00000000 T __Z19flascc_createPatherv
00000000 T __Z19flascc_deletePatherv
00000000 W __ZN11micropather5GraphD0Ev
00000000 W __ZN11micropather5GraphD1Ev
U __ZN6Pather6setMapEPhii
U __ZN6Pather7getPathEiiii
00000000 W __ZTIN11micropather5GraphE
00000000 W __ZTSN11micropather5GraphE
U __ZTV6Pather
U __ZTVN10__cxxabiv117__class_type_infoE
00000000 W __ZTVN11micropather5GraphE
U __ZdlPv
U __Znwj
U ___cxa_pure_virtual
The second column with the capital letters defines what type of symbol in the list. The T type is for symbols in the code. The W and U types are weak and undefined symbols, respectively. In this case, you are only concerned with the T type symbols. You could manually copy the symbol names out of the output but that could be cumbersome for larger object files. You can use grep, awk, and sed to change a line like:
00000000 T __Z13flascc_setMapv
and make it look like:
Here is the command:
Mac> ~/flascc/sdk/usr/bin/nm as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/'
Win> /cygdrive/c/flascc/sdk/usr/bin/nm.exe as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/'
The pipe (
|) command feeds the output of one command into the input of the command after the pipe. The command above sends the output of
nm to
grep, then sends the output of
grep to
awk, and finally sends the output of
awk to
sed. The
grep tool searches text and only return lines of text that match the given pattern, in this case " T ". After
sed, the output looks like this:
00000000 T __Z13flascc_setMapv
00000000 T __Z14flascc_getPathv
00000000 T __Z19flascc_createPatherv
00000000 T __Z19flascc_deletePatherv
awk tool by default treats spaces in text lines as delimiters for fields of data. The
awk instruction
'{print $3}' tells awk to print the third parameter on each line. After
awk, the output looks like this:
sed tool facilitates string replacement on each line of text. In this case you want to replace the double underscore characters with just one underscore character. This is done with
's/__/_/'. After
sed, the output looks like this:
Now you have the list of symbols that you need for the public API that LLVM will recognize in the optimization phase of only including the symbols you want. The last step is to take this output and put it into a file that you can use in the g++ build command. You do this by redirecting the output of the command into a file using the redirect and append command (
>>). Here is the full command:
Mac> ~/flascc/sdk/usr/bin/nm as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/' >> exports.txt
Win> /cygdrive/c/flascc/sdk/usr/bin/nm.exe as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/' >> exports.txt
You will use the exports.txt file in the next step.
The flascc-specific GCC command line option
–flto-api is used to define the public API that LLVM will preserve. This allows the LLVM's optimizer to strip any symbols not mentioned in the exports.txt file or that aren't referenced by the symbols mentioned in this file. This is similar to how the ActionScript library compiler (or compc) will pull in only the files that you include as well as any classes that the included files reference.
You have to do one more thing before running the command. There are a few flascc-specific public API symbols that you need to include to be able to run your code. These are default symbols that you should always include. Create a file named
sandbox/flascc_exports.txt and add the following text with a blank line at the end (see the
Step10 folder for an example):
# built in symbols that must always be preserved
# symbols for C++ exception handling
You want to copy these default symbols to exports.txt each time you add the symbols from your code into the file. Here are the commands for that process:
Mac> cp –f flascc_exports.txt exports.txt
Mac> ~/flascc/sdk/usr/bin/nm as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/' >> exports.txt
Win> cp –f flascc_exports.txt exports.txt
Win> /cygdrive/c/flascc/sdk/usr/bin/nm.exe as3api.o | grep " T " | awk '{print $3}' | sed 's/__/_/' >> exports.txt
Again make sure the first symbol from your code ends up on a new line in the exports.txt after the last # comment in flascc_exports.txt. The exports.txt file should end up looking like this:
# built in symbols that must always be preserved
# symbols for C++ exception handling
With the list of files for the LLVM to optimize all that is needed is to add the
–flto-api to the final
g++ build command. Along with the addition of the
–flto-api you also need to add the
–O4 optimization flag to the command. The addition of the
–O4 flag is important to make sure the symbols you included, which were created with
–O4 as LLVM bitcode, match the LLVM bitcode that –O4 produces in this final step. Here is the command:
Mac> ~/flascc/sdk/usr/bin/g++ -O4 -flto-api=exports.txt PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Win> /cygdrive/c/flascc/sdk/usr/bin/g++.exe -O4 -flto-api=exports.txt PathFinderWrapper.abc micropather.cpp pathfinder.cpp as3api.cpp main.cpp -emit-swc=com.renaun.flascc -o PathFinder.swc
Looking at the resulting PathFinder.swc size compared to the non-optimized version, you'll see quite a difference.
PathFinder.swc with no -O4, size: 619kb
PathFinder.swc with -O4, size: 483kb
PathFinder.swc with -O4 and exports.txt, size: 217kb
That is the sizes for the SWC, but how does this impact the final release build of the game? Here is the size of PathFinderAS3Project.swf as a release build using the different SWCs:
Using PathFinder.swc with no -O4, SWF size: 328.4kb
Using PathFinder.swc with -O4, SWF size: 263.3kb
Using PathFinder.swc with -O4 and exports.txt, SWF size: 88.7kb
I think the size numbers speak for themselves. It is well worth spending the time to optimize the code.
You've now walked through the full process of creating and using flascc compiled code inside an ActionScript 3 game. There is a lot of C/C++ code that is ripe to use inside ActionScript 3 games. With the skills learned in this article, including building, using, debugging, and optimizing flascc-based SWCs, you're ready to explore the advanced examples in the flascc SDK. You may want to learn how to use multithreading, integrate with a Stage3D game, or apply advanced SWIG features, which are all covered in the samples folder. There are also reference samples of Lua, Quake, Box2D, and the Bullet physics library running in ActionScript 3 through the use of flascc.
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. Permissions beyond the scope of this license, pertaining to the examples of code included within this work are available at Adobe.


text:
Jimmy Dore Show podcast 4-19-13
More Stuff Happened and We Make Fun Of IT!
Phone calls from Pres Obama,Luke Russert, Drunk Bill Oreiily, plus lots more!
WIth Mike MacRae, Frank Conniff, Jim Earl, Steve Rosenfield, Robert Yasumura, Stef Zamorano
Originating from KPFK 90.7 FM in Los Angeles, The Jimmy Dore Show is an irreverent and humorous take on today's headlines and hypocrites. The program skewers politicians as well as the corporate mouthpieces which make up today's mainstream "news media." Each and every week, The Jimmy Dore Show provides the unvarnished truth with a twist of funny.
Don't forget to subscribe, donate, and review the show on iTunes!
Hey guys, we all heard about the hilarious Bangladesh factory tragedy (death toll near 200 now), but it gets even funnier when you hear what Matthew Yglesias over at slate.com ("Different Places Have Different Safety Rules and That's OK") has to say about it. Forgive me if you already read this, but the fellows over at mrdestructo.com have given a rigorous analysis of Yglesias literary fiction (http://www.mrdestructo.com/2013/04/destructo-salon-does-matthew-yglesias.html).
Anyways talk about it the next podcast!

subset: commoncrawl


text:
This website uses cookies to offer the best possible experience. By continuing to use the site you are agreeing to our usage of cookies. Find out more
28 June 2017 09:53
NEW musical talents performed for more than 1,000 schoolchildren at a concert at Deeside Leisure Centre.
Pupils from every primary school in the county gathered to enjoy a musical morning as part of a Flintshire Council Music Service initiative.
The project is designed to inspire pupils to sing or pick up an instrument and organisers hailed the event as a "tremendous success".
Jean Stanley-Jones, head of Flintshire Music Service, said: "It is the first time we have done this and the pupils were extremely enthusiastic.
"It has been very enjoyable and everybody had a lot of fun.
"Well over 1,000 pupils from years five and six attended the Live Music Showcase Concert and it has been a tremendous success."
Flintshire Music Service staff and school musicians who perform in county orchestras and choirs took to the stage to perform before the pupils. They were also joined by guitar teachers and students as well as choristers as part of the event, before the audience was invited to participate in the final performance of the day with percussion instruments.
Mrs Stanley-Jones added: "We have had packed houses at the leisure centre and the venue has provided a really exciting atmosphere."
You must be a registered user to leave a comment. Register or login here.


text:
I carry mine as a last resort, or when nothing else is possible. Better than yelling "I'm calling 911" to fend off an attack.
This is a discussion on Not sure exactly why, but I bought an NAA Mini. within the Defensive Carry Guns forums, part of the Defensive Carry Discussions category; Honestly, I have no idea why I just had to have it but I did. I was actually looking at 1911's but could not decide ...
Honestly, I have no idea why I just had to have it but I did. I was actually looking at 1911's but could not decide which one I wanted. I had to drive better than 50 miles to the gun store, I guess I didn't want to waste a trip.
Cute little thing though. (If a guy can say that about a gun)
I bought some CCI snake loads and some JHP in the 22mag. I am not sure exactly how tough snakes are, but in my brief testing this afternoon, only one pellet of the snake load was able to penetrate a 20oz plastic cola bottle from a distance of 15'.. The JHP did substantially better.
As I have read in my searching, the workmanship is excellent and the price was great for an impulse purchase!
Not actual pic, but looks like this one. Has both Magnum and LR cyl.
Any new gun is cause for celebration though right? Even the smallest ones? I consider this more of a novelty, but I suppose can be a backup to a backup piece. Primary being G22, or S&W642 and the backup being a knife or a ball point pen, right??
I carry mine as a last resort, or when nothing else is possible. Better than yelling "I'm calling 911" to fend off an attack.
"In matters of style, swim with the current; in matters of principle, stand like a rock." Thomas Jefferson
Nemo Me Impune Lacesset
Haha - well - and why not! Celebration? Of course!
I actually got mine beacause I decided ''gotta have one'' but they are cute and well made and - well, mine lives very frequently in a pocket as a sorta ''mouse BUG'' - with of course the stoked 22 mag cylinder.
I have shot it quite a bit and at close range it most certainly would grab attention Reloads take some practice !
Chris - P95
NRA Certified Instructor & NRA Life Member.
"To own a gun and assume that you are armed
is like owning a piano and assuming that you are a musician!."
http://www.rkba-2a.com/ - a portal for 2A links, articles and some videos.
"Cute"? Sure, why not. Rocky's right. If you ever need it, it's a step up from a cellphone. I'd definitely carry it with the mags, though.
eschew obfuscation
The only thing that stops bad guys with guns is good guys with guns. SgtD
I have one that I have put quite a few boxes of .22 mag through. It is surprisingly loud, and accurate for what it is. My wife is a much better shot with it than I am though. My hands are just to big, and I cannot seem to pull the trigger without deflecting the muzzle a degree or two to one side.
These things are one of the reasons I want a NAA gaurdian in .380. The workmanship on everything NAA that I have laid my hands on is excellent.
They also make them in .17 HMR. I'm gonna get one of them, don't know which, though.
www.ubgholsters.com short wait times. Use 'defensivecarry' as a coupon code for a discount to your order.
I love the little N.A.A. Mini Revolvers.
Liberty Over Tyranny Μολὼν λαβέ
I've had one for years, just the 22 LR version. I got one of NAA's fancy western belt buckles for it... just because I could, I guess. In the few times when I felt comfortable wearing it (when we were going to gun-friendly friends' places), everybody thought it was really neat. I've seen people carry them on necklaces and one guy I met on the way to Sturgis had one in the top little pocket of his bib overalls.
Neat little toys.. but they are still real guns and sure beat throwing rocks. Mine is one of the few guns I have that I wouldn't sell.
Just too much fun and too interesting.
I know an operator that wears one hanging around his neck. He's used it once and you will NEVER find him without one again. I be ever grateful for them lil NAA's cause my drinking budy drinks with me, not under me.
"Respect all ... Fear none!!!
My brother-in-law is a deputy sheriff in Alabama and carries one like this in his front pocket everyday.
Two things are infinite: the universe and human stupidity; and I'm not sure about the universe. Albert Einstein
for a last ditch gun, do you think the .22 mag is better or would the .17 hmr be useful? I know it has no weight but the speed? Which is best? And if you were going to buy one (and many of you have) would the longer barrel be significantly better than the short barrel or is the difference too little to notice? I'd also like to have one in the line up for the lowest extreme end of things...
God Bless
Hmm. Didn't know they even made one in 17 HMR. Mine's 22 LR, just because that's what was sitting at the gun shop. I guess the 22 Mag has a bit larger frame.
The 17 HMR, while it's been looked at for use by Marshals on airplains (or so Hornady says), that is just not a lot of bullet. I really don't know what kind of penetration it would have on a large mammal.
Probably one of those things that could be debated forever. I'd rather drive a lead outside lubricated bullet than a smaller jacketed hollow point, but that's just me.
As small as the .17 bullets are I think I opt for .22mag, but I'm really curious about the .17HMR. Haven't heard much on the ballistics end but I keep hoping someone will do some informal testing like wet newsprint penetration along with expansion. Stephen Camp, where are you? LOL
Jack - strikes me that .17 is certainly impressive on small critters (viz - they explode!!) - but wonder whether the bullet's very low mass would, even when fragmenting, actually do enough damage in a large 'critter'. Doubt a bone contact would help any.
Add to this - that round out of a short barrel will of course lose a lot of it's velocity potential - as does .22 WMR.
Overall I reckon the .22 mag - which from NAA has a vel approximating that of .22LR from rifle (well over 1,000 fps) and a 40 grain bullet (or even 36) will have a definite edge.
Chris - P95
NRA Certified Instructor & NRA Life Member.
"To own a gun and assume that you are armed
is like owning a piano and assuming that you are a musician!."
http://www.rkba-2a.com/ - a portal for 2A links, articles and some videos.
Neat little guns. I carry a .22mag. NAA Mini in a pocket holster everyday as an always gun. I get a real kick out of that little thing. It always gets crazy reactions at the range. One young guy held it up and in a girley voice said "Does this gun make my butt look big?". Ha ha... Then I let him shoot it and the muzzle blast almost made him drop it. :) He looked at me and said "It`s a noisy cricket!" (from the movie MIB). Heh heh. Marcus


text:
Originally Posted by Alrik Fassbauer
I'll never be able to understand why someone could come up with a title like "Castlevania". It looks like a Chimera to me.
"Transsylvania" ? Yes
"Castle" ? Yes
Both combined ? Urgh
It sounds a bit to me as if I'd call a game "Nippondojo".
Originally Posted by JDR13
Looks like a typical console button-masher to me, but I figured some of you might be interested to know that the Steam version is official and the page is now up.


text:
Follow Harriet on Twitter
About Harriet
- The Poetry Foundation's blog for poetry and related news.
- More about Harriet
- Contributors
- Archive
Poetry News
From Homelessness to Reading Poems at the UN
Here's a cool story about Juan Fernandez Rua in Mercury News.
A sample:
Poetry had long played a role in the life of Juan Fernandez Rua. When he worked as a banker. As a drug counselor. And most especially when he was homeless, or "living out in the open," as he prefers to call it.
But it was the poetry that always kept him going. He studied it as a young man in New York City and has written about 500 poems, by his own estimation.
For Fernandez, or "J" as he is known by friends and acquaintances, life took an entirely new turn on Oct. 17 when he returned to New York from his current home in Oakland to read one of his recent poems, "A Real Poem," at the United Nations.
"I wasn't expecting it — it was a big surprise for me," said Fernandez, 61. "I had been writing for 40 years, and all of a sudden I was invited to read a poem that I had written a year earlier. I had read my poems at universities, cafes and even bars in my life, but never at the United Nations, so it was exciting."
Fernandez received his invitation to read "A Real Poem" at the U.N. from the Fourth World Movement, an international antipoverty organization, to coincide with the International Day for the Eradication of Poverty (which celebrated its 25th anniversary this year). Fernandez's poem came to the attention of the Fourth World Movement after it was published in Street Spirit, a Bay Area newspaper dedicated to the issues of poverty, homelessness and human rights.
Fernandez's days "living out in the open" influenced the writing of "A Real Poem."
"When you live on the street as I did for five to six years, you meet people who are sharing that experience with you," he said. "You meet some good people, you meet some kind people, people who were kind to me, people who were like brothers to me."
Juan Gonzalez, the poem's main character, who dies while sleeping outside on a bench, is fictional. Still, he is every bit one of Fernandez's "brothers."
"I also knew people who died on the street," Fernandez said. "Juan Gonzalez represents that person who died on the street."
Thanks to help received from Oakland's St. Mary's Center, Fernandez now lives in a federally subsided apartment.
"They helped me advocate for myself," Fernandez said of the staff at St. Mary's. "They helped me get medical care; they had information I didn't have before."
Full article here.
Tags: Juan Fernandez Rua
Posted in Poetry News on Monday, November 19th, 2012 by Harriet Staff.


text:
Riding in a limo can make you feel like a member of society's elite, like throwing away your toothbrush after a single use. Be king for a day with this Groupon.
Choose Between Two Options
- $499 for a five-hour rental of a limo, Rolls-Royce, or party bus (a $1,000 value)
- $749 for an eight-hour rental of a limo, Rolls-Royce, or party bus (a $1,632 value)
Though not included with this Groupon, Motortoys Limousine Service recommends a $24 per hour tip for chauffeurs.
Motortoys Limousine Service
Motortoys' fleet features fun extras such as colorful custom lighting, barware, and high-end audio systems. Capacities range from 4 people for a Rolls-Royce or a Lincoln Town Car to 25 for party buses with on-board restrooms. The drivers are employees, not independent contractors, and their service won The Knot's Best of Weddings award in 2011. Motortoys also partners with area businesses to offer its passengers discounts on meals, waived cover charges, and lifetime supplies of velvet rope.
320 W Benson St
Cincinnati, OH 45215Get Directions


text:
- Title:
- Make a Whimsical Fairy House Nov class - filled
- When:
- Thursday, November 8, 2012 - Thursday, November 15, 2012 6:00pm - 7:30pm
- Where:
Garden Treasures
545 Cross Street, Anoka, MN 55303
- Status:
- Filled - 20 seats
- Category:
- Classes
- Fees:
- $35 Members, $40 Nonmembers
Create your own unique whimsical fairy house to tuck into your garden. The house, complete with chimneys and doors, will be made from cement with stones and moss and other natural elements. Your finished project will be 8 to 12" tall, with a closed roof or an open top to put a plant in it. You will also make pathways and bridges to accessorize your fairy house.
All materials are supplied, but you may want to bring interesting old hardware like a skeleton key, old window latches or door knobs and other trinkets to embellish your house. Add finishing touches to your fairy house, paint it if you choose, and take it home on Thursday November 15.
Instructors: Sally Lehn and Charlie Johnson of "Garden Treasures." Together they have six years of experience teaching and creating all kinds of treasures for your garden.
- Venue:
Garden Treasures
545 Cross Street, Anoka, MN 55303
EventList powered by schlu.net


text:
« Local Home
Liberty Township, Ohio - Cat-Friendly Listings
Ohio: Liberty Township:
Liberty Township - as cat-friendly as they come! This city guide will show you all the best (and worst) places for your pets. Don't forget to add your reviews for the businesses in this ultimate resource.
|Some Top-Rated Businesses
We currently have no top-rated businesses for this city.
|Category List:
Pet-Friendly Businesses
Add a Listing
If you still can't find the listing you're looking for, feel free to add it now!


text:
Business Centre
The latest business news, reviews, features and whitepapers
The MOTOFONE is a breakthrough product in the mobile phone market, and is an excellent option for anyone looking for a handset to simply do the basics. At this price, it's a clear winner.
The Motorola MOTOFONE F3 is a budget phone that simply makes calls and sends SMS messages. There is no music playback, no camera and no Bluetooth. This back to basics handset has been designed with simplicity in mind, and is clearly ideal for users wanting a second phone, those who have never used a mobile phone before and elderly people, who are still coming to grips with using the latest technology.
The key feature of the MOTOFONE is ease of use. The menu system is simple, with a single button to access it, and an icon denoting each menu item. The MOTOFONE also includes what Motorola calls "voice prompt assistance". This is a voice which explains to the user what each feature of the phone does when you scroll through the menu. For example, when you hit the menu button and start scrolling through the icons, a voice is heard, saying "send a message", "read messages", "call history", "change ringtone", "set alarm" and "change time". The voice also plays when you enter each menu item as well, for example "write your message" or "enter time".
The MOTOFONE also includes another new feature, a display technology called EPD (Electronic Paper Display). This display possesses a paper-like high contrast appearance, consumes less power, and is both thin and light. The display doesn't include a backlight either, as this technology is enabled by electronic ink that carries a charge. Surprisingly, the MOTOFONE is clearly viewable in direct sunlight and also in the dark. Our only complaint with the display is the fact that it is only able to show two lines of text. Although the text is large and easy to read, typing messages does take a while to get used to, as only small words fit on the display. Furthermore, there is no predictive text input. Although this is understandable considering the simplicity of the MOTOFONE, heavy SMS users will not be pleased. Keep in mind though, that this is a phone designed for the simplest of needs.
The design of the MOTOFONE keeps in line with recent handsets from Motorola. Measuring just 114mm x 47mm x 9mm, and weighing just 70g, the MOTOFONE is one of the slimmest and lightest handsets on the market. Its keypad is completely flat, but the keys are fairly large and have a raised groove in between to distinguish them. The buttons are easy to press for both messaging and dialling phone numbers, so users shouldn't have too many problems in this regard.
The MOTOFONE consists of a fairly standard control layout. There is a four way navigational pad, dedicated menu and phonebook buttons and answer/end call keys. Above the screen are two indicator bars, for network signal strength and battery life respectively. Battery life is fairly good, rated at up to 450 minutes of talk time and up to 270 hours of standby time. Keep in mind that that the display doesn't use any power, so the MOTOFONE should last longer than a usual handset. On average, we charged the handset every three days.
The latest business news, reviews, features and whitepapers
Visit our shop for the best deals on hot products
Watch our video news and reviews from around the world
Comprehensive buying guides, features, and step-by-step articles
HP OfficeJet 250 Mobile Printer
The HP OfficeJet 250 Mobile Printer is a great device that fits perfectly into my fast paced and mobile lifestyle. My first impression of the printer itself was how incredibly compact and sleek the device was.
HP OfficeJet 250 Mobile Printer
Wireless printing from my iPhone was also a handy feature, the whole experience was quick and seamless with no setup requirements - accessed through the default iOS printing menu options.
HP OfficeJet Pro 8730
A smarter way to print for busy small business owners, combining speedy printing with scanning and copying, making it easier to produce high quality documents and images at a touch of a button.
HP OfficeJet Pro 8730
I've had a multifunction printer in the office going on 10 years now. It was a neat bit of kit back in the day -- print, copy, scan, fax -- when printing over WiFi felt a bit like magic. It's seen better days though and an upgrade's well overdue. This HP OfficeJet Pro 8730 looks like it ticks all the same boxes: print, copy, scan, and fax. (Really? Does anyone fax anything any more? I guess it's good to know the facility's there, just in case.) Printing over WiFi is more-or- less standard these days.
HP OfficeJet Pro 8730
As a freelance writer who is always on the go, I like my technology to be both efficient and effective so I can do my job well. The HP OfficeJet Pro 8730 Inkjet Printer ticks all the boxes in terms of form factor, performance and user interface.
Windows 10 for Business / Dell XPS 13
I'd happily recommend this touchscreen laptop and Windows 10 as a great way to get serious work done at a desk or on the road.


text:
Today's Hours: 10AM – 5PM
June 29-September 22, 2013
Drawing Inside the Perimeter includes more than 45 drawings from the High's permanent collection, as well as two wall drawings by HENSE and Rocio Rodriguez created exclusively for the exhibition.
Artists in the exhibition include: Sean Abrahams, Alejandro Aguilera, Tristan Al–Haddad, Radcliffe Bailey, Philip Carpenter, Don Cooper, Brian Dettmer, Craig Drennen, Sarah Emerson, Kojo Griffin, HENSE, Benjamin Jones, Jason Kofke, Ruth Laxson, Ann Marie Manker, Katherine Mitchell, Jiha Moon, Andy Moon Wilson, Yanique Norman, Joe Peragine, Fahamu Pecou, Seana Reilly, Susan Robert, Rocio Rodriguez, Ben Roosevelt, Brandon Sadler, Nathan Sharratt, Freddie Styles and Katherine Taylor, among others.
Drawing Inside the Perimeter focuses on drawing as a means of making sense of the world, rather than as a step on the way to producing artwork in another medium, such as with a preparatory sketch. The drawings in the exhibition act as a roadmap to the crisscrossing avenues of artistic production in Atlanta and reflect the chaotic, dynamic spirit of the city.
Most of the works in the exhibition were acquired since 2010 with support from the Lambert Fund, which was established by the late art patron and gallerist Judith Alexander. Native Atlantan, Judith Alexander, was one of the city's most influential art patrons and supporter of Atlanta and Georgia artists until her death in 2004. The Fund was named in recognition of her friend, the Atlanta-based curator and advocate for Georgia artists, Marianne Lambert. The collection and exhibition is the result of a three-year collaboration between Lambert and the High's Wieland Family Curator of Modern and Contemporary Art Michael Rooks.
Organization & Support
This exhibition is organized by the High Museum of Art.
Saturday, September 21, 2013
The High's first ever Monster Drawing Rally took place on Saturday, September 21, 2013. Visitors experienced creativity and community in action while meeting and watching their favorite local artists work.
The concept of the Monster Drawing Rally was originally developed by Southern Exposure in San Francisco.
This program was made possible by the Gudmund Vigtel Works on Paper Fund.
Image Credit: Ashley Anderson
Participating Artists:


text:
Bentley Turbo R for Sale
The ad you're looking for is no longer available, but here are a few others just like it.
Viewing 1 - 1 of 1 results
Selected Filters:Type of Ad: Vehicles for Sale Make: Bentley Model: Turbo R Remove All
1990 Bentley Turbo R
Clearwater/Largo, FL
1990 Bentley Turbo R, one owner Florida car, showing just over 44,000 miles. nice silver paint job & gray leather with black piping. refinished... More
Offered By: Bob's Classics
Advertiser since 1996
Advertiser since 1996


text:
Disney•Pixar Monsters Inc.: Monster Tag Credits (Windows)
Published by
Developed by
Also For
ESRB Rating
Critic Score
100 point score based on reviews from various critics.
User Score
5 point score based on user ratings.
Disney•Pixar Monsters Inc.: Monster Tag Credits
Other Games
In addition to this game, the following people are listed as working on other games. No more than 25 people are listed here, even if there are more than 25 people who have also worked on other games.
David Arnspiger, 86 other games
Mario Donis, 76 other games
Randy Coppinger, 65 other games
Douglas Carrigan, 65 other games
Rita Kedineoglu, 46 other games
Rick Dempsey, 40 other games
David Gordon, 37 other games
Ned Lott, 34 other games
Scott White, 34 other games
Beth Glenday, 26 other games
Rodney Gibbs, 26 other games
Patrick R. Burns, 26 other games
Leeann Alameda, 25 other games
Scott Torroll, 24 other games
Caesar Infante, 22 other games
Noel Gabriel, 21 other games
Jaime Serrano, 20 other games
Vicki Rondou, 20 other games
François Robillard, 18 other games
Gerald Wada, 18 other games
Emil Haghnazarian, 18 other games
Michele Spane, 17 other games
Brian Ulinger, 17 other games
Anne Barson, 15 other games
Brian Haynie, 14 other games
People who have worked on this game have also collaborated on the creation of the following games:
Disney•Pixar's Monsters Inc.: Pinball Panic Mini Game, a group of 90 people
Disney•Pixar's Monsters Inc.: Wreck Room Arcade - Bowling for Screams, a group of 90 people
Disney•Pixar's Monsters Inc.: Wreck Room Arcade: Eight Ball Chaos, a group of 90 people
Disney's Mickey Saves the Day: 3D Adventure, a group of 29 people
Disney•Pixar's Monsters, Inc.: Scare Island, a group of 24 people
Disney•Pixar Monsters, Inc.: Scream Team Training, a group of 18 people
TRON 2.0, a group of 16 people
Peter Pan in Disney's Return to Never Land, a group of 16 people
Disney's Brother Bear, a group of 15 people
Disney's Lilo & Stitch: Trouble in Paradise, a group of 15 people
Piglet's Big Game, a group of 13 people
Disney's Treasure Planet: Battle at Procyon, a group of 12 people
Disney Learning Adventure: Search for the Secret Keys, a group of 11 people
Disney's Extremely Goofy Skateboarding, a group of 11 people
Ultimate Ride, a group of 11 people
Disney's Treasure Planet, a group of 11 people
Trivial Pursuit: Millennium Edition, a group of 10 people
Spider-Man 2: The Game, a group of 10 people
Disney's Pooh's Party Game: In Search of the Treasure, a group of 9 people
Disney•Pixar Toy Story Racer, a group of 9 people
Disney's Atlantis: The Lost Empire, a group of 9 people
Disney's Cinderella's Dollhouse, a group of 9 people
Spyro: Shadow Legacy, a group of 9 people
Disney•Pixar Cars, a group of 8 people
Barbie Adventure: Riding Club, a group of 8 people
Credits for this game were contributed by phlux (4142)


text:
As soccer finals go -- and they haven't been going that well lately -- this was not at all bad. It's always satisfying to see the underdogs come through, especially when they manage to play the better soccer. And Real Salt Lake certainly did that.
So the better team won, without any doubt at all. For the first 45 minutes, Bruce Arena's patchwork of oldsters and youngsters, of superstars and nobodies, managed to maintain the illusion that they were capable of playing good soccer. But that's all it was -- an illusion. When Landon Donovan doesn't turn up -- and he was quite remarkably absent from this game -- then the Galaxy has not much to offer.
Maybe they just about deserved their halftime lead -- but it's questionable. Mike Magee's goal was a beauty, but it was tarnished by the action of the man who was supposed to shine and glitter and sparkle all over this game: David Beckham. His "tackle" that put Javier Morales (a key player for RSL) out of the game was a disgrace. Either it was a clumsy collision, or it was a piece of blatant thuggery. You have a right to believe that an international class player, one who has let it be known that he wants to lead England to World Cup glory next year, doesn't make "tackles" like that.
Clint Mathis came on for Real and he soon came close to suffering the same fate as Morales, when the massively unimpressive Chris Birchall performed a two-footed jump into his ankles. Real suffered another forced substitution when Will Johnson had to leave the game at halftime, making way for Ned Grabavoy. It all seemed to be working to the Galaxy's advantage, but that was not what happened.
From the beginning of the second half, Real was increasingly in charge of this game. It was Real that showed how to play good possession soccer, it was Real that gave us a fine exhibition of smooth, easy ball control and accurate passing. Their attacking players, Robbie Findley, Yura Movsisyan and Fabian Espindola repeatedly caused problems for the Galaxy defense. Yes, this famous Galaxy defense, the one that was getting all the praise for getting the Galaxy to the final. It looked utterly threadbare against the quick-moving Real forwards.
Obviously, Real should have had a penalty kick in the 60th minute when Birchall brought down Movsisyan without getting anywhere near the ball. But, ho hum, how used to this sort of blindness we have become, referee Kevin Stott saw no evil. Inexplicable. And a shame, for on the whole Stott had a very good game.
The Real dominance continued, and how pleasing to see who was at the center of so much of Real's play: Kyle Beckerman, absolutely indefatigable, always involved, always cool, passing the ball cleanly and accurately, defending and tackling well. A real captain's performance.
How well Real was playing. If soccer were not such an absurdly contrary sport, Real would have won this game without the necessity for the damn penalty kicks. But the Galaxy managed to hang on, a raggedy looking bunch, whose main attacking weapon eventually became the long kicks of substitute goalkeeper Josh Saunders. Yes, the Galaxy was that short of ideas. Nothing came from Beckham, his crosses were invariably off target, his one hopeful free kick hit the wall. Yet again, Beckham failed to make any impression as an on-field presence in MLS.
I do not like penalties as a way of deciding a game, but I'd have to be blind to deny that they have a built in drama of their own. For me, most of that drama on this occasion came with my fear that the better team, the one that had played the real soccer, might end up on the losing end of this absurd lottery.
Surely the Galaxy, this empty shell of a team, could not walk away with the trophy? Well, they just might have done. That awful moment when the clearly exhausted Andy Williams walked up to take the kick that would seal the thing for Real ... and saw his weak effort saved by Saunders carried the suspicion that this was not to be Real's night.
So it came down to defense after all -- Real's. Nick Rimando saved Edson Buddle's kick, while fullbacks Chris Wingert and Robbie Russell scored the vital goals.
I remain totally puzzled at what has happened to Bruce Arena's vision of the game that he can thrust a pedestrian team like this at us -- pedestrian even with Donovan and Beckham. But I have nothing but praise for Jason Kreis for playing the sport with admirable attacking brio. I made the mistake of listening to Kreis's post-game interview, full of all the worn out phrases like everyone playing for everyone else and so on. Better not to listen to that stuff.
Then came the one really false note of the evening, when the MVP trophy was presented to Nick Rimando. For making two saves in the shootout. May I point out that the Galaxy's Josh Saunders also made two shoot-out saves? Heaven knows who the geniuses are who decide these things. Maybe the press, for all I know.
But the problem of giving the award to Rimando is that it meant a huge injustice to someone else -- in this case Kyle Beckerman, who played superbly for 120 wearying minutes of fiercely competitive soccer.
Yes, Commissioner Don Garber, you can be pleased with this final -- a wonderful crowd, great atmosphere, a passably good game, a dramatic shootout, and a fairy-tale ending. And we all feel warm about fairy-tale endings, don't we?


text:
No, you need the inlet manifold off the 325. As StK said, you can DIY it but much easier to buy the pre-adapted kit.
No, you need the inlet manifold off the 325. As StK said, you can DIY it but much easier to buy the pre-adapted kit.
Hi Sam, i've just worked out where you got your car. If it's the one i'm thinking of you got it off a mate of mine (Nixon).
To mirror what people are saying, to get the most gains from your engine without going down the forced induction route you want;
1. 325 Inlet manifold and throttle body (there is a guy on here- Alpina527 - who does this as a kit) Mod's please let me know if your not happy with me putting up services offered by other forums.
2. DaveF induction kit (again DaveF supplies kits through ebay)
These with a map will give you around +20bhp (CA also do a kit but its not as cheap)
3. Free flowing exhaust - BlueFlame, supersprint, scorpion or Eisennman are good for this
4. U.S spec M3 cams
5. 3.0ltr M3 LSD
6. Lightweight pullies + Fan Delete
7. Re-map
Ill let you know when i'm next on the IOW, you'll have to pop out. There are a couple of us meet up on a regular basis over there. The guy that does all the work to my car (who owns a 328 himself) will be out so might be good for you to meet them.
Last edited by Ian S; 16-07-2009 at 12:40. Reason: Removed links to other forums
sambmwiow (16-07-2009)
hello mate and thank you for the info and when you down next then and who do ya know down here then
No probs mate. I know a good few people down there. I lived on the IOW for near 10 years. I used to spend alot of time in Ryde when i was in my teens. Ill let you know when i'm next down and we can meet up.
|« Previous Thread | Next Thread »
|Tags for this Thread


text:
- 100% Wool
- Backing: N/A
- Hand Knotted
- Custom Sizes Available
- Low Pile
- Color (Pantone TPX): Teal(18-5618), Lime(16-0435), Olive(18-0835), Dark Green(18-5418), Dark Blue(19-4324), Teal(18-4417), Dark Green(18-0525), Aqua(15-4707)
- Available in 6 colors
- Made in India
Brand: Surya
Each product of Surya offers a unique combination of color, pattern and texture. We have more than 3000 products to choose including carpets & rugs in every style from mid-century to contemporary. The rug are available in such types as shag, braided, flat weave, medium, flat, thin & plush pile, ultra plush and more! Made of natural high quality wool, jute, cotton, viscose with the finest Indian craftsmanship, all area rugs are sure to enhance your home interior and serve through generations.
See additional sizes and more options on our partners' sites
Write a reviewYour Name:
Your Review: Note: HTML is not translated!
Rating: Bad Good
Enter the code in the box below:
From contemporary and minimalist to bizarre, our modern rugs and carpets give your home a great softness, warmth and burst of color. With an extensive selection of different colors, styles and patterns, they blend in nicely with your home decor. The braided or shag rugs are made from wool, viscose and cowhide and have deep and rich colors which will create intensive and bold statement in your rooms.


text:
Plenum Needs Repiar
1 Attachment(s)
Hi. I just bought a house and need to make a few repairs. I'm in Texas, so the first order of business is to repair the faulty plenum in my attic before I spend a ton of money trying to cool the entire state.:no:
I've attached a picture. Is standard duct tape the best way to repair? Sure seems either a) low class or b) too easy
Looks like insulated panels made into a plenum. I used to install A.C years ago, and I was skinny and strong enough that I earned the loft title of "Attic Rat" so I have seen and done quite a bit in that realm.
This is how I would do it:
Get some sheet metal of sufficient quantity to make an end (where I see what looks like two flexible ducts attached) and get your tin snips out....
Make collars for the flex duct and cut out appropriate holes in the end you made and install.
Use self tapping sheet metal screws to attach the collars, and the duct, then tape up really well.
I wish I could sketch a picture of what it would look like when done....
Next, you will have a good size flange (at least 2") to surround and overlap the "box" end, and put screws long enough to penetrate the thickness of the insulated board.
Then tape, tape, tape ( Good name brand duct tape)
I am from Alaska originally, and what they say about us is true:
We buy duct tape by the case
IMO you need to get the weight off the side plenum where the flex duct comes off. Then sense the duct board is dirty you will need to clean it up so tape will stick. Get some 2 or 3" wide foil tape to make the repair. It looks as if the flex ducts have been hard cast ioto the duct board, you can get hard cast at about any sheet metal shop. Hope it helps........ j
Cub, I see what you see, I think.
dirt and/ or moisture has caused a lack of adhesion where it is taped, but I had overlooked the way the flex "Hangs" and pulls.
I still think I would use sheet metal, but I am getting old, or so they tell me... So I may be speaking of things that exist in my mind only..:jester:
Thanks. Those were pretty much my thoughts. Sounds like I'll be in a hot attic with a little acetone and some foil and duct tape.
Not really understand the additional 'hard cast' that I might need.
I can certainly look to see if those ducts are pulling on the plenum causing seperation. I have a feeling someone was just sloppy when they moved their crap of the crawl space and whacked my plenum. Oooooww...my plenum hurts.:(
here ya go get a tube of this http://www.hardcast.com/PRODUCTS/pdfs/DS321.pdf you should be ableto get it at any sheet metal shop it will work!
|All times are GMT -5. The time now is 02:41 PM.
vBulletin Security provided by vBSecurity v2.2.2 (Pro) - vBulletin Mods & Addons Copyright © 2017 DragonByte Technologies Ltd.
User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2017 DragonByte Technologies Ltd.


text:
Three weeks after he and other scientists were exonerated of manipulating data to exaggerate global warning, the man whose hacked e-mails were at the heart of "Climategate" breaks his silence in an interview with New Scientist.
Phil Jones, the head of the Climatic Research Unit at the University of East Anglia, in the United Kingdom, said the furor "was just a shock initially" and "took a while to get over."
Some excerpts:
"As climate scientists, we are critical amongst ourselves. You can see that in the e-mails. Discussions at conferences are no different from the discussions in the emails."
"I don't hold a world view - that's ridiculous. I have no interest in policy at all. I'm interested in the science, not the policy. I get these emails saying I'm trying to change the world government - it's just ridiculous. People assume that I'm advocating that society should be doing certain things. I'm not. We try to be totally apolitical in the CRU."
The imbroglio has prompted calls for scientists and institutions to be more transparent. The CRU is preparing to put its data and software online.
Not everyone believes that two independent reviews resolved the allegations of scientific misconduct.
The interview with Jones comes on the day the U.S. government released the annual State of the Climate report, compiled by more than 300 scientists from 48 countries. The report concludes that an analysis of 10 indicators that are "clearly and directly related to surface temperatures, all tell the same story: Global warming is undeniable."
(Posted by Michael Winter)
Doug is an unrepentant news junkie who loves breaking news and has been known to watch C-SPAN even on vacation. He has covered a wide range of domestic and international news stories, from prison riots in Oklahoma to the Moscow coup against Mikhail Gorbachev. Doug previously served as foreign editor at USA TODAY. More about Doug
Michael Winter has been a daily contributor to On Deadline since its debut in January 2006. His journalism career began in the prehistoric Ink Era, and he was an early adapter at the dawn of the Digital Age. His varied experience includes editing at the San Jose Mercury News and The Philadelphia Inquirer.
Also: Follow On Deadline on Twitter


text:
Why give away one of your key features? If you are RIM, it could give you a shot at producing some incremental revenue. After all, if BBM can keep non-business users attached to their BlackBerry handsets, it could end up becoming a nice revenue-producing business for RIM although there is still a chance that the software will be free to users, at least in the beginning. And even if the software is free, RIM could charge a recurring or one-time fee to BBM users on other platforms just to use the service.
RIM could also use BlackBerry Messenger as a way to promote its handsets. According to the sources, Android and iOS users might end up with a stripped down version of BBM that will allow text messages to be exchanged, but not video or pictures. Only BlackBerry users will get the full BBM experience which means that RIM will be counting on those who like the cross-platform version to consider buying a BlackBerry handset to get the complete version of BBM.
Later this year, Android users are expected to be the first to have access to the software thanks to the open build nature of the OS. A version for iOS will follow.
source: BGR


text:
Justin Bieber: Punched Out on "Family Guy"
Posted Monday November 26, 2012 7:42 PM GMT
While Justin Bieber suffers from girlfriend woes with Selena Gomez, he also got a virtual beat-down on Sunday's episode of "Family Guy" (November 25).
The 18-year-old singer was punched out by Peter Griffin in the show, after Peter thought the Biebs was about to make a move on his wife, Lois.
When the "Beauty and a Beat" singer made the mistake of telling the angry husband to "Relax, old man," Peter flew off the handle, pummeling the pop star to the ground.
The Canadian heartthrob has yet to respond to the depiction, but he may feel better knowing that Selena Gomez herself was beaten on an episode of "South Park" last year.
filed under Justin Bieber, Family Guy, Television


text:
I am proud to announce and share a new, exciting project and business endeavor for which I have a great passion and deep commitment. I've spent decades working in international development helping governments around the world leverage good practices in resource management. But, I must say, I am quite inspired and moved by what we have planned for Miami in March of 2017.
My work at FreeBalance has brought new perspective to the concepts of good governance and how transparency and accountability can help build nations. We have also seen the impact of strong, meaningful relationships by building value over time and creating "customers for life". These beliefs have helped ensure that corporate social responsibility is the foundation of our company and an important contributor to our success.
But how do we measure success? And, how do governments measure success? Let's consider Bhutan - a tiny country nestled in the Himalayas – to help shed light on a key human development indicator that is typically undervalued and underleveraged. In 1971, The Kingdom of Bhutan implemented and began tracking a set of guiding principles with an eye toward equitable society and national well-being. These guiding principles include preparing children to be good people, putting nature at the heart of public policy, promotion of good governance and cultural preservation. What Bhutan created is known as the Gross National Happiness (GNH) index. It expands a county's metrics of growth and development to encompass more than just Gross National Product (GNP) or Gross Domestic Product (GDP).
Next March we will be launching the first ever global movement that brings together stakeholders from the government, civic, corporate, academic, positive psychology, social & emotional intelligence and human development sectors. WOHASU and the World Happiness Summit is holding the inaugural gathering of the brightest thought leaders and innovators in each of these sectors. The event will have a three-pronged approach that includes a private, invitation only H-20 working roundtable with country leaders, a three-day experiential consumer conference and a co-created event with the United Nations for the International Day of Happiness.
I'm writing to personally invite you to attend this groundbreaking event.
WOHASU means to anchor the practice of happiness with this first global gathering to improve ourselves, our communities, our cities and our world. The World Happiness Report findings demonstrate that the new science of happiness and national variations in the well-being of individuals are directly intertwined. This is the fourth year that the World Happiness Report has been issued in advance of UN World Happiness Day on March 20th. Understanding these primary indicators can help improve policies to support better lives.
WOHASU encourages you to help make happiness and well-being a choice, and embrace the notion that "the state of my well-being affects the happiness of my tribe, my community, my city, my country and our world."