我正在建造一个小游戏。
在我的文档类中,我使用以下代码创建了类Character
和Level
的实例:
//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);
我还创建了一个处理用户输入的控制器类。 (例如,检查玩家是否能够向右移动。)
我还为keyboardevents和stuff创建了eventlisteners。
当按下某个键时,我想通过从控制器类中调用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));
}
}
TileGrid类看起来像这样:
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;
}
}
}
但是当我测试这个时,我得到以下错误:
Line 81 1120: Access of undefined property level.
当我尝试:trace(Object(parent).level.checkTile(30));
时,我得到:1120: Access of undefined property parent.
如何使用第二个类中的实例从一个类访问方法?
答案 0 :(得分:2)
我认为你必须做这样的事情:
...
// 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"
}
在这种情况下,您必须说出哪个玩家以及控制器必须控制的级别。控制器是一个不了解任何其他类的类。变量不是全局变量(在您的示例中,它们不应该是),因此您无法从任何地方访问它们。
答案 1 :(得分:0)
AS中的类无法访问其上下文。这意味着,如果我有:
function foo():void
{
var k:MyCustomClass = new MyCustomClass();
var j:MyOtherClass = new MyOtherClass();
}
两个实例j和k彼此不了解。
但是,在这种特殊情况下,由于您正在处理父结构,因此可以获取父项的属性。这是可能的,因为您在公共范围内有变量的路径。
请改为尝试:
trace(Object(parent).level.checkTile(30));
还要注意对象(父对象)。 DisplayObject的父级是DisplayObjectContainer,它没有级别属性。但是,通过将父包装在Object中,您告诉Flash,“没关系,您应该在运行时查找此属性,而不是在编译时。”