感谢您看到我的帖子。我在做游戏。我在敌人的班上工作。如果距离足够近,我希望敌人跟随玩家。我在这里有一个问题。我无法获得播放器和播放器。这是我的课: Main.as
package
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
public class Main extends MovieClip
{
public var player:Player;
public function Main():void
{
player = new Player
player.x=400;
player.y=300;
stage.addChild(player);
}
}
}
enemy.as
package {
import flash.display.MovieClip;
import flash.events.Event;
public class enemy extends MovieClip {
public var enemyhp:Number=100;
public function enemy() {
// constructor code
addEventListener(Event.ENTER_FRAME, enemyLoop);
}
function enemyLoop(e:Event):void
{
trace(Player.playerx);
trace(Player.playery);
}
}
}
Player.as
package {
import flash.display.MovieClip;
import flash.events.Event;
public class Player extends MovieClip {
public var playerx:Number;
public var playery:Number;
public function Player() {
// constructor code
addEventListener(Event.ENTER_FRAME, returnxy);
}
function returnxy(e:Event):void
{
playerx=x;
playery=y;
}
}
}
这是我的错误: D:\ Testtestest \ enemy.as,第18行1119:通过静态类型为Class的引用访问可能未定义的属性playerx。 D:\ Testtestest \ enemy.as,第19行1119:通过静态类型为Class的引用访问可能未定义的属性播放器。
对不起,因为我的英语不好。我是越南人,并且是编码方面的新手。我想像专业人士一样使用Class进行编码。非常感谢你。 <3
答案 0 :(得分:2)
您正在尝试使用播放器的playerx
和playery
属性,就像它们是静态属性一样(也就是说,属于该类,而不是实例)。您需要获得对播放器实例的引用,或将属性设为静态。
有几种方法可以做到这一点,这是一种快速的方法,尽管不一定最干净:
在Player类中,创建一个静态变量来存储播放器的单例实例:
public static var me:Player;
然后在播放器类的构造函数(即名为Player
的方法)中,将this
分配给me
var:
me = this;
现在您已经静态引用了播放器实例,并且可以通过执行Player.me
(例如,Player.me.x
它的作用是,无论何时创建新的Player实例,它都会将该实例分配给Player类的me
var。大概在任何给定时间只有一个Player实例。
现在,应谨慎使用静态方法和var,因为它们在应用程序的整个生命周期中都存在。一些开发人员努力使用尽可能少的静态变量(或仅用于常量和设置),我通常会同意它们,也就是说,只要您自己清理一下,就可以在显示对象上放置一些静态属性并不坏。正确地。 (例如,null
me
参考,如果您不再需要播放器在内存中)
当然,还有很多其他方法可以获取您的Player实例,例如执行MovieClip(root).player
(不是该语法的狂热者,但可以工作)或使用({{ 1}}),或者拥有一门可以同时管理所有敌人和玩家的职业。如果有时间,我会搜索一些游戏编程模式的最佳实践。