After more than two years since the release of Gold Miner tutorial, Luke Mikelonis wants to share with us the AS3 version he made to to practice up a bit on AS3.
There are four classes: Main
(the main one), Boulders
, Pod
, Rod
.
There isn’t that much theory to explain as the basics have been already discussed in the original post.
Anyway, this is Main
class:
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.events.Event;
public class Main extends MovieClip {
private var boulderData:Array;
private var boulders:Array = [];
private var pod:Pod;
private var left:Boolean = false;
private var right:Boolean = false;
public function Main() {
boulderData = [[100, 100, 30], [200, 100, 40], [300, 100, 40], [400, 100, 30],
[100, 200, 30], [200, 200, 40], [300, 200, 40], [400, 200, 30],
[100, 300, 30], [200, 300, 40], [300, 300, 40], [400, 300, 30]];
placeBoulders();
placePod();
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseClick);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
addEventListener(Event.ENTER_FRAME, updateStatus);
}
private function placeBoulders():void {
for (var i in boulderData) {
var boulder:Array = boulderData[i];
var newBoulder:Boulder = new Boulder(boulder[0], boulder[1], boulder[2]);
addChild(newBoulder);
boulders.push(newBoulder);
}
}
private function placePod():void {
pod = new Pod();
addChild(pod);
pod.createRod();
}
public function getPod():Pod {
return pod;
}
private function onMouseClick(e:MouseEvent):void {
pod.shootPod();
}
private function updateStatus(e:Event):void {
if (!left && !right) {
pod.setSpeed(0);
} else if (left && right) {
pod.setSpeed(0);
} else if (left) {
pod.setSpeed(-4);
} else {
pod.setSpeed(4);
}
for (var i in boulders) {
boulders[i].updateStatus();
if (boulders[i].remove) {
removeBoulder(boulders[i]);
boulders.splice(i, 1);
}
}
}
private function removeBoulder(boulder:Boulder) {
removeChild(boulder);
boulder = null;
}
private function onKeyPress(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37:
left = true;
break;
case 39:
right = true;
break;
}
}
private function onKeyRelease(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37:
left = false;
break;
case 39:
right = false;
break;
}
}
}
}
This is Boulder
class:
package {
import flash.display.MovieClip;
public class Boulder extends MovieClip {
private var picked:Boolean = false;
private var gotBoulder:Boolean = false;
public function Boulder(xPos:Number, yPos:Number, boulderWidth:Number) {
x = xPos;
y = yPos;
width = height = boulderWidth;
}
public function updateStatus():void {
var main:Main = this.parent as Main
var pod:Pod = main.getPod();
if (!picked) {
if (pod.status == "shoot" && this.hitTestPoint(pod.hotSpotX, pod.hotSpotY)) {
pod.status = "rewind";
picked = true;
pod.slowdown = Math.floor(width / 5);
}
} else {
x = pod.hotSpotX;
y = pod.hotSpotY;
if (pod.status == "rotate") {
gotBoulder = true;
}
}
}
public function get remove():Boolean {
return gotBoulder;
}
}
}
This is Pod
class:
package {
import flash.display.MovieClip;
import flash.events.Event;
public class Pod extends MovieClip {
private var rotationDir:Number = 2;
private var podStatus:String = "rotate";
private var slowDown:Number = 0;
private var speed:Number = 0;
private var maxSpeed:Number = 4;
private var currentDir:Number = 0;
private var startRopeX:Number;
public var hotSpotX:Number;
public var hotSpotY:Number;
private var rod:Rod;
public function Pod() {
x = 250;
y = 0;
addEventListener(Event.ENTER_FRAME, updateStatus);
}
public function createRod():void {
rod = new Rod();
this.parent.addChild(rod);
}
private function move():void {
x += speed;
}
public function setSpeed(newSpeed:Number):void {
speed = newSpeed;
if (speed > maxSpeed) {
speed = maxSpeed;
} else if (speed < -maxSpeed) {
speed = -maxSpeed;
}
}
public function shootPod():void {
if (podStatus == "rotate") {
currentDir = (rotation + 90) * 0.0174532925;
startRopeX = x;
podStatus = "shoot";
}
}
private function updateStatus(e:Event):void {
switch (podStatus) {
case "rotate":
rotation += rotationDir;
if (rotation >= 80 || rotation <= -80) {
rotationDir *= -1;
}
move();
break;
case "shoot":
slowDown = 0;
x += 10 * Math.cos(currentDir);
y += 10 * Math.sin(currentDir);
hotSpotX = x + 40 * Math.cos(currentDir);
hotSpotY = y + 40 * Math.sin(currentDir);
if (hotSpotY > 400 || hotSpotX < 0 || hotSpotX > 500) {
podStatus = "rewind";
}
rod.clear();
rod.lineStyle(1, 0x000000);
rod.moveTo(startRopeX, 0);
rod.lineTo(x, y);
break;
case "rewind":
rod.clear();
hotSpotX = x + 40 * Math.cos(currentDir);
hotSpotY = y + 40 * Math.sin(currentDir);
x -= (10 - slowDown) * Math.cos(currentDir);
y -= (10 - slowDown) * Math.sin(currentDir);
if (y < 0) {
y = 0;
x = startRopeX;
podStatus = "rotate";
} else {
rod.lineStyle(1, 0x000000);
rod.moveTo(startRopeX, 0);
rod.lineTo(x, y);
}
break;
}
}
public function get status():String {
return podStatus;
}
public function set status(status:String):void {
podStatus = status;
}
public function set slowdown(slowdown:Number):void {
slowDown = slowdown;
}
}
}
And finally Rod class:
package {
import flash.display.Sprite;
import flash.display.Graphics;
public class Rod extends Sprite {
public function clear():void {
graphics.clear();
}
public function lineStyle(thick:Number, color:uint):void {
graphics.lineStyle(thick, color);
}
public function moveTo(xPos:Number, yPos:Number):void {
graphics.moveTo(xPos, yPos);
}
public function lineTo(xPos:Number, yPos:Number):void {
graphics.lineTo(xPos, yPos);
}
}
}
This is the result:
Use arrow keys to move the Pod, and mouse button to fire.
Download the source code. Hope this helps you to convert AS2 scripts to AS3.