HaxeFlixel 2 игрока игры: сделать код чище


Я делать игра для двух игроков. player1 можете играть с WASD ключи, и player2 можете играть с помощью клавиш со стрелками.

PlayState.НХ

package;

import flixel.FlxState;

class PlayState extends FlxState
{
    //basic global varible
    var WindowWidth:Int = 640;
    var WindowHeight:Int = 480;

    //sprites
    var player1:Player;
    var player2:Player;

    override public function create():Void
    {

        player1 = new Player(50, WindowHeight / 2 - 50);
        add(player1);


        player2 = new Player(590, WindowHeight / 2 - 50);
        add(player2);

        super.create();
    }

    override public function update(elapsed:Float):Void
    {
        player1.update();
        player2.update();
        super.update(elapsed);
    }
}

Плеер.НХ

package;

import flixel.FlxSprite;
import flixel.FlxG;
import flixel.util.FlxColor;

class Player extends FlxSprite
{
    public function new(X:Float,Y:Float)
    {
        super(X,Y);
        makeGraphic(20,100,FlxColor.WHITE);
    }

    override public function update(elapsed:Float):Void
    {

        super.update(elapsed);
    }
}

В этом коде я сделал класс игроков. Этот класс используется как player1 и player2 экземпляров.

В настоящее время оба игрока перемещаются с помощью клавиш со стрелками. Но я хочу сделать двух игроков, используя различные ключи (клавиши со стрелками и клавиши WASD).

Я рассматриваю два решения, но я думаю, что обе стороны не идеальны. Пахнет говнокодом.

Решение 1: Сделать player1 и player2 классов. Они расширяют Player класс и переопределить update() метод.

class Player1 extends Player
{
    override public function update(elapsed:Float):Void
    {
        //make player1 move by wasd keys.
        super.update(elapsed);
    }
}
class Player1 extends Player
{
    override public function update(elapsed:Float):Void
    {
        //make player2 move by arrow keys.
        super.update(elapsed);
    }
}

Но если я добавляю код в update()будет дублирование кода. Я хочу сделать два игрока полностью идентичны, только в другом месте и клавиатуры.

Решение 2: Получите аргумент в update() функция, какой ключ будет использоваться, и используйте его.

override public function update(elapsed:Float, upkey, downkey, rightkey, leftkey):Void
{
    //I will write it psuedo code
    if(upkey.pressed):
        move up
    if(downkey.pressed):
        move down
    if(leftkey.pressed):
        move left
    if(rightkey.pressed):
        move right
    super.update(elapsed);
}

Но это дополнительный аргумент в update() функция. И я думаю, что это делает код более сложным.

Для меня, как похоже на плохой код. Что я могу сделать?



130
3
задан 10 февраля 2018 в 01:02 Источник Поделиться
Комментарии
1 ответ

Настройка ключей выглядит как правильное решение для меня. Подклассы подход приводит к дублированию кода и непреклонность. Тем не менее, вы должны не сделать это путем добавления параметров update() - в самом деле, вы не можете, потому что функция подписи является overriden метод должен соответствовать. Вы получите ошибку компилятора:


Обновление поля перегрузок родительского класса с разными или неполный тип

Различное количество аргументов функции

Так как это 4 параметра, которые тесно связаны друг с другом, можно объединить их в структуру. С помощью FlxG.keys.anyPressed() API, который принимает массив ключей, мы могли бы в теории также позволяют несколько ключей на вход:

package;

import flixel.FlxG;
import flixel.FlxSprite;
import flixel.util.FlxColor;
import flixel.input.keyboard.FlxKey;

class Player extends FlxSprite
{
var keys:PlayerKeys;

public function new(x:Float, y:Float, keys:PlayerKeys)
{
super(x, y);
makeGraphic(20, 100, FlxColor.WHITE);
}

override public function update(elapsed:Float):Void
{
if (FlxG.keys.anyPressed(keys.up)) { /* move up */ }
if (FlxG.keys.anyPressed(keys.down)) { /* move down */ }
if (FlxG.keys.anyPressed(keys.left)) { /* move left */ }
if (FlxG.keys.anyPressed(keys.right)) { /* move right */ }

super.update(elapsed);
}
}

typedef PlayerKeys = {
up:Array<FlxKey>,
down:Array<FlxKey>,
left:Array<FlxKey>,
right:Array<FlxKey>
}

И построить игрок экземпляры:

player1 = new Player(x, y, {up: [UP], down: [DOWN], left: [LEFT], right: [RIGHT]});
player2 = new Player(x, y, {up: [W], down: [S], left: [A], right: [D]});


Есть две проблемы с вашим кодом:


  • Вы update() ваши игроки вручную в PlayState - Flixel уже делает, когда вы называете super.update()так как вы add()Эд игроки государству. Это означает, что игроки в конечном итоге обновляться два раза за кадр.

  • Вручную добавлены переменные для WindowWidth и WindowHeight, которые уже доступны по всему миру через FlxG.width и FlxG.height.

2
ответ дан 10 февраля 2018 в 01:02 Источник Поделиться