Рубрики
Без рубрики

Игра Rect RPG!

Небольшой эксперимент в реакции! Строительство RPG активное время боевой системы

Автор оригинала: Daniel Fortes.

Поскольку я был ребенком, я большой поклонник видеоигр RPGS – специально JRPGS, как финальная фэнтезийная серия! Так что для моей первой статьи здесь на кода-то, что я подумал, что смогу попробовать что-нибудь забавное построить небольшие версии боевой системы RPG, используя мои любимые рамки, реагируют.

Начнем с написания компонента React Container, который выглядит как меню из окончательной фантазии, как видно выше. Это действительно просто компонент, состоящий из обертки DIV, который стиль, как меню FF:

const MenuContainer = ({ children, style }) =>
  
{children}

Вы можете оформить заказ стиль в CSS, содержащиеся в кодепене ниже. Давайте также создадим Игра Компонент, который будет представлять всю игру:

const Game = () => 
  
    Menu
  
  
 ReactDOM.render(, document.getElementById('game'))

В результате чего:

Следующим шагом является создание меню, в котором использование может выбрать опцию. Для этого мы создаем Менуселикт Компонент (полный код в следующем кодепене):

class MenuSelect extends React.Component {
  
  (...)
  
  render() {
    return (
        
        {
          this.props.items.map( (item, index) => 
            
this.itemRefs[index] = e} key={index}> { this.props.renderItem(item, index) }
) } { this.props.active ?
: null }
) } }

Основная идея здесь состоит в том, чтобы иметь контейнер из списка, который отображает произвольные компоненты; Рендеринг каждого компонента выполняется функцией Рендеритм поставляется в виде опоры, который питается данным Предметы массив, так что Рендеритм (предмет, индекс) оказывает данный товар. Пользователь выбирает параметры, используя клавиши со стрелками в клавиатуре, и нажмите Enter или пробел, чтобы на самом деле выбрать элемент, а затем функцию PROP Наконе называется. Теперь Игра Компонент становится:

const => {имя}

const Game = () =>
  
{console.log("You have chosen", i)}} renderItem={renderItem} items={["Some character", "Other caracther", "Hyper Link", "Cid"]} />

Ну, теперь, когда базовый блок пользовательского интерфейса работает, мы можем начать думать о игровой логике и структуре! Мы построим очень простую модель: один игрок, сражающийся против одного врага. И игрок, и враг определяются их статистикой. В нашей простой модели статистика субъекта является что-то вроде:

const entityStat= {
  hp: 100,
    time: 2000,
    attack: 50,
    defense: 32
}

Здесь, конечно, HP это жизненная ценность сущности, время это интервал между поворотами, а атаковать и оборона … атака и защита.

Что касается экранов, появится начальный экран, при этом пользователи выбирают, чтобы запустить игру, игровой экран, где игрок выберет действие на каждом повороте, пока не закончился свой HP, ни врага, И игра заканчивается, возвращаясь на начальный экран.

Довольно минималистичное состояние для описания этой игры было бы:

const game = {
  isRunning: false,
    playerStats: { hp: 100, time: 2000, attack: 50, defense: 32 },
    enemyStats: { hp: 50, time: 1200, attack: 20, defence: 15 },
    isPlayerTurn: false
}

Это точное состояние в том смысле, что он определяет, что будет отображаться на экране в любой момент времени; Существуют и другие переходные объекты, например, таймеры для часов каждый поворот, которые необходимы для функционирования игры.

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

const Start = ({ start }) =>
   {item} }
    >
  

class Game extends React.Component {
  constructor(props) {
    super(props)
    this.state = this.props.initialState ? {...this.props.initialState}{...initialState}
  }
  
  
  onStart() {
    this.setState(setIsRunning(true))
  }
  
  render() {    
    return (
      
{ this.state.isRunning ? game : }
) } }

Итак, теперь у нас есть начальный экран, и когда пользователь использует «начать игру», он видит экран только с словом «игра». Это должно быть главный игровой экран. Давайте напишем это.

Для главного экрана нам придется меню панелей бок о бок, один для выбора действия, другой показывая статистику игрока. Итак, мы изменим функцию рендера на:

render() {    
    if (!this.state.isRunning) {
      return (
        
) } return (
A B
) } }

с участием:

.main-game {
  display: flex;
  flex-direction: row;
  flex: 1;
  height: 100%;
}

.main-game-panel {
  display: flex;
  flex: 1;
  align-items: stretch;
}

Конечный результат: