我是AS3的新手,我尝试制作一个简单的Flash游戏。 我的问题涉及访问其类之外的特定数组。 我成功访问了一些变量和函数,但我完全坚持这个。
有3个类:游戏是与flash文件相关的主类,Level1产生背景元素和敌人,最后是Enemy类。
Game类实例化Level1类,它产生敌人(使用Enemy类)并将它们推送到数组。 当敌人被击中时,Enemy类中的一个方法将其从显示列表中删除,然后尝试将其从位于Level1类中的数组中删除,并且失败并抛出:
1119:通过具有静态类型Class的引用访问可能未定义的属性level1。
另一个问题是有些时候子弹停在屏幕中间,我也无法追踪这个错误。
任何方式,这是我的第一个代码相关的帖子,如果它太乱,请告诉我,我会尽量让它更具可读性。 很抱歉给您带来任何不便,谢谢您的帮助 -Yaniv
package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.text.*;
import flash.geom.Point;
public class Game extends MovieClip
{
public var player:Player;
public var level1:Level1;
public var bullet:Bullet;
private var bullets_arr:Array;
var fire_on : Boolean;
var fire_counter : int;
public function Game()
{
level1=new Level1(this.stage);
player = new Player ;
addChild(player);
player.y = 600;
bullets_arr = [];
addEventListener(Event.ENTER_FRAME,Main);
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
}
function mouseDownHandler($e:MouseEvent):void
{
fire_on = true;
}
function mouseUpHandler($e:MouseEvent):void
{
fire_on = false;
fire_counter = 0;
}
function fire():void
{
bullet = new Bullet ;
addChild(bullet);
bullet.x = player.x;
bullet.y = player.y - 32;
bullets_arr.push(bullet);
}
public function Main(e: Event):void
{
player.x = mouseX;
if (bullets_arr)
{
for (var m:int = 0; m < bullets_arr.length; m++)
{
bullets_arr[m].y -= 20;
if(level1.enemies_arr)
{
for (var n:int = 0; n < level1.enemies_arr.length; n++)
{
if (bullets_arr[m])
{
if (level1.enemies_arr[n])
{
if (level1.enemies_arr[n].hitTestObject(bullets_arr[m]))
{
if(bullets_arr[m].parent)
{
bullets_arr[m].parent.removeChild(bullets_arr[m]);
bullets_arr.splice(bullets_arr[m],1);
level1.enemies_arr[n].DoDamage(10);
}
}
}
}
}
}
}
}
if(fire_on)
{
fire_counter++;
if(fire_counter == 01)
{
fire();
}
else if(fire_counter >5)
{
fire_counter =0;
}
}
}
}
}
package {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
public class Level1 extends MovieClip{
var i:int;
var j:int;
var frame :int;
public var enemy:Enemy;
public var enemies_arr:Array;
public function Level1(target:Stage)
{
frame = 0;
enemies_arr = [];
for (var i:int = 0; i < 3; i++)
{
for (var j:int = 0; j < 3; j++)
{
enemy = new Enemy;
enemy.x = j*100 + 260;
enemy.y = i*40 - 150;
target.addChild(enemy);
enemies_arr.push(enemy);
}
}
}
}
}
package
{
import flash.display.MovieClip;
public class Enemy extends MovieClip
{
var Health : int;
var splash:Splash;
function Enemy()
{
Health =30;
}
public function DoDamage(Damage:int)
{
Health -= Damage;
if (Health <= 0)
{
Die();
}
}
public function Die()
{
if(this.parent)
{
this.parent.removeChild(this);
//HERE IS THE ERROR
Game.level1.enemies_arr.splice(this,1);
}
}
}
}
答案 0 :(得分:1)
你应该在Game实例上调用level1。
以简单的方式,您可以将游戏定义为单身人士
public class Game extends MovieClip {
private static var _instance:Game;
public static function getInstance():Game {
if (_instance == null) {
_instance = new Game();
}
return _instance ;
}
}
所以Die函数将是这样的
public function Die()
{
if(this.parent)
{
this.parent.removeChild(this);
//HERE IS THE ERROR
Game.getInstance().level1.enemies_arr.splice(this,1);
}
}
答案 1 :(得分:1)
您遇到的合成问题是,当level1是实例变量而非静态变量时,您正试图从类Game获取level1。作为一个实例变量,level1对于每个游戏实例来说都是一个完全不同的变量,所以如果你简单地说Game.level1
,编译器会想,&#34;哪个游戏?&#34;
要更改此设置,您只需将level1更改为静态变量,方法是更改:
public var level1:Level1;
到此:
public static var level1:Level1;
这样,变量在所有实例中都是相同的,你不应该在这一行访问它时遇到任何问题:
Game.level1.enemies_arr.splice(this,1);
我会说虽然这里可能存在某些设计原则的问题(可能是你应该使用回调或信号或模拟性的东西),但快速简单的解决方法是只添加单词{{ 1}}到level1&#39;声明。