使用多个类来控制一个角色
Using multiple classes to control a character
我正在尝试创建虚拟 pet/basic 模拟人生类型的游戏。
我将使用独立的 class 文件并在主游戏文件中调用它们。
我正在尝试写一个 class 来控制我的角色,我可以将它添加到舞台上,但我不能让它移动。
我刚刚花了 4 个小时观看教程、阅读书籍,却看不出我错过了什么。
谁能给我一些建议让这个工作?
这是我的代码...
这是我的主要class ...
package {
import flash.display.MovieClip;
import MainCharacter;
import flash.events.KeyboardEvent;
public class Tamagotchi extends MovieClip {
public function Tamagotchi() {
var item:MainCharacter = new MainCharacter();
addChild(item);
item.addEventListener(KeyboardEvent.KEY_DOWN, item.KeyPressListener);
}
}
}
这是角色 class ...
package {
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.events.MouseEvent;
public class MainCharacter extends MovieClip {
var soph: MovieClip = new SophRun;
public function MainCharacter() {
addChild(soph);
soph.x = 200;
soph.y = 300;
soph.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressListener);
}
public function KeyPressListener(e:KeyboardEvent):void {
if (e.keyCode == 65)
{
soph.x -= 2;
}
if (e.keyCode == 68)
{
soph.x += 2;
}
if (e.keyCode == 87)
{
soph.y -= 2;
}
if (e.keyCode == 83)
{
soph.y += 2;
}
}
}
}
我已经将事件监听器移动到多个地方,但仍然无法正常工作。
我猜我遗漏了一些明显的东西,但无法弄清楚是什么!
您需要将 KeyboardEvent
监听器添加到舞台 - 目前只有当您的角色有文本焦点时它才会起作用,而它永远不会有。
我喜欢的一个简单设置,它有一个 Input
class,它添加了必要的事件侦听器,然后您可以使用它来检查是否按下了键。类似于:
public class Input
{
// handy constants for common keys
public static const A:int = 65;
public static const B:int = 66;
...
public static const LEFT:int = 37;
public static const UP:int = 38;
public static const RIGHT:int = 39;
public static const DOWN:int = 40;
private var m_keysPressed:Vector.<Boolean> = null; // the keys currently pressed
public function Input( stage:Stage )
{
// we create our vector for the max number of keys that we're going to support (standard keyboard)
this.m_keysPressed = new Vector.<Boolean>( 225, true );
// add our listeners
stage.addEventListener( KeyboardEvent.KEY_DOWN, this._onKeyDown );
stage.addEventListener( KeyboardEvent.KEY_UP, this._onKeyUp );
}
public function isKeyPressed( key:int ):Boolean
{
if( key < 0 || key >= this.m_keysPressed.length )
return false;
return this.m_keysPressed[key];
}
private function _onKeyDown( e:KeyboardEvent ):void
this.m_keysPressed[e.keyCode] = true;
}
private function _onKeyUp( e:KeyboardEvent ):void
{
this.m_keysPressed[e.keyCode] = false;
}
}
这样,您所有的输入代码都是集中的。然后您可以通过以下方式调用它:
if( myInput.isKeyPressed( Input.UP ) )
// move up
好处:
- 您的代码是核心 - 易于更改
- 易于禁用或启用(暂停功能)
- 您可以添加简单的回调(
Dictionary
使用 int
键和 Function
值)
- 您可以轻松添加
justPressed( key )
或 justReleased( key )
等方法
- 您不会遇到重复键的问题(当按下某个键时,Flash 会重复
KEY_DOWN
事件)
如果您打算在移动设备上使用它,您可能需要为 _onKeyDown()
和 _onKeyUp()
函数添加边界检查,因为 Android Home 和 Back 键具有愚蠢的高keyCode
个值。
注意:如果仍然无法正常工作,请确保您已将焦点放在舞台上(即单击它),并且您不在 TextField
等 (stage.focus = null
)
我正在尝试创建虚拟 pet/basic 模拟人生类型的游戏。 我将使用独立的 class 文件并在主游戏文件中调用它们。 我正在尝试写一个 class 来控制我的角色,我可以将它添加到舞台上,但我不能让它移动。 我刚刚花了 4 个小时观看教程、阅读书籍,却看不出我错过了什么。 谁能给我一些建议让这个工作? 这是我的代码...
这是我的主要class ...
package {
import flash.display.MovieClip;
import MainCharacter;
import flash.events.KeyboardEvent;
public class Tamagotchi extends MovieClip {
public function Tamagotchi() {
var item:MainCharacter = new MainCharacter();
addChild(item);
item.addEventListener(KeyboardEvent.KEY_DOWN, item.KeyPressListener);
}
}
}
这是角色 class ...
package {
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.events.MouseEvent;
public class MainCharacter extends MovieClip {
var soph: MovieClip = new SophRun;
public function MainCharacter() {
addChild(soph);
soph.x = 200;
soph.y = 300;
soph.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressListener);
}
public function KeyPressListener(e:KeyboardEvent):void {
if (e.keyCode == 65)
{
soph.x -= 2;
}
if (e.keyCode == 68)
{
soph.x += 2;
}
if (e.keyCode == 87)
{
soph.y -= 2;
}
if (e.keyCode == 83)
{
soph.y += 2;
}
}
}
}
我已经将事件监听器移动到多个地方,但仍然无法正常工作。 我猜我遗漏了一些明显的东西,但无法弄清楚是什么!
您需要将 KeyboardEvent
监听器添加到舞台 - 目前只有当您的角色有文本焦点时它才会起作用,而它永远不会有。
我喜欢的一个简单设置,它有一个 Input
class,它添加了必要的事件侦听器,然后您可以使用它来检查是否按下了键。类似于:
public class Input
{
// handy constants for common keys
public static const A:int = 65;
public static const B:int = 66;
...
public static const LEFT:int = 37;
public static const UP:int = 38;
public static const RIGHT:int = 39;
public static const DOWN:int = 40;
private var m_keysPressed:Vector.<Boolean> = null; // the keys currently pressed
public function Input( stage:Stage )
{
// we create our vector for the max number of keys that we're going to support (standard keyboard)
this.m_keysPressed = new Vector.<Boolean>( 225, true );
// add our listeners
stage.addEventListener( KeyboardEvent.KEY_DOWN, this._onKeyDown );
stage.addEventListener( KeyboardEvent.KEY_UP, this._onKeyUp );
}
public function isKeyPressed( key:int ):Boolean
{
if( key < 0 || key >= this.m_keysPressed.length )
return false;
return this.m_keysPressed[key];
}
private function _onKeyDown( e:KeyboardEvent ):void
this.m_keysPressed[e.keyCode] = true;
}
private function _onKeyUp( e:KeyboardEvent ):void
{
this.m_keysPressed[e.keyCode] = false;
}
}
这样,您所有的输入代码都是集中的。然后您可以通过以下方式调用它:
if( myInput.isKeyPressed( Input.UP ) )
// move up
好处:
- 您的代码是核心 - 易于更改
- 易于禁用或启用(暂停功能)
- 您可以添加简单的回调(
Dictionary
使用int
键和Function
值) - 您可以轻松添加
justPressed( key )
或justReleased( key )
等方法 - 您不会遇到重复键的问题(当按下某个键时,Flash 会重复
KEY_DOWN
事件)
如果您打算在移动设备上使用它,您可能需要为 _onKeyDown()
和 _onKeyUp()
函数添加边界检查,因为 Android Home 和 Back 键具有愚蠢的高keyCode
个值。
注意:如果仍然无法正常工作,请确保您已将焦点放在舞台上(即单击它),并且您不在 TextField
等 (stage.focus = null
)