
Out of college I quickly had the realization that what everyone wanted was Flash engineers. I learned what I could, but needed to become employed pretty quickly. Luckily I had taught myself enough to take the entry level position at Imedia.It, a government contractor for military courseware.
From there things got interesting. I went from writing the worst nested conditional for a TicTacToe game to having a library of MVC based classes for building gamified learning platforms in Flash. Interactive video based instructional systems and interactive map exercises. I worked with a group of Engineers who constantly pushed the envelope, and I pushed right back. We grew together.
- How to get Top Secret Security Clearance. Note: Remember every neighbor you’ve ever had…
- How to make SCORM compliant learning software.
- How to use Python to automate the building of SCORM compliant software.
- The value of having others excited about learning.
- Grew my HTML/CSS/JavaScript/PHP/MySQL skills.
- How to write scripts to automate Photoshop image processing. Eat your heart out Google Maps…
- How to turn everyone’s machines into a render farm after they left at the end of the day. We had so much video to key.
- Deep Zooming High Resolution Maps
- Video Based instructional software.
- Cultural Awareness courseware.
- SCORM compliant learning packages.
- Building actual games. They may have been intended as distractions for the learners, but they were great fun to build.
Map Exercise
Range Game for Military Intellegence Course with Leeroy Jenkins Easter Eggs.
Scripting Video Keying
....
function _processVideo(name , template , video_aep , audioFileURL , outputFolder , renderTemplate , comp){
purgeCrest = purgeCrest ? purgeCrest : 1;
errors = new Array();
//----------Open Project
localPurgeCrest++;
if(currentTemplate != template || localPurgeCrest > purgeCrest || currentAEP != video_aep) {
localPurgeCrest = 0;
if(currentTemplate){
app.project.close(CloseOptions.DO_NOT_SAVE_CHANGES);
app.purge(PurgeTarget.ALL_CACHES);
}
app.open(new File(template));
currentTemplate = template;
currentAEP = null;
}
//----------Get and Duplicate Template
var template = getItemByName("template" , "Composition");
//----------Obtain Footage
if(currentAEP != video_aep) {
currentAEP = video_aep;
var importOptions = new ImportOptions();
importOptions.file = new File(video_aep);
importOptions.importAs = ImportAsType.PROJECT;
videoAEP = app.project.importFile(importOptions);
}
if(comp){
var newVideo = getItemByName(comp , "Composition");
}else{
var newVideo = getItemByName(name , "Composition");
}
....
Experimenting with Pathfinders
public function Pathfinder(start:Point , dest:Point , grid:Grid) {
_open = new Vector.<Point>();
_dest = dest;
_grid = grid;
_start = start;
_instantiated = true;
}
public function find():Path {
return path;
}
private function get path():Path {
/* make map */
_addToOpen(_start.x, _start.y);
while (_open.length && !_grid[_dest.x][_dest.y].open) {
_checkOpen();
}
/* make path */
var path:Path = new Path();
var startG:GridSquare = _grid[_start.x][_start.y];
var current:GridSquare = _grid[_dest.x][_dest.y];
while (current != startG) {
path.push(new Point(current.x , current.y));
current = current.parent;
}
path.push(_start);
return path;
}
static private function _addToOpen(_x:int , _y:int):void {
_grid[_x][_y].open = true;
_open[_open.length] = new Point(_x , _y);
}
static private function _addToClosed(_x:int , _y:int):void {
_grid[_x][_y].open = false;
_grid[_x][_y].closed = true;
}
static private function _checkOpen() {
var F:int = _bestF();
var fPoint:Point = _open.splice(F , 1)[0];
_addToClosed(fPoint.x , fPoint.y);
for each(var adj:Point in _getAdjacent(fPoint.x , fPoint.y)) {
/* closed or blocked */
if (_grid[adj.x][adj.y].closed) continue;
/* open or not open */
if (_grid[adj.x][adj.y].open) {
/* check new G cost vs old G cost */
var oldParent:GridSquare = _grid[adj.x][adj.y].parent;
var oldG:Number = _calcG(adj.x , adj.y);
_grid[adj.x][adj.y].parent = _grid[fPoint.x][fPoint.y];
var newG:Number = _calcG(adj.x , adj.y);
......