我是ActionScript 3的新手,但我一直在逐渐建立一个小型的“坦克”式射击游戏,现在我正在加入我的子弹射击,为此我做了一个新的AS3类并导入它等,但是当我运行游戏时,我收到错误:
调用可能未定义的方法
turretShot
请帮助我找出发生这种情况的原因。此错误在我的编译器错误中显示两次,并且它的行非常相似,这是受影响的代码部分:
shootTurret.as(班级档案)
package resources
{
import flash.display.*;
import flash.events.*;
public class turretShot extends MovieClip
{
var enemy_mc:MovieClip;
public function turretShot(enemy_mc:MovieClip)
{
var xSpeed:Number;
var ySpeed:Number;
var angle:Number;
public var shotSpeed:Number;
speed = 30;
var gravity:Number = 1;
var thisShot:MovieClip;
var platform1_mc:MovieClip;
var platform2_mc:MovieClip;
var thisParent: *;
enemy_mc = enemy;
this.addEventListener(Event.ADDED, initialize);
}
function initialize(event:Event):void
{
this.addEventListener(Event.ENTER_FRAME, moveShot);
thisParent = event.currentTarget.parent;
platform1_mc = thisParent.platform1_mc;
platform2_mc = thisParent.platform2_mc;
thisShot = MovieClip(this.parent.getChildByName(this.name));
angle = this.rotation / 180 * Math.PI;
xSpeed = Math.cos(angle) * speed;
ySpeed = Math.sin(angle) * speed;
}
function moveShot(event:Event):void
}
}
我已经在我的游戏.FLA动作中导入了这个必要的框架:
import resources.*;
因为我的班级文件位于游戏目录的“resources”文件夹中。
现在,抛出这些错误的代码的两个部分......不确定它是与它们有关还是只与类有关,但它们是:
(第4行)
var shot_mc:MovieClip;
if (keyPressed == Keyboard.SPACE && spaceKeyDown == false)
{
shot_mc = new turretShot(enemy_mc);
shot_mc.x = user_mc.x + user_mc.turret_mc.x;
shot_mc.y = user_mc.y + user_mc.turret_mc.y;
shot_mc.rotation = user_mc.turret_mc.rotation;
addChild(shot_mc);
spaceKeyDown = true;
}
和(第一行):
var shot_mc:MovieClip = new turretShot(user_mc);
shot_mc.x = enemy_mc.x + enemy_mc.enemyTurret_mc.x;
shot_mc.y = enemy_mc.y + enemy_mc.enemyTurret_mc.y;
shot_mc.rotation = enemyTargetRotation;
shot_mc.speed = Math.random() * 15 + 15;
addChild(shot_mc);
任何帮助都将不胜感激。
答案 0 :(得分:1)
您的turretShot类中有几个错误,编译器可能也会报告这些错误。修复它们,此消息应该消失。
您在构造函数中定义的变量应该与var enemy_mc:MovieClip;
一起在其外部定义。根据您的代码逻辑,使public
,private
或protected
成为一个很好的反应。
我还看到行enemy_mc = enemy;
引用了一个不存在的enemy
变量。您可能意味着您的构造函数为public function turretShot(enemy:MovieClip)
。
我没有接受的代码中可能存在其他错误。
答案 1 :(得分:0)
就像Dave Hart所说,你有很多错误但是你要问的具体错误是因为你没有将课程导入你的FLA。
import resources.turretShot;
答案 2 :(得分:0)
我更正了这个类的语法,因此你可以在评论部分看到我对其他问题的意思。我提供了所有变量public
范围和方法private
范围,但您可以随意更改它以满足您的需求。
您应该注意,您发布的代码存在许多语法错误,并且您在尝试编写完整游戏之前应该对ActionScript3和OOP充满信心。请在AS3和课程上学习本教程(或任何其他):kirupa tutorial on Classes in ActionScript 3
另外,类名通常用 UpperCamelCase 编写。这是大多数ActionScript3(和Java等)程序员遵循的惯例,如果您坚持使用它,您的代码将更易读,因此下次应该更容易帮助您;)
package resources
{
import flash.display.*;
import flash.events.*;
public class TurretShot extends MovieClip
{
public var enemy_mc:MovieClip;
public var xSpeed:Number;
public var ySpeed:Number;
public var angle:Number;
public var shotSpeed:Number;
public var speed:Number = 30;
public var gravity:Number = 1;
public var thisShot:MovieClip;
public var platform1_mc:MovieClip;
public var platform2_mc:MovieClip;
public var thisParent: *;
public function TurretShot(enemyParam:MovieClip)
{
enemy_mc = enemyParam;
this.addEventListener(Event.ADDED, initialize);
}
private function initialize(event:Event):void
{
this.addEventListener(Event.ENTER_FRAME, moveShot);
thisParent = event.currentTarget.parent;
platform1_mc = thisParent.platform1_mc;
platform2_mc = thisParent.platform2_mc;
thisShot = MovieClip(this.parent.getChildByName(this.name));
angle = this.rotation / 180 * Math.PI;
xSpeed = Math.cos(angle) * speed;
ySpeed = Math.sin(angle) * speed;
}
private function moveShot(event:Event):void
{
//do stuff every frame
trace("enter frame");
}
}
}
希望这有帮助!