Как моделировать сложные данные - PullRequest
9 голосов
/ 16 октября 2010

Мне нужно создать модель, которая хранит элементы управления игровым процессом для игр на нескольких платформах. У меня проблемы с поиском правильного подхода.

  1. Кнопки контроллера различаются в разных системах (Wii, Xbox 360, PS3 имеют свои собственные кнопки контроллера).
  2. Некоторые игры на самом деле представляют собой несколько игр, упакованных как одна; это означает, что один продукт может иметь несколько элементов управления в зависимости от игры.
  3. Управление игровым процессом во многих играх меняется в зависимости от игровой активности (вождение / ходьба / полет и т. Д.) *
  4. Недостаточно просто сохранять функции кнопок, поскольку в большинстве игр есть несколько специальных ходов, требующих комбинации кнопок.

Как бы вы подошли к этой проблеме? Честно говоря, я не знаю с чего начать!

Обновление: Большое спасибо всем за ваш вдумчивый и очень полезный вклад. Мне еще предстоит выбрать и ответить, потому что, в конце концов, было решено, что эта функция не стоит усилий. Еще раз большое спасибо.

Ответы [ 7 ]

2 голосов
/ 16 октября 2010

Некоторые контроллеры имеют общие макеты, но с разными гранями, то есть 360 и PS3 (X - это A, треугольник - это Y и т. Д.). С дополнительными периферийными устройствами, такими как боевые джойстики, джойстики, гитары и т. Д. - это просто разные лица, которые соответствуют ожиданиям консоли. Поскольку кнопки обычно определяются до того, как любой контроллер даже отлит, вы можете сделать то же самое.

Каждое отображение не все применимо к каждому контроллеру, поэтому оно может быть не идеальным - учитывая современные контроллеры консоли, все должно быть в порядке. Если вы добавите контроллеры Intellivision и клавиатуру / мышь, все может стать странным.

// using CHAR(8) for absolutely no good reason. change at will.
CREATE TABLE button_maps (
id tinyint unsigned not null auto_increment,
map_id char(8) not null,
primary key (id),
unique key map_id (map_id)
);

INSERT INTO button_maps (map_id)
VALUES
// dual analog, any direction
('ANA_LFT'), ('ANA_RT'),
// 4-button compass face
('BT_N'), ('BT_S'), ('BT_E'), ('BT_W'),
// shoulder buttons
('BT_LT1'), ('BT_LT2'), ('BT_RT1'), ('BT_RT2'),
// system buttons
('BT_START'), ('BT_SEL'), ('BT_MENU'),
// analog stick click-in, usually called "L/R 3"
('ANA_L3'), ('ANA_R3'),
// 8-direction d-pad - add clockface points for both analogs too
('DPAD_N'), ('DPAD_S'), ('DPAD_E'), ('DPAD_W'),
('DPAD_NW'), ('DPAD_NE'), ('DPAD_SW'), ('DPAD_SE'),
// and DS stylus so it's not obvious what I'm looking at right now
('STL_TAP'), ('STL_DTAP'), ('STL_DRAG'),
// and so on

Примечание: я понятия не имею, как эти элементы управления движением всего тела обрабатываются внутренне, удачи, если вам когда-либо придется иметь дело с ними. LFOOT_HOKEYPOKEY или что-то.

Примечание 2: Серьезно, не используйте там символ (8). Подробно, но держите его достаточно общим, чтобы применять его к общему стилю контроллера, а не к бренду.

Теперь кнопки для каждой марки контроллера с их названием (предполагается таблица «контроллеры»):

CREATE TABLE buttons (
id tinyint unsigned not null auto_increment,
controller_id tinyint unsigned not null references controllers.id,
map_id tinyint unsigned not null references button_maps.id,
button_name varchar(32) not null,
primary key (id),
unique key controller_map (controller_id, map_id)
);

INSERT INTO buttons (controller_id, map_id, button_name)
VALUES
(2, 1, 'Left Analog'), (2, 2, 'Right Analog'),
(2, 3, 'Y'), (2, 4, 'A'), (2, 5, 'B'), (2, 6, 'X'),
(2, 7, 'Left Trigger (LT)'), (2, 8, 'Right Trigger (RT)'),
(2, 9, 'Left Bumper (LB)'), (2, 10, 'Right Bumper (RB)')
// and so on.  PS3 with button shapes and R1/2, L1/2 instead of trigger/bumper

Теперь для действий нажатие кнопки (или несколько кнопок, или последовательность) представляет игру. Это не учитывает контекст (2 и 3 исходного вопроса), например, режим игры или альтернативные конфигурации кнопок, но Джош Смитон и littlegreen уже рассмотрели это.

Это определяет действия для каждой отдельной игры, что не очень эффективно. Возможно, вам удастся значительно сократить объем, добавив общий слой игровых «типов». Многие игры в определенном жанре / перспективе имеют общие элементы управления, и это становится все более распространенным (консольные FPS добавляют предопределенные конфигурации кнопок в стиле Halo и CoD, так как игроки их знают, и тому подобное). Таким образом, если вы можете определить набор общих действий для каждого жанра и использовать его только для переопределения / расширения этих значений по умолчанию по мере необходимости, вы сможете реализовать гораздо более чистое решение.

Сначала определите каждое действие:

CREATE TABLE game_actions (
id int unsigned not null auto_increment,
game_id int unsigned not null references games.id,
action varchar(32) not null,
primary key (id)
);

INSERT INTO game_actions (game_id, action)
VALUES (1, 'Shoot'), (1, 'Reload'), (1, 'Turn Left'), (1, 'Turn Right')
// and so on

И, наконец, определите нажатия кнопок, связанные с каждым действием. Поле «ординал» предназначено для комбо-последовательностей, таких как комбинации в файтингах - отдельные действия - это 0-й порядковый номер, а последовательности считаются с 1, чтобы их было легко различить. Он не учитывает время, поэтому вам может понадобиться кнопка «ничего» в качестве отдыха для некоторых из более сложных комбо-игр (Soul Caliber et al).

CREATE TABLE game_action_buttons (
id int unsigned not null auto_increment,
game_action_id int unsigned not null references game_actions.id,
ordinal tinyint unsigned not null,
button_map_id tinyint unsigned not null references button_maps.id,
primary key (id)
);

INSERT INTO game_action_buttons (game_action_id, ordinal, button_map_id)
VALUES
(1, 0, 8), // right trigger to shoot
(2, 0, 6), // west face button (X/square) to reload
(3, 0, 7), (3, 0, 9) // combo: both bumpers for rear view look-back while driving
// and a Street Fighter shoryuken on the d-pad to show a sequence:
(4, 1, 21), // DPAD_E: right
(4, 2, 20), // DPAD_S: down
(4, 3, 26), (4, 3, 4) // DPAD_SE + BT_S: down/right + fierce... i think.

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

1 голос
/ 19 октября 2010

Я попробую :) 1001 *

1) Вам понадобится стол для систем

2) Вам понадобится таблица для пакетов (с нулевой ссылкой на родителя), таблица с играми и таблица для связи игр с пакетами. Это гарантирует, что игра может быть частью разных пакетов. Это не позволяет различным пакетам иметь разные "особые версии" одной и той же игры. Но это не было требованием:)

3) Я не уверен, что это то же самое, что и 2), если нет: таблица со ссылкой на игру, если: см. 2)

4) Вам понадобится таблица для действия («последовательность») со ссылкой на часть игры, затем вам понадобится таблица для комбинации клавиш со ссылкой на последовательность. Наконец, вам понадобится таблица для определенного ключа со ссылкой на комбинацию.

Я думаю, что это покроет это, хотя у меня есть некоторые сомнения относительно джойстиков, мыши и т. Д. Вы могли бы хотеть разделить таблицу «ключ» на несколько таблиц, чтобы избежать многих столбцов в этой таблице, но это решение у вас принимать в зависимости от того, как вы планируете получить доступ к вашей базе данных и т. д.

1 голос
/ 19 октября 2010

Я только кратко об этом думаю, но думаю, что вы можете использовать что-то вроде этого (мне было лень добавлять ER 'вилки', но верхняя таблица ссылается на нижнюю таблицу (таблицы)):

data model.

  • button - это кнопка на контроллере, я предполагаю, что вам нужно идентифицировать их также с типом, чтобы вы могли идентифицировать такие вещи, как нажатие, направление, давление и т. Д..
  • consle - хранит wii, xbox, ...
  • gameplay - это уровень, в котором вы находитесь, и на каждом уровне есть количество ходов(или действия, если вы предпочитаете), эти действия должны выполнить часть кода в конце, чтобы что-то произошло на этом игровом уровне.
  • console-move - это комбинация кнопок для выполненияопределенный ход на конкретной консоли.Если вам нужно нажать комбинацию кнопок в Wii, а не на Xbox, то это должно быть возможно

при желании вы можете связать кнопку с консолью

1 голос
/ 16 октября 2010

Console
    int id
    string name

Controller
    int id
    string name
    int console_id fk

Button
    int id
    string name
    int controller_id fk

Game
    int id 
    string name
    int parent_id fk -- game within a game

-- context within a game (default, driving, swimming)
Context
    int id
    string name
    int game_id fk

-- applicable actions within a context of a game
Action
    int id
    string name
    id context_id int

-- a set of buttons that map to an action, whether it is one button or multiple
Combination
    int id
    int action_id fk
    int button_id fk

Пример использования вышеуказанной структуры:

Консоль: PS3 Игра: MAG ...

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

При нажатии ряда кнопок, например: L1 + DirectionRight, найдите эту комбинацию в разрешенных комбинациях, найдите соответствующее действие и выполните это действие.

1 голос
/ 16 октября 2010

Как насчет этого:

/* PRODUCTS: Each product has one title and runs on one gamesystem */
(PK) ProductID int
ProductTitle varchar(100)
(FK) GameSystemID int

/* GAMES: Each game has one title and belongs to one product */
(PK) GameID int
GameTitle varchar(100)
(FK) ProductID int

/* GAMESYSTEMS: Each gamesystem has one name */
(PK) GameSystemID int
GameSystemName varchar(100)

/* GAMEACTIVITIES: Each game has one or more activities (flying, running, ..) */
(PK) GameActivityID int
(FK) GameID int
GameActivityDescription VARCHAR(100)

/* BUTTONS: Each gamesystem has certain buttons with names */
(PK) ButtonID int
(FK) GameSystemID int
ButtonName VARCHAR(100)

/* GAMEACTIONS: Each game activity provides certain game actions (fly left, fly right, ..) */
(PK) ActionID int
(FK) GameActivityID int
ActionDescription VARCHAR(100)

/* BUTTONCOMBINATIONS: Each game action is associated with a certain button or combination of buttons */
(FK) ActionID int
(FK) ButtonID int
1 голос
/ 16 октября 2010

Я отведу:)


    controller [table] 
// list of controllers - Wii Mote etc.
    controller_id (int, PK) | title (varchar)

    game_buttons [table] 
// list of buttons on a controller A/B/X/Y/...
    button_id (int, PK) | title (varchar) | controller_id (int, FK)

    game [table] 
// game details - you could, if you want, differentiate the games by console here as well as they may have different titles even though they are similar in nature
    game_id (int, PK) | title (varchar)

    controls [table] 
// this is the main table that will combine the buttons with the games. combo_id is a foreign key to the control_combo table. So if you have a sequence of keys that calls for buttons A and then B, you would call in the same number for combo_id and ord table will tell us in what order they should be placed. If they're not part of a combo, you can leave the default combo_id to 0.

    game_id (int, PK) | button_id (int, FK) | title (varchar) | description (text) | combo_id (int) | ord

    control_combo [table]
// control_combo - the master table for button combos
    combo_id (int, PK) | title (varchar) | ord (tinyint)
1 голос
/ 16 октября 2010

Вы можете попробовать это для начала (РЕДАКТИРОВАТЬ: вторая попытка) :

Game
----------
(PK) GameID integer
GameTitle varchar(100)

Controller
----------
(PK) ControllerID integer
ControllerDescription varchar(100)
(FK) GameID integer

Effect
----------
(PK) EffectID integer
EffectDescription varchar(100)
(FK) ControllerID integer

Buttons
----------
(PK) ButtonID integer
ButtonKey varchar(25)
(FK) EffectID integer

Например:

GameID  GameTitle
----------------------------------------------
1       Super Mario Bros.

ControllerID ControllerDescription GameID
----------------------------------------------
1            Main Controller       1

EffectID EffectDescription ControllerID
----------------------------------------------
1        Run               1
2        Jump              1
3        Pause             1
4        Move Left         1
5        Move Right        1

ButtonID ButtonKey      EffectID
----------------------------------------------
1        B              1
2        Direction Pad  1
3        A              2
4        Start          3
5        Left Pad       4
6        Right Pad      5
...