LINUX.ORG.RU

Пытаюсь учить паттерны, подскажите какой использовать

 ,


0

1

В общем читаю я http://gameprogrammingpatterns.com Вроде все вещи и понятные, только совсем не ясно где все это применять, я уж было расстроился, как вдруг сегодня осознал что таки мне паттерн нужен в игре которую я пишу, идея следующая.

Вы управляете шариком на экране, есть два варианта управления,

стрелочки клавиатуры придают шарику ускорение по соответствующим осям координат. 
стрелочки клавиатуры заставляют шарик ускорятся или замедлятся, поворачивать в ту или иную сторону

Как мне реализовать это? В голову приходит что-то типа создать один общий класс контроля, от него отнаследовать два с нужным мне поведением, а дальше у меня проблемка, что с этими классами делать? Да и что им передавать? Массив нажатых клавишь? Или при нажатии каждой клавиши передавать её?

★★★

public class Electron {

    class Control{
        protected InputHandler inputHandler;
        public Control(InputHandler inputHandler){
            this.inputHandler = inputHandler;
        }
        public void apply(){

        }
    }

    class SpeedAndRotate extends Control {
        public SpeedAndRotate(InputHandler inputHandler){
            super(inputHandler);
        }
        public void apply(){
            if(inputHandler.getPressedKey().contains(Input.Keys.RIGHT, false)){
                speed.setLength(speed.len()+0.1f);
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.LEFT, false)){
                speed.setLength(speed.len()-0.1f);
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.UP, false)){
                speed.rotate(-2);
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.DOWN, false)){
                speed.rotate(+2);
            }
        }
    }

    class XAndY extends Control {
        public XAndY(InputHandler inputHandler){
            super(inputHandler);
        }
        public void apply(){
            if(inputHandler.getPressedKey().contains(Input.Keys.RIGHT, false)){
                speed.add(new Vector2(0.1f,0));
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.LEFT, false)){
                speed.add(new Vector2(-0.1f, 0));
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.UP, false)){
                speed.add(new Vector2(0, 0.1f));
            }

            if(inputHandler.getPressedKey().contains(Input.Keys.DOWN, false)){
                speed.add(new Vector2(0, -0.1f));
            }
        }
    }
    
    Control control;
    Color last = Color.WHITE;
    Vector2 speed;
    Vector2 cor;
    public Electron(){
        speed = new Vector2(1,0);
        cor = new Vector2(0,0);
    }

    public void init(Control control){
        this.control = control;
    }

    public void apply(){
        control.apply();
    }
    //Texture texture = new Te
    public void move(){

        cor.add(speed);
    }
}

Шото такое сделал, выглядит жутко, зато вроде работает хорошо.

abs ★★★
() автор топика

Я могу ошибаться, но это же вроде паттерн Стратегия.

hippi90 ★★★★★
()

Смотри группы паттернов: порождения, структурные, поведения.

Начни с реализаций контейнера DI, IoC

anonymous
()

Любая игра, обычно, в том или ином виде представляет собой StateMachine (не всегда удобно её так представлять, но от этого она ей быть не перестаёт).

А сценарий поведения - это Strategy.

В твоих условиях не хватает триггера для переключения между поведениями обработки клавиатуры. Видимо, это зависит от какого то State.

pon4ik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.