我正在为我的作业制作一个Flash游戏。 在我开始之前,我不是要求代码,我要求的是看我如何使编码高效。 (如果你愿意,此时你可以给我提示)
在我的游戏中,玩家可以选择两个角色。当玩家选择第一个角色时,布尔值变为真,该玩家可以玩。
但我讨厌的是我必须把代码加倍。
private function keyUp(e:KeyboardEvent):void
{
if (e.keyCode == 38)
{
if (playPrincess)
{
upKey = false;
caroline.standStill();
}
else
if (playSirTimmy)
{
upKey = false;
timmy.standStill();
}
}
}
例如,从这段代码中你可以看到,如果玩家正在玩timmy,那么“playSirTimmy”是真的,如果那是真的那么,我希望代码能够自己说话。
这是另一个例子。
private function SirTimmyMovement():void
{
if (playSirTimmy)
{
if (rightKey)
{
timmy.moveRight();
}
if (leftKey)
{
timmy.moveLeft();
}
if (upKey)
{
timmy.moveUp();
}
}
}
private function playPrincessMovement():void
{
if (playPrincess)
{
if (rightKey)
{
caroline.moveRight();
}
if (leftKey)
{
caroline.moveLeft();
}
if (upKey)
{
caroline.moveUp();
}
}
}
现在我不抱怨或呻吟,我喜欢编码,这很有趣/具有挑战性,我只想知道是否有其他方法来缩短代码,并使其高效。
感谢您的时间。
就是这样,当涉及到碰撞和敌人时,事情就会变成特迪奥和更难。
编辑:对于Martyn
private var character:player;
private var timmy:SirTimmy;
private var caroline:princess;
public function Main()
{
//iniation players
character = new player;
timmy = new SirTimmy;
caroline = new princess;
stage.addEventListener(Event.ENTER_FRAME, mainGameLoop)
}
private function choosePrincess(e:MouseEvent):void
{
if (e.target == princessBtn)
{
//playPrincess = true;
level1Check();
character = caroline;
}
}
private function startLevel1():void
{
if (easyMode)
{
//set variables
}
if (medMode)
{
//you askng for it
}
if (hardMode)
{
//set variables harder!
}
stage.addChild(character);
}
谢谢你,像魅力一样!
答案 0 :(得分:1)
而不是布尔值,只有一个属性可以存储您选择的字符:
private var player:Player;
选择角色时,只需更新该属性:
player = timmy; // or caroline
这样,您的所有代码只需要引用它,并且可以更加通用化:
private function movement():void
{
if(player === null)
{
// Don't run this function if neither character has been selected yet.
return;
}
if(rightKey) player.moveRight();
if(leftKey) player.moveLeft();
if(upKey) player.moveUp();
}
答案 1 :(得分:1)
您正在寻找的是所谓的状态机或状态设计模式。因此,无论选择何种角色,他们都使用类似的方法: moveLeft(), moveRight()和 moveUp()。
关于国家设计模式的四人帮:
允许对象在其内部状态更改时更改其行为。该对象似乎会更改其类。
因此,对于您提供的代码,一个非常基本的想法是对两个字符使用相同的状态机,并且只是从该状态机操纵正确的对象。以下是如何执行此操作的示例:
创建状态机! :强>
import flash.ui.Keyboard;
class StateMachine {
private var character:Player;
private var state:String; //store the current state we are in, right, left, up etc
public function StateMachine( character:Player ) {
this.character = character; //set the character to control states on
}
//handle the input from the keyboard event
public function handleInput( event:Object ):void {
switch( event.type ) {
case "keyDown":
if ( event.keyCode == Keyboard.RIGHT ) {
state = Keyboard.RIGHT;
}
if ( event.keyCode == Keyboard.UP ) {
state = Keyboard.UP;
}
if ( event.keyCode == Keyboard.LEFT ) {
state = Keyboard.LEFT;
}
if ( event.keyCode == Keyboard.DOWN ) {
state = Keyboard.DOWN;
}
break;
case "keyUp":
if ( event.keyCode == state ) {
state = 0;
}
break;
}
}
//on our update, apply the right function
public function update():void {
if ( state == KEYBOARD.RIGHT ) {
character.moveRight();
}
if ( state == KEYBOARD.DOWN ) {
character.moveDown();
}
if ( state == KEYBOARD.LEFT) {
character.moveLeft();
}
if ( state == KEYBOARD.UP ) {
character.moveUp();
}
}
现在这里是最好的部分,在你处理角色动作时,你可以让状态机处理它,而不是使用所有布尔值为正确的玩家。因此,首先选择角色时,我们可以创建一个新的状态机:
private var stateMachine:StateMachine;
private function keyUp(e:KeyboardEvent):void
{
if (e.keyCode == 38)
{
if (playPrincess)
{
upKey = false;
stateMachine = new StateMachine( caroline );
caroline.standStill();
}
else
if (playSirTimmy)
{
upKey = false;
stateMachine = new StateMachine( timmy );
timmy.standStill();
}
}
}
现在您可以拥有一个处理键盘输入的移动功能,您可以将KEY_DOWN
和KEY_UP
事件设置为此功能,状态机可以处理这两个事件:
private function onKeyMovement( e:KeyboardEvent ):void {
stateMachine.handleInput( e.keyCode );
}
最后,在您的更新功能中(无论是事件框架还是其他内容),请致电stateMachine.update();
,即:
private function myUpdateFunction( e:Event ):void {
stateMachine.update();
}
这应删除所有关键的布尔值,并让状态机处理所有输入。
希望有所帮助!