2010-10-16 15 views
9

मुझे एक मॉडल बनाना है जो कई प्लेटफ़ॉर्म पर गेम के लिए गेमप्ले नियंत्रण संग्रहीत करता है। मुझे सही दृष्टिकोण खोजने में परेशानी हो रही है।जटिल डेटा का मॉडल कैसे करें

  1. नियंत्रक बटन विभिन्न प्रणालियों पर अलग (। Wii, Xbox 360, PS3 अपनी विशिष्ट नियंत्रक बटन)
  2. कुछ खेल वास्तव में एक के रूप में पैक कई खेलों हैं; इसका मतलब यह है कि खेल के आधार पर एक एकल उत्पाद में कई नियंत्रण हो सकते हैं।
  3. कई गेम के लिए गेमप्ले नियंत्रण आपके इन-गेम गतिविधि (ड्राइविंग/पैदल/उड़ान, आदि ...)
  4. केवल बटन फ़ंक्शंस को स्टोर करने के लिए पर्याप्त नहीं है क्योंकि अधिकांश गेम में कई विशेष चाल होते हैं जिन्हें संयोजन की आवश्यकता होती है बटन के

आप इस समस्या से कैसे संपर्क करेंगे? ईमानदारी से, मुझे नहीं पता कि कहां से शुरू करना है!

अद्यतन: आपके विचारशील, और बहुत उपयोगी इनपुट के लिए सभी को बहुत धन्यवाद। मुझे अभी तक चुनना और जवाब देना है क्योंकि अंत में, यह निर्णय लिया गया था कि यह सुविधा प्रयास के लायक नहीं है। बहुत धन्यवाद फिर से।

+1

यह सब एक बहुत ही अच्छी डिजाइन समस्या के आसपास है। :) वैसे भी यह सुंदर ढंग से कर रहा है! – Matt

+1

महान सवाल! –

उत्तर

1

आप शुरुआत के लिए इस कोशिश कर सकते हैं (संपादित करें: दूसरी कोशिश):

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

सुनिश्चित नहीं है कि मॉडल कुंजी combos अच्छी तरह से ... –

+0

एचआरएम, मान्य बिंदु - इसे ध्यान में नहीं लिया था। मैंने इसमें दूसरा स्टैब लिया है, यकीन नहीं है कि मैं इससे संतुष्ट हूं या नहीं। – LittleBobbyTables

+0

जटिल बटन संयोजनों की अनुमति देने के लिए, "देरी" नामक एक नकली बटन जोड़ें जो इंगित करता है कि खिलाड़ी को कॉम्बो के बटन प्रेस के बीच रोकना चाहिए। हो सकता है कि बटन तालिका में "टाइम" कॉलम जोड़ें, "एक निश्चित अवधि के लिए एक बटन होना चाहिए" आवश्यकता के लिए अनुमति दें। आदेश बटन को निर्दिष्ट करने के लिए दबाए जाने के लिए बटन तालिका में ऑर्डर नम्बर कॉलम जोड़ें। यदि बटन एक ही समय में दबाए जाते हैं, तो उन्हें एक ही ऑर्डर नंबर दें। – ulty4life

1

मैं इस एक बार आज़माएंगे :)


दे देंगे
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

कैसे इस बारे में:

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

ऊपर संरचना का उपयोग का एक उदाहरण:

कंसोल: PS3 खेल: MAG ...

वर्तमान खेल राज्य:
प्रसंग: ड्राइविंग
स्वीकृत क्रियाएं: दिशा-निर्देश (आगे, बाएं इत्यादि), ब्रेक, धुआं
अनुमत संयोजन : प्रत्येक कार्रवाई के लिए प्रत्येक संयोजन की सूची

जब बटनों की एक श्रृंखला दबाई जाती है, उदाहरण के लिए: L1 + DirectionRight, अनुमत संयोजनों में उस संयोजन को देखें, प्रासंगिक कार्रवाई ढूंढें, और उस क्रिया को निष्पादित करें।

2

कुछ नियंत्रक आम लेआउट साझा करते हैं लेकिन विभिन्न चेहरों के साथ, यानी 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. 

(अस्वीकरण:।।! मैं एक खेल स्टूडियो मैं में काम के लिए एक समान डेटाबेस बनाया नहीं काफी एक ही है, लेकिन पर्याप्त है कि मैं एक तरह से जानबूझकर बाहर एक बहुत जा रहा हूँ समान क्षमा उम्मीद है कि कि किकस्टार्ट करने के लिए काफी है हालांकि कुछ विचार, और यह एक मजेदार समस्या है।)

1

मैं इसे केवल एक छोटा सा विचार देता हूं लेकिन मुझे लगता है कि आप इस तरह कुछ उपयोग कर सकते हैं (मैं ईआर 'फोर्क जोड़ने के लिए आलसी था लेकिन शीर्ष तालिका संदर्भ नीचे तालिका)):

data model

  • बटन - एक नियंत्रक पर एक बटन है, मुझे लगता है कि आप एक प्रकार से ये भी पहचान करने के लिए ताकि आप दबाया, दिशा, दबाव आदि जैसी चीजों की पहचान कर सकता है की जरूरत है ...
  • consle - स्टोर wii, xbox, ...
  • गेमप्ले - यह स्तर आपके स्तर पर है और प्रत्येक स्तर में कई चाल हैं (या यदि आप चाहें तो क्रियाएं) इन क्रियाओं को कुछ करने के लिए अंत में कोड का एक टुकड़ा निष्पादित करना चाहिए इस खेल स्तर में।
  • कंसोल-चाल - विशिष्ट कंसोल पर एक निश्चित कदम निष्पादित करने के लिए बटनों का संयोजन है।आप wii में एक बटन संयोजन प्रेस करने की जरूरत है और न xbox पर है, तो संभव

वैकल्पिक रूप से आप लिंक कर सकते हैं होना चाहिए सांत्वना देने बटन

1

मैं इसे एक कोशिश :)

दे देंगे

1) आपको सिस्टम

2) के लिए एक टेबल की आवश्यकता होगी) आपको पैकेज के लिए एक तालिका (माता-पिता के लिए एक संक्षिप्त संदर्भ के साथ), एक टेबल के साथ एक टेबल और पैकेज के साथ गेम जोड़ने के लिए एक टेबल की आवश्यकता होगी। यह सुनिश्चित करता है कि एक गेम विभिन्न पैकेजों का हिस्सा हो सकता है। यह अलग-अलग पैकेजों को एक ही गेम के अलग-अलग "विशेष" होने की इजाजत नहीं दे रहा है। लेकिन यह एक आवश्यकता :)

3 नहीं था) मुझे यकीन है कि अगर यह) 2 के रूप में ही है, अगर नहीं है नहीं कर रहा हूँ: एक खेल के लिए एक संदर्भ के साथ एक मेज, अगर: 2 देखें)

4) आपको गेमपार्ट के संदर्भ के साथ एक क्रिया ("अनुक्रम") के लिए एक टेबल की आवश्यकता होगी, फिर आपको अनुक्रम के संदर्भ के साथ एक कुंजी संयोजन के लिए एक तालिका की आवश्यकता होगी। अंत में, संयोजन के संदर्भ के साथ, आपको किसी विशेष कुंजी के लिए एक तालिका की आवश्यकता होगी।

मुझे लगता है कि यह इसे कवर करेगा, हालांकि मुझे जॉयस्टिक, माउस इत्यादि के बारे में कुछ चिंताएं हैं। आप उस तालिका में कई स्तंभों से बचने के लिए "कुंजी" -टेबल को कई तालिकाओं में विभाजित करना चाहेंगे, लेकिन यह एक निर्णय है इस पर निर्भर होना है कि आप अपने डेटाबेस आदि तक पहुंचने की योजना बना रहे हैं।

संबंधित मुद्दे