Một số bộ điều khiển chia sẻ bố cục chung nhưng với các khuôn mặt khác nhau, tức là 360 và PS3 (X là A, tam giác là Y, v.v.). Với các thiết bị ngoại vi phụ như que chống, gậy bay, guitar, vv - chúng chỉ là những khuôn mặt khác nhau lập bản đồ cho những kỳ vọng của giao diện điều khiển. Vì các nút thường được xác định trước khi bất kỳ bộ điều khiển nào được đúc đều, bạn có thể làm như vậy.
Mỗi ánh xạ sẽ không áp dụng cho mọi bộ điều khiển, vì vậy nó có thể không lý tưởng - xem xét bộ điều khiển hiện đại, nó sẽ ổn. Nếu bạn thêm vào bộ điều khiển Intellivision và bàn phím/chuột, mọi thứ có thể bắt đầu trở nên lạ.
// 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
Lưu ý: Tôi không biết làm thế nào để bạn xử lý mọi thứ trong nội bộ. LFOOT_HOKEYPOKEY
hoặc gì đó.
Lưu ý 2: Nghiêm túc, đừng dùng char (8) ở đó. Nhận chi tiết, nhưng giữ cho nó đủ chung để áp dụng cho một kiểu bộ điều khiển chung và không phải là thương hiệu.
Bây giờ các nút cho mỗi thương hiệu của điều khiển, với tên của họ (giả định một "điều khiển" bảng):
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
Bây giờ, đối với các hành động một nút bấm (hoặc nhiều nút, hoặc một chuỗi) đại diện một trò chơi. Điều này không giải thích cho ngữ cảnh (2 & 3 của câu hỏi gốc), ví dụ: chế độ chơi trò chơi hoặc các cấu hình nút thay thế, nhưng Josh Smeaton và littlegreen đã bao phủ điều đó.
Điều này xác định hành động cho mỗi trò chơi riêng lẻ, điều này không hiệu quả lắm. Bạn có thể ngưng tụ mọi thứ một cách đáng kể bằng cách thêm một lớp chung của trò chơi "các loại". Nhiều trò chơi trong một thể loại/phối cảnh nào đó có các điều khiển chung và nó chỉ trở nên phổ biến hơn (giao diện điều khiển FPS thêm các cấu hình nút Halo và CoD được định nghĩa trước từ khi người chơi biết đến chúng). Vì vậy, nếu bạn có thể xác định một tập hợp các tác vụ phổ biến cho mỗi thể loại và chỉ sử dụng tác vụ này để ghi đè/mở rộng các giá trị mặc định đó nếu cần, bạn có thể rút ra một giải pháp sạch hơn nhiều.
Thứ nhất, xác định từng hành động:
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
Và cuối cùng, xác định các nút bấm gắn liền với mỗi hành động. Trường "thứ tự" dành cho các chuỗi kết hợp, như combo trò chơi chiến đấu - hành động đơn lẻ là thứ tự thứ 0 và chuỗi được tính từ 1, chỉ để làm cho chúng dễ phân biệt. Nó không tính đến thời gian, vì vậy bạn có thể cần một nút "không có gì" như một phần còn lại cho một số trò chơi kết hợp phức tạp hơn (Soul Calibre 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.
(Disclaimer:..! Tôi tạo ra một cơ sở dữ liệu tương tự cho một studio trò chơi Tôi làm việc tại Không khá giống nhau, nhưng đủ để tôi loại cố tình bỏ quên nhiều điều tương tự Xin lỗi Hy vọng rằng đó là đủ để kickstart một số ý tưởng mặc dù, và đó là một vấn đề thú vị.)
Đây là tất cả xung quanh một vấn đề thiết kế khá mát mẻ. :) Làm nó thanh lịch, dù sao đi nữa! – Matt
câu hỏi tuyệt vời! –