कुछ नियंत्रक आम लेआउट साझा करते हैं लेकिन विभिन्न चेहरों के साथ, यानी 360 और पीएस 3 (एक्स ए, त्रिभुज वाई है, आदि)। अतिरिक्त छिद्रों जैसे कि लड़ाई की छड़ें, फ्लाइट स्टिक्स, गिटार इत्यादि के साथ - वे कंसोल की अपेक्षाओं के साथ-साथ मैपिंग के अलग-अलग चेहरे भी हैं। चूंकि बटन को आमतौर पर किसी भी नियंत्रक को ढाला जाने से पहले परिभाषित किया जाता है, इसलिए आप वही कर सकते हैं।
प्रत्येक मैपिंग सभी नियंत्रक पर लागू नहीं होगा, इसलिए यह आदर्श नहीं हो सकता है - आधुनिक कंसोल नियंत्रकों पर विचार करना, यह ठीक होना चाहिए। यदि आप इंटेलिविजन नियंत्रकों और कीबोर्ड/माउस में जोड़ते हैं, तो चीजें अजीब हो सकती हैं।
// 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: गंभीरता से, एक char (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), उदा। खेल मोड या वैकल्पिक बटन विन्यास, लेकिन जोश Smeaton और littlegreen पहले से ही कवर किया गया है।
यह प्रत्येक व्यक्तिगत गेम के प्रति क्रियाओं को परिभाषित करता है, जो बहुत ही कुशल नहीं है। आप "प्रकार" की सामान्य परत जोड़कर चीजों को महत्वपूर्ण रूप से संयोजित करने में सक्षम हो सकते हैं। एक निश्चित शैली/परिप्रेक्ष्य के भीतर कई गेमों में सामान्य नियंत्रण होते हैं, और यह केवल अधिक आम हो रहा है (कंसोल एफपीएस पूर्वनिर्धारित हेलो और कोड-स्टाइल बटन कॉन्फ़िगरेशन जोड़ते हैं क्योंकि खिलाड़ी उन्हें जानते हैं, और ऐसे)। इसलिए, यदि आप प्रत्येक शैली के लिए सामान्य कार्यों का एक सेट परिभाषित कर सकते हैं और केवल आवश्यकतानुसार उन डिफ़ॉल्टों को ओवरराइड/विस्तारित करने के लिए इसका उपयोग कर सकते हैं, तो आप एक अधिक क्लीनर समाधान को खींचने में सक्षम हो सकते हैं। ,
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
और अंत में प्रत्येक कार्य के साथ जुड़े बटन प्रेस को परिभाषित:
सबसे पहले, प्रत्येक कार्य को परिभाषित करते। "Ordinal" फ़ील्ड कॉम्बो अनुक्रमों के लिए है, जैसे गेम कंमोस से लड़ना - एकल क्रियाएं 0 वें क्रमशः हैं और अनुक्रम 1 से गिनती हैं, बस उन्हें अलग करने में आसान बनाने के लिए। यह समय के लिए जिम्मेदार नहीं है, इसलिए आपको कुछ जटिल कॉम्बो गेम्स (आत्मा कैलिबर एट अल) के लिए आराम के रूप में "कुछ भी नहीं" बटन की आवश्यकता हो सकती है।
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.
(अस्वीकरण:।।! मैं एक खेल स्टूडियो मैं में काम के लिए एक समान डेटाबेस बनाया नहीं काफी एक ही है, लेकिन पर्याप्त है कि मैं एक तरह से जानबूझकर बाहर एक बहुत जा रहा हूँ समान क्षमा उम्मीद है कि कि किकस्टार्ट करने के लिए काफी है हालांकि कुछ विचार, और यह एक मजेदार समस्या है।)
यह सब एक बहुत ही अच्छी डिजाइन समस्या के आसपास है। :) वैसे भी यह सुंदर ढंग से कर रहा है! – Matt
महान सवाल! –