我正在开发一个简单的Flash游戏,我的玩家可以从船上推出桶来赢得比赛。我编码了移动并定义了大多数对象,但是当我添加碰撞属性时,我失去了使用键盘移动播放器的能力。这是代码:
package
{
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;
public class Main_Character extends MovieClip
{
var vx:int;
var vy:int;
public function Main_Character()
{
init();
}
function init():void{
vx = 0;
vy = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
function onKeyDown(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT)
{
vx = -5;
}
else if (event.keyCode == Keyboard.RIGHT)
{
vx = 5;
}
else if (event.keyCode == Keyboard.UP)
{
vy = -5;
}
else if (event.keyCode == Keyboard.DOWN)
{
vy = 5;
}
}
function onKeyUp(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT ||
event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
if (event.keyCode == Keyboard.DOWN ||
event.keyCode == Keyboard.UP)
{
vy = 0;
}
}
function onEnterFrame(event:Event):void
{
player1.x += vx;
player1.y += vy;
if (player1.x > 530)
{
player1.x = 530;
}
else if (player1.x < 0)
{
player1.x = 0;
}
else if (player1.y < 0)
{
player1.y = 0;
}
else if (player1.y > 515)
{
player1.y = 515;
}
else if (player1.hitTestObject(water1))
{
player1.x -= vx;
player1.y -= vy;
}
Collision.block(barrel1, player1);
}
}
}
答案 0 :(得分:1)
因此,您收到possibly undefined method
错误的原因是因为您的Collision
类很可能不存在。我想我找到了您复制代码的网站,并且他们没有包含他们的Collision
类代码,所以您必须自己创建。
但是为了基本了解如何执行此操作,您可能首先要在player
类中添加简单的碰撞功能。您可以通过修改关键事件处理程序和onEnterFrame
函数来执行此操作,方法是在player
类中创建另一个变量,例如var speed:int = 5
,并修改您的onKeyDown
处理程序使用它代替5
来提高移动速度。
然后,在您的onEnterFrame
处理程序中,您需要将行Collision.block(barrel1, player1);
替换为以下内容:
// see if player hit a barrel. If so, decrease movement speed slightly.
else if (player.hitTestObject(barrel1)) {
speed = 3;
}
else {
speed = 5;
}
但仅此一点还不够。之后,您需要确保您的barrel
课程能够被播放器推开。您应该在其类中创建public
变量,例如public var barrelSpeed:int = 0
,以及public var barrelDirection:int = 1
(以控制桶运动的方向)。
这样,只要玩家击中枪管,您就可以修改barrelSpeed
和barrelDirection
变量。
总而言之,您的player.as
应该在其构造函数之前具有以下内容:
var speed:int = 5;
您的barrel.as
在构造函数之前应该具有以下内容:
public var barrelSpeed:int = 0;
public var barrelDirection:int = 1;
修改barrel
的{{1}}函数,如下所示:
onEnterFrame
然后,您的this.x += (barrelSpeed * barrelDirection);
// for realism, you can also tween barrel's y value to simulate a slight bounce.
应在player.as
函数的末尾包含以下内容:
onEnterFrame
您的// see if player hit a barrel. If so, decrease movement speed slightly.
else if (player.hitTestObject(barrel1)) {
speed = 3;
barrel1.barrelSpeed = 3;
// if vx is positive, barrelDirection is positive; otherwise it's negative.
barrel1.barrelDirection = (this.vx > 0) ? 1 : -1;
}
else {
speed = 5;
barrel1.barrelSpeed = 0;
}
player
函数应如下所示:
onKeyDown
现在,您还需要更改一些内容,以便与多个桶进行交互。对于一个很好的教程,这里有一些代码显示基本相同的东西,除了塔攻击敌人:
http://www.flashgametuts.com/tutorials/as3/how-to-create-a-tower-defense-game-in-as3-part-4/
基本上,你需要在main.fla中创建一个包含所有桶的数组,并循环遍历它们以查看是否与它们发生碰撞。我建议首先让一个桶工作并从那里开始。
祝你好运,如果有问题,请告诉我。