我按照一个简单的教程尝试制作一个简单的自上而下的游戏,到目前为止我已经有了这个课程,但我无法弄清楚如何在舞台上用影片剪辑进行点击测试。
package
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
import KeyObject;
public class Player extends MovieClip
{
public var stageRef:Stage;
public var key:KeyObject;
public var leftPressed:Boolean = false;
public var rightPressed:Boolean = false;
public var upPressed:Boolean = false;
public var downPressed:Boolean = false;
public var lastMove:String;
public var speed:Number = 5;
public function Player(stageRef:Stage, X:int, Y:int):void
{
this.stageRef = stageRef;
this.x = X;
this.y = Y;
key = new KeyObject(stageRef);
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
public function loop(e:Event):void
{
checkKeypresses();
if(leftPressed){
x -= speed;
if(this.currentFrame < 7 || this.currentFrame > 9){
this.gotoAndPlay("left");
lastMove="left";
checkKeypresses();
}
} else if(rightPressed){
x += speed;
if(this.currentFrame < 12 || this.currentFrame > 14){
this.gotoAndPlay("right");
lastMove="right";
checkKeypresses();
}
}
if(upPressed){
y -= speed;
if(this.currentFrame < 17 || this.currentFrame > 19){
this.gotoAndPlay("up");
lastMove="up";
checkKeypresses();
}
} else if(downPressed){
y += speed;
if(this.currentFrame < 2 || this.currentFrame > 4){
this.gotoAndPlay("down");
lastMove="down";
checkKeypresses();
}
}
}
public function detectPlayer(){
//HOW VVVVVVVVVVV ?
if(lvl.wall_mc.hitTestPoint(this.x,this.y,true)){
if( lastMove == "right"){
this.x -= speed;
}
if( lastMove == "left"){
this.x += speed;
}
if( lastMove == "up"){
this.y += speed;
}
if( lastMove == "down"){
this.y -= speed;
}
}
}
public function checkKeypresses():void
{
if(key.isDown(37) || key.isDown(65)){ // left arrow or A
leftPressed = true;
} else {
leftPressed = false;
}
if(key.isDown(38) || key.isDown(87)){ //up arrow or W
upPressed = true;
} else {
upPressed = false;
}
if(key.isDown(39) || key.isDown(68)){ //right arrow or D
rightPressed = true;
} else {
rightPressed = false;
}
if(key.isDown(40) || key.isDown(83)){ //down arrow or S
downPressed = true;
} else {
downPressed = false;
}
}
}
}
在行中“如果(lvl.wall_mc.hitTestPoint(this.x,this.y,true))”我遇到了问题。请指出我正确的方向。
答案 0 :(得分:1)
lvl
在哪里定义?如果它是MovieClip
上的stage
,那么您需要了解Player
的实例很可能是lvl
的兄弟,这意味着您需要“上升到一个级别“以便访问它。
虽然这是糟糕的设计,但它应该有效:
if ( MovieClip( stage.getChildByName("lvl") ).wall_mc.hitTestPoint(this.x,this.y,true) )
这是在stage
找到名为“lvl”的孩子,将其作为MovieClip
投射,然后访问wall_mc
孩子。
如果您希望改进此设计以使其不那么紧密耦合,您应该将此逻辑上升到文档类或其他可以同时访问Player
和{{{ 1}}。
更新:
查看完整代码后,有几种方法可以解决您的问题。
首先,您有lvl
作为文档类,但是在构造函数中,您将Main.as
实例添加到舞台而不是在Player
下将其括起来。这会导致Main
成为您Player
文档类的兄弟,而不是孩子。
解决此问题的一种方法是将Main
添加到main,然后更改Player
方法以检查detectPlayer
的父级:
Player
其次,看起来好像你实际上没有调用检查墙壁碰撞的方法(if ( MovieClip( parent.getChildByName("lvl") ).wall_mc.hitTestPoint(this.x,this.y,true) )
)。要解决此问题,您可以在detectPlayer
方法的末尾拨打detectPlayer
。
如前所述,这不是最佳做法。另外,我注意到你正在通过你的Player.loop
课程并稍后将其传递给Player
,因此以这种方式重新育儿KeyObject
可能会破坏你的一些预期游戏玩法
如果您对松散耦合的重构感兴趣,我建议您修改Player
方法以接受Player.detectPlayer
作为参数,并在DisplayObject
内调用ENTER_FRAME
侦听器1}} class:
Main
这需要在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(stage, 320, 240);
stage.addChild(player);
addEventListener(Event.EXIT_FRAME, loop);
}
private function loop($event:Event):void
{
player.detectPlayer(lvl.wall_mc);
}
}
}
中进行以下更改:
Player