KlikPunk/src/Token.as

137 lines
3 KiB
ActionScript
Raw Normal View History

2011-01-29 01:39:36 +00:00
package
{
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Rectangle;
import net.flashpunk.Entity;
import net.flashpunk.graphics.Image;
import net.flashpunk.utils.Draw;
import net.flashpunk.utils.Input;
import net.flashpunk.utils.Key;
/**
* ...
* @author jjp
*/
public class Token extends Entity
{
private var drag: Drag;
public var posReal: Point;
private var relf: String;
private var xml: XML;
public function Token(source:BitmapData, relf: String, x: int, y: int, xml:XML = null)
{
this.posReal = new Point(x, y);
super(x, y, new Image(source));
this.type = "Token";
this.layer = WorldStage.LAYER_TOKENS;
this.drag = null;
this.relf = relf;
if (xml === null)
this.xml = XML("<token/>");
else
this.xml = xml;
}
public function FSelected(): Boolean
{
return WorldStage(this.world).tokSelected === this;
}
override public function removed():void
{
super.removed();
if (drag !== null)
{
drag.Done();
drag = null;
}
}
override public function added():void
{
super.added();
FixupZoom();
}
private function FixupZoom(): Number
{
var worldStage: WorldStage = WorldStage(world);
var zoom: Number = worldStage.zoom;
var img: Image = Image(this.graphic);
Image(this.graphic).scale = zoom;
var posScreen : Point = worldStage.PointScreenFromReal(posReal);
x = int(posScreen.x);
y = int(posScreen.y);
this.setHitbox(img.scaledWidth, img.scaledHeight, -img.x, -img.y);
return zoom;
}
override public function update():void
{
super.update();
var zoom: Number = FixupZoom();
if (Input.mouseUp && drag !== null)
{
trace("drag done");
drag.Done();
drag = null;
}
if (FSelected())
{
var deltaMove: Point = null;
if (Input.pressed(Key.UP))
deltaMove = new Point(0, -1);
else if (Input.pressed(Key.DOWN))
deltaMove = new Point(0, 1);
else if (Input.pressed(Key.LEFT))
deltaMove = new Point(-1, 0);
else if (Input.pressed(Key.RIGHT))
deltaMove = new Point(1, 0);
if (Input.pressed(Key.PAGE_UP))
world.bringForward(this);
else if (Input.pressed(Key.PAGE_DOWN))
world.sendBackward(this);
if (Input.mouseDown)
{
if (drag === null && collidePoint(x, y, Input.mouseX, Input.mouseY))
{
drag = Drag.Claim();
if (drag !== null)
trace("drag claimed for " + relf);
else
trace("drag failed for " + relf);
}
if (drag !== null)
{
deltaMove = drag.Delta(zoom);
drag.Update();
}
}
if (deltaMove !== null)
posReal = posReal.add(deltaMove);
if (Input.pressed(Key.DELETE))
WorldStage(world).KillToken(this);
}
}
override public function render():void
{
super.render();
if (FSelected())
Draw.hitbox(this);
}
public function GenXML(): XML
{
var xml: XML = this.xml.copy();
xml.@x = int(posReal.x);
xml.@y = int(posReal.y);
xml.@path = relf;
return xml;
}
}
}