Inherit MovieClip From Another Class - actionscript-3

Hey I seem to be having some problems inheriting Movie-clip from a class, I'm fairly new to as3, I've had a look around and can't tell if I'm doing something fundamentally wrong or not.
Let me show you
So I have a class I want to use to move EVERYTHING but the player sprite. So I want everything but the player to extend it. (or so I'm assuming.)
So I declare my class
package code {
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import code.Main;
public class everythingContainer extends MovieClip {
function brackets and so on...
(I'm just importing everything in an attempt to avoid errors)
I then have a class I want to inherit everythingContainer and Movieclip
package code {
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import code.Main;
import code.everythingContainer;
public class Tree1 extends everythingContainer {
Yet when I run this I get the error:
Line 1 5000: The class 'code.Tree1' must subclass 'flash.display.MovieClip' since it is linked to a library symbol of that type.
Why am I getting this error?
Any help would be greatly appreciated!
I haven't got the full code to run yet so there may still be other obvious bugs laying about.
everythingContainer
Full code:
package code {
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import code.Main;
public class everythingContainer extends MovieClip {
var speed: Number = 4;
var wpressed: Boolean = false;
var apressed: Boolean = false;
var spressed: Boolean = false;
var dpressed: Boolean = false;
var xprev:int = 0;
var yprev:int = 0;
public function everythingContainer() {
// constructor code
trace ('Container started');
if(stage) init();
else
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
function init(eventInfo:Event = null):void
{
if(eventInfo != null)
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
trace ('Container init removed');
}
// constructor code
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
this.addEventListener( Event.ENTER_FRAME, containerEveryFrame);
}
public function containerEveryFrame (Event): void {
if (stage.contains(Main.player)) {
xprev = this.x;
yprev = this.y;
checkPlayerMovement();
}
}
// check the set keypress variables
public function checkPlayerMovement () : void {
if (wpressed) {
this.y -= this.speed;
}
if (spressed) {
this.y += this.speed;
}
if (apressed){
this.x -= this.speed;
}
if (dpressed) {
this.x += this.speed;
}
}
//assign key presses to variables
public function onKeyPress (event:KeyboardEvent):void {
//up
if (event.keyCode == 87){
wpressed = true;
}
//down
if (event.keyCode == 83) {
spressed = true;
}
//left
if (event.keyCode == 65){
apressed = true;
}
//right
if (event.keyCode == 68) {
dpressed = true;
}
}
//reset key press variables
public function onKeyRelease (event:KeyboardEvent) : void {
//up
if (event.keyCode == 87){
wpressed = false;
}
//down
if (event.keyCode == 83) {
spressed = false;
}
//left
if (event.keyCode == 65){
apressed = false;
}
//right
if (event.keyCode == 68) {
dpressed = false;
}
}
}
}
Main (there's some other stuff going on in here, but at the minute I'm just trying to get the trees working with my other class.)
package code
{
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import flash.geom.Rectangle;
import flashx.textLayout.container.ContainerController;
public class Main extends MovieClip
{
//public static var main
public static var player:PC;
//public static var firstenemy: WolfEnemy;
public static var MainContainer:everythingContainer;
public function Main()
{
// constructor code
trace('main started');
if (stage)
{
init();
}
else
{
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
}
function init(eventInfo:Event = null):void
{
if (eventInfo != null)
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
trace('Main init removed');
}
MainContainer = new everythingContainer ;
MainContainer.x = stage.stageWidth / 2;
MainContainer.y = stage.stageHeight / 2;
stage.addChild(MainContainer);
player = new PC();
player.x = stage.stageWidth / 2;
player.y = stage.stageHeight / 2;
stage.addChild(player);
//firstenemy = new WolfEnemy();
//firstenemy.x = 100;
//firstenemy.y = 100;
//stage.addChild(firstenemy);
stage.addEventListener( Event.ENTER_FRAME, everyFrameMain);
}
// check if an enemy hits the player.
/*public function enemycollison(): void {
if(firstenemy.hitTestObject(player)){
trace ('hit enemy');
player.health--;
firstenemy.kill();
}
}*/
// manage events that need to haapen globally for every frame
public function everyFrameMain(Event):void
{
/*if (stage.contains(firstenemy)){
enemycollison();
} */
//root.scrollRect = new Rectangle(player.x - 400, player.y - 300, 800, 600);
}
// finish and close game
public function endgame():void
{
}
}
}
and finally my tree class
package code {
import flash.display.*;
import flash.events.*;
import flash.ui.*;
import code.Main;
import code.everythingContainer;
public class Tree1 extends everythingContainer {
public function Tree1()
{
// constructor code
trace ('Tree1 started');
if(stage) init();
else
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
function init(eventInfo:Event = null):void
{
if(eventInfo != null)
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
trace ('Tree1 init removed');
}
this.addEventListener( Event.ENTER_FRAME, tree1EveryFrame);
}
public function tree1EveryFrame (Event): void {
playercollision();
}
public function playercollision(): void {
if(this.hitTestObject(Main.player)){
trace ('hit wall');
Main.player.x = Main.player.xprev;
Main.player.y = Main.player.yprev;
}
}
}
}

Probably due to linkage errors inside Fla-file.
RMB on library-item: Tree1
Export for ActionScript + Export in frame 1 + "class: code.Tree1"
File/Publish Settings/Actionscript Settings (the small wrench, right of Script-dropdown)
Source Path (add the linkage to where the compiler can find your package-folder), usually for me I crate a folder next to the fla file called src or something like that so the code-file would be found at "/MyProject/src/code/Tree1.as", in that case I add "./src/" inside Source path inside Advanced ActionScript 3.0 settings
Added an example project in Flash CS6 found at url:
https://user.iter.org/filesharing/?uid=927205f7-cdfe-4915-a175-bc87f64af444
that is available for ~40 days.
Project structure in that file:
"/MyProject/DeepInheritage.fla"
"/MyProject/src/code/Foobar.as"
"/MyProject/src/code/Tree1.as"
Foobar.as which extends MovieClip
Tree1 library item which extends Foobar
That should be the exact same thing that you described in your issue, meaning that there is nothing wrong with that approach, it is just a matter of finding what is wrong. Most likely that is due to errors inside FLA-file, but might be something else.
code files:
package code {
import flash.display.MovieClip;
public class Foobar extends MovieClip {
public function Foobar() {
trace("foobar ctor()");
}
}
}
package code {
import flash.display.MovieClip;
public class Tree1 extends Foobar {
public function Tree1() {
trace("Tree1 ctor()");
}
}
}

Related

Question about hide button on click or show

How can I force my button to hide or show or change appearance on click?
I use actionscript3 by adobe animate.
Mouse over and mouse down are working. But on release I see mouse up image.
Note: I shouldn't have more than one scene because all of my buttons are in one scene. anyone can help? Thanks
package
{
import fl.controls.*;
import flash.display.*;
import flash.events.*;
import flash.utils.*;
import flash.ui.*;
dynamic public class Main extends MovieClip
{
public var MyButton:MovieClip;
public var HideMouseTimer:Timer;
public function Main()
{
this.MyButton.addEventListener(MouseEvent.CLICK, this.onMyButton);
this.HideMouseTimer = new Timer(5000, 1);
this.HideMouseTimer.addEventListener(TimerEvent.TIMER, this.HideMouseTimerEvent);
setInterval(this.HideMouse, 100);
}
public function HideMouseTimerEvent(event:TimerEvent) : void
{
Mouse.hide();
this.MyButton.visible = false;
}// end function
public function HideMouse() : void
{
if (this.mouseXprev == mouseX && this.mouseYprev == mouseY)
{
this.HideMouseTimer.start();
}
else
{
Mouse.show();
this.MyButton.visible = true;
this.HideMouseTimer.reset();
}
this.mouseXprev = mouseX;
this.mouseYprev = mouseY;
}// end function
public function onMyButton (event:MouseEvent) : void
{
trace ("Pressed MyButton");
}
} //end Class Main
} //end Package

Movement Keys not Working

Nothing is happening when I press the arrow keys, but neither are there any errors: what's wrong with this? If I remove the key press testing it accelerates accordingly...
At this stage I am just trying to move a block around a screen in an inertial manner using the arrow keys. However, this is my first foray into AS3 so I may be going about it in completely the wrong manner.
Any help would be greatly appreciated.
Unit.AS:
package {
import flash.display.MovieClip;
import flash.events.*
import flash.ui.Keyboard
public class Unit extends MovieClip {
var velocityX:Number = 1;
var velocityY:Number = 1;
var accellerationX:Number = 1;
var accellerationY:Number = 1;
public function Unit(){
addEventListener("enterFrame", move);
}
private function move(e:Event){
accellerate()
this.x += velocityX;
this.y += velocityY;
}
private function accellerate(){
if (Key.isDown(Keyboard.UP)){
velocityY += accellerationY;
trace("Accellerating");
}
if (Key.isDown(Keyboard.DOWN)){
velocityY -= accellerationY;
trace("Accellerating");
}
if (Key.isDown(Keyboard.RIGHT)){
velocityX += accellerationX;
trace("Accellerating");
}
if (Key.isDown(Keyboard.LEFT)){
velocityX -= accellerationX;
trace("Accellerating");
}
}
}
}
Key.AS:
package
{
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
public class Key {
private static var initialized:Boolean = false;
private static var keysDown:Object = new Object();
public static function initialize(stage:Stage) {
if (!initialized) {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
stage.addEventListener(Event.DEACTIVATE, clearKeys);
initialized = true;
}
}
public static function isDown(keyCode:uint):Boolean
{
return Boolean(keyCode in keysDown);
}
private static function keyPressed(event:KeyboardEvent):void {
keysDown[event.keyCode] = true;
}
private static function keyReleased(event:KeyboardEvent):void {
if (event.keyCode in keysDown) {
delete keysDown[event.keyCode];
}
}
private static function clearKeys(event:Event):void {
keysDown = new Object();
}
}
}
On your unit constructor function call the initialize(stage) static function.
Key.initialize(stage);

How do I get my movieclip character to move?

I've been trying for a few hours now and I cant get my little character to move with the keyboard.
I have ran a trace to make see if anything was happening and the position value does change but my character doesn't react to that position change.
I receive no errors. Both my Character and BrickBlock are movieclips and they have been imported for ActionScript.
If any other information is needed please let me know. Thank you! :)
My following code:
package {
import flash.events.Event
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class CharMove extends MovieClip {
var char1 :Character;
var block :BrickBlock;
public function CharMove()
{
char1 = new Character();
block = new BrickBlock();
//this.addEventListener(Event.ENTER_FRAME, collide)
stage.addEventListener(KeyboardEvent.KEY_DOWN, kDown);
}
/*function collide(e:Event):void
{
if(char.hitTestObject(block))
{
char.visible = !char.visible;
}
}*/
function kDown(event:KeyboardEvent):void
{
switch (event.keyCode)
{
case Keyboard.LEFT:
char1.x -= 5;
trace(char1.x);
break;
case Keyboard.RIGHT:
char1.x +=5;
trace(char1.x);
break;
}
}
}
}
You might want to consider writing a static Input class.
package input {
import flash.display.Stage;
import flash.events.KeyboardEvent;
public class Input {
private static var keys:Array = new Array(255);
public static function setup(stage:Stage):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
}
private static function keyDown(e:KeyboardEvent):void {
keys[e.keyCode] = true;
}
private static function keyUp(e:KeyboardEvent):void {
keys[e.keyCode] = false;
}
public static function isKeyDown(k:int):Boolean {
return keys[k];
}
public static const A:uint = 65;
public static const B:uint = 66;
public static const C:uint = 67;
// The rest of the keys...
}
}
To use it first call setup() which adds the listeners for KEY_DOWN and KEY_UP events.
They you can easily query keys and do relevant actions accordingly.
Input.setup(stage);
/...
if(Input.isKeyDown(Input.A)) {
char1.x -= 5;
}

Keep receiving error: access of undefined property menu in AS3

I am following a tutorial (http://flashdeveloptutorial.blogspot.com/2011/08/chapter-2.html) for AS3 using flash develop to create a pong clone and am having trouble with displaying a main menu. I previously had a functioning prototype with a moving paddle so I believe the error(s) is in my revised(or new) Main, MainMenu, PongGame or CustomEvents file(s). When I run the code as instructed through the tutorial I receive the error ; access of undefined property menu in my Main.as file:
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* #author
*/
public class Main extends Sprite
{
private var game:PongGame;
****private var menu:MainMenu;****
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}
private function buildMenu():void {
menu = new MainMenu();
addChild(menu);
menu.addEventListener(CustomEvents.LAUNCH_GAME, startGame, false, 0, true);
}
private function startGame(e:CustomEvents):void {
removeChild(menu);
menu.removeEventListener(CustomEvents.LAUNCH_GAME, startGame);
menu = null;
game = new PongGame();
addChild(game);
}
}
}
So I added the "private var menu:MainMenu;" section but I do not know what class/ .as file to reference? or how to define var menu:
Sorry for the large amount of attached code. I did not change paddle.as which is the longest file.
assets.as
package
{
public class Assets
{
[Embed (source = '../lib/paddle.png')] public static const Pad:Class;
public function Assets(): void {
}
}
}
Paddle.as
package
{
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
public class Paddle extends Sprite {
private var pic:Bitmap = new Assets.Pad();
public function Paddle():void {
addEventListener(Event.ADDED_TO_STAGE, go);
}
private function die(e:Event):void {
removeChild(pic);
pic = null;
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
removeEventListener(Event.ENTER_FRAME, enterFrame);
removeEventListener(Event.REMOVED_FROM_STAGE, die);
}
private function go(e:Event) : void {
removeEventListener(Event.ADDED_TO_STAGE, go);
addChild(pic);
y = stage.stageHeight - pic.height;
x = stage.stageWidth * .5 - pic.width * .5;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler, false, 0, true);
addEventListener(Event.ENTER_FRAME, enterFrame, false, 0, true);
addEventListener(Event.REMOVED_FROM_STAGE, die);
}
private var movingLeft:Boolean;
private var movingRight:Boolean;
private function enterFrame(e:Event):void {
if (movingLeft) {
if(x-speed >= 0) {
x -= speed;
}
else {
x = 0;
}
}
else if (movingRight) {
if (x + speed + pic.width <= 600) {
x += speed;
}
else {
x = 600 - pic.width;
}
}
}
private var speed:int = 10;
private function keyDownHandler(e:KeyboardEvent):void {
if (e.keyCode == 38 || e.keyCode == 87) {
if (!movingLeft) {
movingLeft = true;
}
}
else if (e.keyCode == 40 || e.keyCode == 83) {
if (!movingRight) {
movingRight = true;
}
}
}
private function keyUpHandler(e:KeyboardEvent):void {
if (e.keyCode == 38 || e.keyCode == 87) {
if (movingLeft) {
movingLeft = false;
}
}
if (e.keyCode == 40 || e.keyCode == 83) {
if (movingRight) {
movingRight = false;
}
}
}
}
}
mainmenu.as
package
{
import flash.events.Event;
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
public class MainMenu extends Sprite
{
private var pongButton:Sprite;
public function MainMenu():void{
addEventListener(Event.ADDED_TO_STAGE, go);
}
private function go(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, go);
pongButton = item("Play", 20, 30, launchGame, 0xFF0000);
addChild(pongButton);
}
private function launchGame(e:MouseEvent):void {
dispatchEvent(new CustomEvents(CustomEvents.LAUNCH_GAME));
}
private function item(buttonText:String, X:int, Y:int, Funct:Function, txtColor:uint = 0xFFFFFF):Sprite {
var item:Sprite = new Sprite();
item.graphics.beginFill(0);
item.graphics.lineStyle(1, txtColor, .5);
item.graphics.drawRect(0, 0, 250, 30);
var myText:TextField = new TextField();
myText.selectable = false;
myText.width = 250;
myText.height = 30;
item.addChild(myText);
myText.autoSize = "center";
myText.text = buttonText;
myText.textColor = txtColor;
item.addEventListener(MouseEvent.CLICK, Funct);
item.x = X;
item.y = Y;
return item;
}
}
}
PongGame.as
package
{
import flash.display.Sprite;
import flash.events.Event;
public class PongGame extends Sprite
{
private var paddle:Paddle;
public function PongGame():void {
addEventListener(Event.ADDED_TO_STAGE, go);
}
private function go(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, go);
paddle = new Paddle();
addChild(paddle);
}
}
}
CustomEvents.as
package
{
import flash.events.Event;
public class CustomEvents extends Event
{
public static const LAUNCH_GAME:String = "launch_game";
public function CustomEvents(e:String):void {
super(e);
}
}
}
I'm not sure where to go from here to fix this error. Any help would be appreciated.
Although you've correctly added the menu property, the menu is never displayed because buildMenu() function is never called.
From your main class init(), call buildMenu() to instantiate and add menu to the stage:
Main.as
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
buildMenu();
}

Error 1009 : Cannot access a property of method of a null object reference

I don't understand what is going on
This is my Main.as
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class Main extends MovieClip {
public var pirkles:Circles = new Circles()
public function Main() {
gotoAndStop(1)
playbtn.addEventListener(MouseEvent.CLICK, playscreen)
}
public function playscreen(event:MouseEvent):void {
gotoAndStop(2)
addChild(pirkles)
}
}
}
And this is my Circles.as
package {
import flash.display.MovieClip
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard
import flash.events.MouseEvent;
public class Circles extends MovieClip{
public function Circles():void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, MOVE)
this.y = 175
this.x = 10
}
public function MOVE(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.RIGHT) {
this.x = this.x+10
}
else if (event.keyCode == Keyboard.LEFT) {
this.x = this.x-10
}
else if (event.keyCode == Keyboard.UP) {
this.y = this.y-10
}
else if (event.keyCode == Keyboard.DOWN) {
this.y = this.y+10
}
}
}
}
Now I get an error that says there is a problem at line 11 of my Circles.as and at line 8 of my Main.as. However, at those lines I don't understand what is causing the problem. I added a event listener at line 11, but when I take it out it works. Also, at line 8, I Just defined a variable.
you can't access the stage in a class constructor.
So the line
stage.addEventListener(KeyboardEvent.KEY_DOWN, MOVE)
is causing the error.
If you need to access the stage, add a listener in the constructor for the ADDED_TO_STAGE event, and in the callback function you will be able to access the stage
So:
public function Circles():void {
this.addEventListener (Event.ADDED_TO_STAGE, onAddedToStage);
this.y = 175
this.x = 10
}
private function onAddedToStage (evt:Event):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, MOVE)
}