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