Actionscript 3 AS3.0:从第二类访问已创建实例的属性
我正在制作一个小游戏 在我的document类中,我使用以下代码创建类Actionscript 3 AS3.0:从第二类访问已创建实例的属性,actionscript-3,class,object,methods,instances,Actionscript 3,Class,Object,Methods,Instances,我正在制作一个小游戏 在我的document类中,我使用以下代码创建类字符和级别的实例: //add the Level level = new TileGrid(); level.y = 100; level.x = 400; addChild(player); //add our player player = new Character(); player.y = 150; player.x = 400; addChild(player); 我还创建了一个控制器类来处理用户输入。(例如
字符
和级别
的实例:
//add the Level
level = new TileGrid();
level.y = 100;
level.x = 400;
addChild(player);
//add our player
player = new Character();
player.y = 150;
player.x = 400;
addChild(player);
我还创建了一个控制器类来处理用户输入。(例如,检查玩家是否能够向右移动。)
我还为键盘事件等创建事件监听器
当按下一个键时,我想通过在控制器类中调用TileGrid类的checkTile(tileNumber)
函数来检查移动是否可行
控制器类如下所示:
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class Controller{
//Constructor code
public function Controller(){}
//Keyboard pressed -> move character
public function keyPressed(evt:KeyboardEvent):void
{
trace(level.checkTile(30));
}
}
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class TileGrid{
//Constructor code
public function TileGrid(){
//Creating all the tiles and adding them to the stage.
}
//Check if a certain tile is walkable
public function checkTile(tileNumberType){
if(tileNumberType > 15){
return false;
}else{
return true;
}
}
}
...
// somewhere in your document class (or somewhere else)
var player:Character = new Character();
var level:TileGrid = new TileGrid();
var controller:Controller = new Controller(player, level);
...
// in your Controller class
private var level:TileGrid;
private var player:Character;
public Controller(player:Character, level:TileGrid) {
this.player = player;
this.level = level;
}
public function keyPressed(event:KeyboardEvent):void {
level.checkTile(30); // in this line "level" means "this.level"
}
TileGrid类看起来像这样:
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class Controller{
//Constructor code
public function Controller(){}
//Keyboard pressed -> move character
public function keyPressed(evt:KeyboardEvent):void
{
trace(level.checkTile(30));
}
}
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class TileGrid{
//Constructor code
public function TileGrid(){
//Creating all the tiles and adding them to the stage.
}
//Check if a certain tile is walkable
public function checkTile(tileNumberType){
if(tileNumberType > 15){
return false;
}else{
return true;
}
}
}
...
// somewhere in your document class (or somewhere else)
var player:Character = new Character();
var level:TileGrid = new TileGrid();
var controller:Controller = new Controller(player, level);
...
// in your Controller class
private var level:TileGrid;
private var player:Character;
public Controller(player:Character, level:TileGrid) {
this.player = player;
this.level = level;
}
public function keyPressed(event:KeyboardEvent):void {
level.checkTile(30); // in this line "level" means "this.level"
}
但是当我测试这个时,我得到以下错误:
第81 1120行:访问未定义的属性级别。
当我尝试时:trace(Object(parent).level.checkTile(30))代码>我获取:1120:访问未定义的属性父项。
如何从一个类访问方法,从另一个类访问实例 AS中的类无法访问其上下文。这意味着如果我有:
function foo():void
{
var k:MyCustomClass = new MyCustomClass();
var j:MyOtherClass = new MyOtherClass();
}
这两个例子j和k彼此不了解
但是,在这种特殊情况下,因为您显然在处理父结构,所以可以获取父结构的属性。这是可能的,因为您在公共作用域中有一个变量的路径
请尝试以下方法:
trace(Object(parent).level.checkTile(30));
还要注意对象(父对象)。DisplayObject的父对象是DisplayObjectContainer,它没有级别属性。然而,通过在对象中包装父对象,您告诉Flash,“没关系,您应该在运行时而不是在编译时查找此属性。”我认为您必须这样做:
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class Controller{
//Constructor code
public function Controller(){}
//Keyboard pressed -> move character
public function keyPressed(evt:KeyboardEvent):void
{
trace(level.checkTile(30));
}
}
package {
import flash.events.KeyboardEvent;
import flash.events.Event;
public class TileGrid{
//Constructor code
public function TileGrid(){
//Creating all the tiles and adding them to the stage.
}
//Check if a certain tile is walkable
public function checkTile(tileNumberType){
if(tileNumberType > 15){
return false;
}else{
return true;
}
}
}
...
// somewhere in your document class (or somewhere else)
var player:Character = new Character();
var level:TileGrid = new TileGrid();
var controller:Controller = new Controller(player, level);
...
// in your Controller class
private var level:TileGrid;
private var player:Character;
public Controller(player:Character, level:TileGrid) {
this.player = player;
this.level = level;
}
public function keyPressed(event:KeyboardEvent):void {
level.checkTile(30); // in this line "level" means "this.level"
}
在这种情况下,您必须说明控制器必须控制哪个玩家和哪个级别。控制器是一个不了解任何其他类的类。这些变量不是全局变量(在您的示例中,它们不应该是全局变量),因此您无法从任何地方访问它们。我尝试过,但没有成功,我得到了错误:1120:访问未定义的属性父对象。这将不起作用,因为您可能认为Controller
是添加到stage的DisplayObject,而事实并非如此。