2010-10-16 40 views
9

Tôi phải tạo một mô hình lưu trữ các điều khiển trò chơi cho các trò chơi trên một số nền tảng. Tôi gặp khó khăn trong việc tìm ra cách tiếp cận đúng.Cách tạo mô hình dữ liệu phức tạp

  1. nút điều khiển khác nhau trên các hệ thống khác nhau (Wii, Xbox 360, PS3 có các nút điều khiển cụ thể của riêng mình.)
  2. Một số trò chơi thực sự là một số trò chơi đóng gói như là một; điều này có nghĩa là một sản phẩm có thể có một số điều khiển tùy thuộc vào trò chơi đang được phát.
  3. Điều khiển trò chơi cho nhiều trò chơi thay đổi tùy thuộc vào hoạt động trong trò chơi của bạn (lái xe/đi bộ/bay, v.v ...)
  4. Không đủ để lưu các chức năng của nút vì hầu hết các trò chơi đều có một số thao tác đặc biệt. các nút.

Bạn tiếp cận vấn đề này như thế nào? Thành thật mà nói, tôi không biết bắt đầu từ đâu!

Cập nhật: Rất cảm ơn mọi người vì sự đầu tư chu đáo và hữu ích của bạn. Tôi vẫn chưa chọn và trả lời bởi vì, cuối cùng, nó đã được quyết định rằng tính năng này không phải là giá trị nỗ lực. Cảm ơn nhiều lần nữa.

+1

Đâ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

+1

câu hỏi tuyệt vời! –

Trả lời

1

Bạn có thể thử điều này cho người mới bắt đầu (EDIT: thứ hai thử):

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 

Ví dụ:

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 
+0

không chắc chắn rằng các mô hình kết hợp chính ... –

+0

Hrm, điểm hợp lệ - đã không tính đến điều đó. Tôi đã thực hiện một đâm thứ hai vào nó, không chắc chắn nếu tôi hài lòng với nó hay không. – LittleBobbyTables

+0

Để cho phép kết hợp nút phức tạp, thêm nút giả gọi là "Trì hoãn" cho biết người chơi phải tạm dừng giữa các lần nhấn nút của một combo. Có thể thêm cột "Thời gian" vào bảng Nút để cho phép yêu cầu "một nút phải được giữ trong một khoảng thời gian nhất định". Thêm một cột OrderNumber vào bảng Button để cho phép các nút lệnh cần được chỉ định. Nếu các nút được nhấn cùng một lúc, hãy cho chúng cùng một số thứ tự. – ulty4life

1

tôi sẽ cung cấp này một whirl :)


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

Làm thế nào về điều này:

/* 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

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 

Một ví dụ của việc sử dụng cấu trúc trên:

Console: PS3 Trò chơi: MAG ...

hiện tại trò chơi nhà nước:
Bối cảnh: Lái xe
Hành động được phép: Hướng (chuyển tiếp, trái vv), Phanh, Khói
Kết hợp được phép : Liệt kê từng kết hợp cho mỗi hành động

Khi nhấn một loạt các nút, ví dụ: L1 + DirectionRight, tra cứu kết hợp đó trong các kết hợp được phép, tìm hành động có liên quan và thực hiện hành động đó.

2

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ị.)

1

tôi chỉ cung cấp cho nó một ý nghĩ ngắn nhưng tôi nghĩ bạn có thể sử dụng một cái gì đó như thế này (tôi là lười biếng để thêm ER 'dĩa' nhưng tài liệu tham khảo bảng trên bảng phía dưới (s)):

data model.

  • nút - là một nút trên bộ điều khiển, tôi giả sử bạn cần phải xác định những cũng có một loại, do đó bạn có thể xác định những thứ như ép, chỉ đạo, áp lực vv ...
  • consle - cửa hàng wii, xbox, ...
  • gameplay - là cấp độ của bạn và mỗi cấp có một số động thái (hoặc hành động nếu bạn thích) những hành động này sẽ thực thi một đoạn mã cuối cùng ở cấp độ trò chơi này.
  • console-di chuyển - là sự kết hợp của các nút để thực hiện một động thái nhất định trên một giao diện điều khiển cụ thể.Nếu bạn cần nhấn một tổ hợp nút trong wii và không phải trên xbox, sau đó ta có thể

bắt buộc, bạn có thể liên kết nút để an ủi

1

tôi sẽ cung cấp cho nó một thử :)

1) Bạn sẽ cần một bảng cho các hệ thống

2) Bạn sẽ cần một bảng cho các gói (có tham chiếu nullable cho cha mẹ), một bảng với các trò chơi và một bảng để liên kết trò chơi với các gói. Điều này đảm bảo rằng một trò chơi có thể là một phần của các gói khác nhau. Mặc dù vậy, nó không cho phép các gói khác nhau có các "specialversions" khác nhau của cùng một game. Nhưng đó không phải là một yêu cầu :)

3) Tôi không chắc chắn nếu điều này cũng giống như 2), nếu không muốn nói: một bảng với một tham chiếu đến một trò chơi, nếu: xem 2)

4) Bạn sẽ cần một bảng cho một hành động ("chuỗi") với một tham chiếu đến một gamepart, sau đó bạn sẽ cần một bảng cho một tổ hợp phím, với một tham chiếu đến trình tự. Cuối cùng, bạn sẽ cần một bảng cho một khóa cụ thể, với tham chiếu đến một kết hợp.

Tôi nghĩ rằng điều này sẽ bao gồm nó, mặc dù tôi có một số lo ngại về cần điều khiển, chuột ... Bạn có thể muốn tách "khóa" thành nhiều bảng để tránh nhiều cột trong bảng đó, nhưng đó là quyết định của bạn phải mất tùy thuộc vào cách bạn đang lập kế hoạch để truy cập cơ sở dữ liệu của bạn, vv

Các vấn đề liên quan