Skip to content

Instantly share code, notes, and snippets.

@premasagar
Forked from jimpurbrick/ufo.js
Created September 12, 2011 09:49

Revisions

  1. premasagar revised this gist Sep 12, 2011. No changes.
  2. premasagar revised this gist Sep 12, 2011. 1 changed file with 17 additions and 15 deletions.
    32 changes: 17 additions & 15 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -76,7 +76,7 @@ jj.createCreature("ufo", function (creature) {

    function easeTowardTarget() {
    var creaturePos = creature.position(),
    targetPos = target.position(),
    targetPos = $.extend({}, target.position()),
    creatureSize = creature.size(),
    targetSize = target.size(),
    sqrDistance;
    @@ -139,41 +139,43 @@ jj.createCreature("ufo", function (creature) {

    case CHASE:
    if(easeTowardTarget()) {
    creaturePos = $.extend({}, creature.position());

    captured[target.name()] = {
    func: target.position,
    position: target.position()
    func: target.position, // creature's original position method
    position: $.extend({}, target.position())
    };

    target.position = function() {
    return $.extend(this.el.offset(), {
    zIndex: this.el.css('z-index') || 0
    });
    target.position = function(newPos) {
    return newPos ? this : captured[target.name()].func.call(this);
    };

    $(beam).css("visibility", "visible");

    creature.chat("Capturing " + target.name());
    state = CAPTURE;
    }
    break;

    case CAPTURE:
    var newTargetTop = target.position() - 3;
    var newTargetTop = target.position().top - 3;

    creature.position({top: creature.position().top - 3});
    target.position({top: newTargetTop});
    captured[target.name()].func.call(target, {top: newTargetTop});

    if (newTargetTop + target.size().height < 0) {
    creature.chat("Returning " + target.name());
    state = RETURN;
    }
    break;

    case RETURN:
    var newTargetTop = target.position() + 3;


    var newTargetTop = target.position().top + 3;
    creature.position({top: creature.position().top + 3});
    target.position({top: newTargetTop});
    captured[target.name()].func.call(target, {top: newTargetTop});

    if (newTargetTop >= captured[target.name()].position().top) {
    target.position = captured[target.name()].func;
    if (newTargetTop >= captured[target.name()].position.top) {
    target.position = captured[target.name()].func; // return creature's original position method
    target = randomTarget();
    $(beam).css("visibility", "hidden");
    state = SEARCH;
  3. premasagar revised this gist Sep 12, 2011. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -185,6 +185,4 @@ jj.createCreature("ufo", function (creature) {
    /////

    reset();

    jj.fps = 1;
    });
  4. premasagar revised this gist Sep 12, 2011. 1 changed file with 4 additions and 5 deletions.
    9 changes: 4 additions & 5 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -26,7 +26,6 @@ jj.createCreature("ufo", function (creature) {
    left: jj.center().left - 64
    });


    /////

    // DOM
    @@ -47,9 +46,7 @@ jj.createCreature("ufo", function (creature) {
    .attr("src", "http://jimpurbrick.com/media/ufo.png")
    .appendTo($(creature.el));


    /////


    function randomTarget() {
    var x = Math.random() * worldSize.width,
    @@ -118,10 +115,8 @@ jj.createCreature("ufo", function (creature) {
    return sqrDistance < (20 * 20);
    };


    /////


    // EVENT BINDINGS
    creature.bind("see", function(other) {
    if (state === SEARCH && ! captured[other.name()]) {
    @@ -186,6 +181,10 @@ jj.createCreature("ufo", function (creature) {
    break;
    }
    });

    /////

    reset();

    jj.fps = 1;
    });
  5. premasagar revised this gist Sep 12, 2011. 1 changed file with 0 additions and 3 deletions.
    3 changes: 0 additions & 3 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -101,13 +101,10 @@ jj.createCreature("ufo", function (creature) {
    };

    // Update creature position.
    console.log(1, JSON.stringify(creature.position()));
    //debugger;
    creature.position({
    left: creaturePos.left + update.x,
    top: creaturePos.top + update.y
    });
    console.log(2, JSON.stringify(creature.position()));

    // Increase fraction of delta used next update.
    positionFactor = Math.min(positionFactor + 0.005, 1.0);
  6. premasagar revised this gist Sep 12, 2011. 1 changed file with 174 additions and 141 deletions.
    315 changes: 174 additions & 141 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -1,50 +1,60 @@
    jj.createCreature('ufo', function (creature) {
    var captured = {},
    positionFactor = 0.005,
    $ = jj.jQuery,
    SEARCH = 1,
    CHASE = 2,
    CAPTURE = 3,
    RETURN = 4,
    state = SEARCH,
    target = undefined;

    creature.data({
    sight: 200
    });

    creature.size({width: 128, height: 250});
    creature.position({top: 128, left: jj.center().left - 64});

    var beam = $(document.createElementNS("http://www.w3.org/2000/svg", "path"))
    .attr("d", "M64 50 L0 250 L128 250 Z")
    .attr("fill", "lime")
    .attr("opacity", "0.5")
    .css("visibility", "hidden");

    $(document.createElementNS("http://www.w3.org/2000/svg", "svg"))
    .css("position", "absolute")
    .css("left", "0")
    .css("top", "0")
    .append(beam)
    .appendTo($(creature.el));

    $(document.createElement("img"))
    .attr("src", "http://jimpurbrick.com/media/ufo.png")
    .appendTo($(creature.el));

    creature.bind('see', function(other) {
    if (state === SEARCH && ! captured[other.name()]) {
    state = CHASE;
    target = other;
    }
    });

    function randomTarget() {

    positionFactor = 0.005;
    var x = Math.random() * jj.size().width;
    var y = Math.random() * jj.size().height;
    jj.createCreature("ufo", function (creature) {
    "use strict";

    var captured = {},
    positionFactor = 0.005,
    $ = jj.jQuery,
    SEARCH = 1,
    CHASE = 2,
    CAPTURE = 3,
    RETURN = 4,
    state = SEARCH,
    worldSize = jj.size(),
    beam,
    target;

    creature
    .data({
    sight: 200
    })
    .size({
    width: 128,
    height: 250
    })
    .position({
    top: 128,
    left: jj.center().left - 64
    });


    /////

    // DOM
    beam = $(document.createElementNS("http://www.w3.org/2000/svg", "path"))
    .attr("d", "M64 50 L0 250 L128 250 Z")
    .attr("fill", "lime")
    .attr("opacity", "0.5")
    .css("visibility", "hidden");

    $(document.createElementNS("http://www.w3.org/2000/svg", "svg"))
    .css("position", "absolute")
    .css("left", "0")
    .css("top", "0")
    .append(beam)
    .appendTo($(creature.el));

    $(document.createElement("img"))
    .attr("src", "http://jimpurbrick.com/media/ufo.png")
    .appendTo($(creature.el));


    /////


    function randomTarget() {
    var x = Math.random() * worldSize.width,
    y = Math.random() * worldSize.height;

    return {
    position: function() {
    return {
    @@ -59,103 +69,126 @@ jj.createCreature('ufo', function (creature) {
    };
    }
    };
    };

    function reset() {
    target = randomTarget();
    captured = {};
    state = SEARCH;
    }

    reset();

    function easeTowardTarget() {

    var creaturePos = creature.position();
    var targetPos = target.position();
    var creatureSize = creature.size();
    var targetSize = target.size();

    // Aim to get middle of target in to middle of tractor beam.
    targetPos.left += (targetSize.width / 2) - (creatureSize.width / 2);
    targetPos.top -= 200;

    // Calculate delta between target and creature.
    var delta = {
    };

    function reset() {
    target = randomTarget();
    captured = {};
    state = SEARCH;
    }

    function easeTowardTarget() {
    var creaturePos = creature.position(),
    targetPos = target.position(),
    creatureSize = creature.size(),
    targetSize = target.size(),
    sqrDistance;

    // Aim to get middle of target in to middle of tractor beam.
    targetPos.left += (targetSize.width / 2) - (creatureSize.width / 2);
    targetPos.top -= 200;

    // Calculate delta between target and creature.
    var delta = {
    x: targetPos.left - creaturePos.left,
    y: targetPos.top - creaturePos.top
    };
    };

    // Calculate update for this frame.
    var update = {
    // Calculate update for this frame.
    var update = {
    x: delta.x * positionFactor,
    y: delta.y * positionFactor
    };

    // Update creature position.
    creature.position({left: (creaturePos.left + update.x),
    top: (creaturePos.top + update.y)});

    // Increase fraction of delta used next update.
    positionFactor = Math.min(positionFactor + 0.005, 1.0);

    // Recalculate remaining delta based on this update.
    delta.x -= update.x;
    delta.y -= update.y;

    // Work out if creature is "close enough" to target.
    var sqrDistance = (delta.x * delta.x) + (delta.y * delta.y);
    return sqrDistance < (20 * 20);
    };

    jj.bind('tick', function(frame) {

    switch(state) {
    case SEARCH:
    if(easeTowardTarget()) {
    target = randomTarget();
    }
    break;
    case CHASE:
    if(easeTowardTarget()) {
    captured[target.name()] = {
    func: target.position,
    position: target.position()
    };

    target.position = function() {
    return $.extend(this.el.offset(), {
    zIndex: this.el.css('z-index') || 0
    });
    };
    $(beam).css("visibility", "visible");
    state = CAPTURE;
    }
    break;
    case CAPTURE:
    creature.position({top: '-=3px', left: '+=0px'});
    target.el.css({top: '-=3px', left: '+=0px'});
    if (target.position().top + target.size().height < 0) {
    state = RETURN;
    }
    break;
    case RETURN:
    creature.position({top: '+=3px', left: '+=0px'});
    target.el.css({top: '+=3px', left: '+=0px'});
    if (target.position().top >= captured[target.name()].position.top) {
    target.position = captured[target.name()].func;
    target = randomTarget();
    $(beam).css("visibility", "hidden");
    state = SEARCH;
    }
    break;
    }
    });

    jj.bind('midnight', function() {

    reset();

    });

    };

    // Update creature position.
    console.log(1, JSON.stringify(creature.position()));
    //debugger;
    creature.position({
    left: creaturePos.left + update.x,
    top: creaturePos.top + update.y
    });
    console.log(2, JSON.stringify(creature.position()));

    // Increase fraction of delta used next update.
    positionFactor = Math.min(positionFactor + 0.005, 1.0);

    // Recalculate remaining delta based on this update.
    delta.x -= update.x;
    delta.y -= update.y;

    // Work out if creature is "close enough" to target.
    sqrDistance = (delta.x * delta.x) + (delta.y * delta.y);
    return sqrDistance < (20 * 20);
    };


    /////


    // EVENT BINDINGS
    creature.bind("see", function(other) {
    if (state === SEARCH && ! captured[other.name()]) {
    state = CHASE;
    target = other;
    }
    });

    jj.bind("midnight", reset);

    jj.bind("tick", function(frame) {
    var creaturePos;

    switch(state) {
    case SEARCH:
    if(easeTowardTarget()) {
    target = randomTarget();
    }
    break;

    case CHASE:
    if(easeTowardTarget()) {
    captured[target.name()] = {
    func: target.position,
    position: target.position()
    };

    target.position = function() {
    return $.extend(this.el.offset(), {
    zIndex: this.el.css('z-index') || 0
    });
    };
    $(beam).css("visibility", "visible");
    state = CAPTURE;
    }
    break;

    case CAPTURE:
    var newTargetTop = target.position() - 3;

    creature.position({top: creature.position().top - 3});
    target.position({top: newTargetTop});

    if (newTargetTop + target.size().height < 0) {
    state = RETURN;
    }
    break;

    case RETURN:
    var newTargetTop = target.position() + 3;


    creature.position({top: creature.position().top + 3});
    target.position({top: newTargetTop});

    if (newTargetTop >= captured[target.name()].position().top) {
    target.position = captured[target.name()].func;
    target = randomTarget();
    $(beam).css("visibility", "hidden");
    state = SEARCH;
    }
    break;
    }
    });

    reset();
    });
  7. @jimpurbrick jimpurbrick revised this gist Sep 11, 2011. 1 changed file with 30 additions and 7 deletions.
    37 changes: 30 additions & 7 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -71,16 +71,39 @@ jj.createCreature('ufo', function (creature) {

    function easeTowardTarget() {

    var left = creature.position().left;
    var top = creature.position().top;
    var creaturePos = creature.position();
    var targetPos = target.position();
    var creatureSize = creature.size();
    var targetSize = target.size();

    // Aim to get middle of target in to middle of tractor beam.
    targetPos.left += (targetSize.width / 2) - (creatureSize.width / 2);
    targetPos.top -= 200;

    // Calculate delta between target and creature.
    var delta = {
    x: target.position().left + (target.size().width / 2) - creature.position().left - (creature.size().width / 2),
    y: target.position().top - creature.position().top - 200
    x: targetPos.left - creaturePos.left,
    y: targetPos.top - creaturePos.top
    };

    // Calculate update for this frame.
    var update = {
    x: delta.x * positionFactor,
    y: delta.y * positionFactor
    };
    creature.position({left: left + (delta.x * positionFactor),
    top: top + (delta.y * positionFactor)});
    positionFactor += 0.005;

    // Update creature position.
    creature.position({left: (creaturePos.left + update.x),
    top: (creaturePos.top + update.y)});

    // Increase fraction of delta used next update.
    positionFactor = Math.min(positionFactor + 0.005, 1.0);

    // Recalculate remaining delta based on this update.
    delta.x -= update.x;
    delta.y -= update.y;

    // Work out if creature is "close enough" to target.
    var sqrDistance = (delta.x * delta.x) + (delta.y * delta.y);
    return sqrDistance < (20 * 20);
    };
  8. @jimpurbrick jimpurbrick revised this gist Sep 9, 2011. 1 changed file with 20 additions and 13 deletions.
    33 changes: 20 additions & 13 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -6,11 +6,11 @@ jj.createCreature('ufo', function (creature) {
    CHASE = 2,
    CAPTURE = 3,
    RETURN = 4,
    state = SEARCH;
    state = SEARCH,
    target = undefined;

    creature.data({
    sight: 200,
    target: undefined
    sight: 200
    });

    creature.size({width: 128, height: 250});
    @@ -34,10 +34,9 @@ jj.createCreature('ufo', function (creature) {
    .appendTo($(creature.el));

    creature.bind('see', function(other) {
    var target = creature.data().target;
    if (state === SEARCH && ! captured[other.name()]) {
    state = CHASE;
    creature.data().target = other;
    target = other;
    }
    });

    @@ -62,13 +61,18 @@ jj.createCreature('ufo', function (creature) {
    };
    };

    creature.data().target = randomTarget();
    function reset() {
    target = randomTarget();
    captured = {};
    state = SEARCH;
    }

    reset();

    function easeTowardTarget() {

    var left = creature.position().left;
    var top = creature.position().top;
    var target = creature.data().target;
    var delta = {
    x: target.position().left + (target.size().width / 2) - creature.position().left - (creature.size().width / 2),
    y: target.position().top - creature.position().top - 200
    @@ -82,15 +86,11 @@ jj.createCreature('ufo', function (creature) {
    };

    jj.bind('tick', function(frame) {

    var target = creature.data().target;
    var left = creature.position().left;
    var top = creature.position().top;

    switch(state) {
    case SEARCH:
    if(easeTowardTarget()) {
    creature.data().target = randomTarget();
    target = randomTarget();
    }
    break;
    case CHASE:
    @@ -121,11 +121,18 @@ jj.createCreature('ufo', function (creature) {
    target.el.css({top: '+=3px', left: '+=0px'});
    if (target.position().top >= captured[target.name()].position.top) {
    target.position = captured[target.name()].func;
    creature.data().target = randomTarget();
    target = randomTarget();
    $(beam).css("visibility", "hidden");
    state = SEARCH;
    }
    break;
    }
    });

    jj.bind('midnight', function() {

    reset();

    });

    });
  9. @jimpurbrick jimpurbrick created this gist Sep 9, 2011.
    131 changes: 131 additions & 0 deletions ufo.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,131 @@
    jj.createCreature('ufo', function (creature) {
    var captured = {},
    positionFactor = 0.005,
    $ = jj.jQuery,
    SEARCH = 1,
    CHASE = 2,
    CAPTURE = 3,
    RETURN = 4,
    state = SEARCH;

    creature.data({
    sight: 200,
    target: undefined
    });

    creature.size({width: 128, height: 250});
    creature.position({top: 128, left: jj.center().left - 64});

    var beam = $(document.createElementNS("http://www.w3.org/2000/svg", "path"))
    .attr("d", "M64 50 L0 250 L128 250 Z")
    .attr("fill", "lime")
    .attr("opacity", "0.5")
    .css("visibility", "hidden");

    $(document.createElementNS("http://www.w3.org/2000/svg", "svg"))
    .css("position", "absolute")
    .css("left", "0")
    .css("top", "0")
    .append(beam)
    .appendTo($(creature.el));

    $(document.createElement("img"))
    .attr("src", "http://jimpurbrick.com/media/ufo.png")
    .appendTo($(creature.el));

    creature.bind('see', function(other) {
    var target = creature.data().target;
    if (state === SEARCH && ! captured[other.name()]) {
    state = CHASE;
    creature.data().target = other;
    }
    });

    function randomTarget() {

    positionFactor = 0.005;
    var x = Math.random() * jj.size().width;
    var y = Math.random() * jj.size().height;
    return {
    position: function() {
    return {
    top: y,
    left: x
    };
    },
    size: function() {
    return {
    width: 0,
    height: 0
    };
    }
    };
    };

    creature.data().target = randomTarget();

    function easeTowardTarget() {

    var left = creature.position().left;
    var top = creature.position().top;
    var target = creature.data().target;
    var delta = {
    x: target.position().left + (target.size().width / 2) - creature.position().left - (creature.size().width / 2),
    y: target.position().top - creature.position().top - 200
    };
    creature.position({left: left + (delta.x * positionFactor),
    top: top + (delta.y * positionFactor)});
    positionFactor += 0.005;

    var sqrDistance = (delta.x * delta.x) + (delta.y * delta.y);
    return sqrDistance < (20 * 20);
    };

    jj.bind('tick', function(frame) {

    var target = creature.data().target;
    var left = creature.position().left;
    var top = creature.position().top;

    switch(state) {
    case SEARCH:
    if(easeTowardTarget()) {
    creature.data().target = randomTarget();
    }
    break;
    case CHASE:
    if(easeTowardTarget()) {
    captured[target.name()] = {
    func: target.position,
    position: target.position()
    };

    target.position = function() {
    return $.extend(this.el.offset(), {
    zIndex: this.el.css('z-index') || 0
    });
    };
    $(beam).css("visibility", "visible");
    state = CAPTURE;
    }
    break;
    case CAPTURE:
    creature.position({top: '-=3px', left: '+=0px'});
    target.el.css({top: '-=3px', left: '+=0px'});
    if (target.position().top + target.size().height < 0) {
    state = RETURN;
    }
    break;
    case RETURN:
    creature.position({top: '+=3px', left: '+=0px'});
    target.el.css({top: '+=3px', left: '+=0px'});
    if (target.position().top >= captured[target.name()].position.top) {
    target.position = captured[target.name()].func;
    creature.data().target = randomTarget();
    $(beam).css("visibility", "hidden");
    state = SEARCH;
    }
    break;
    }
    });
    });