पुराने खेलों में फीका। एल्गोरिथ्म कैसे प्राप्त किया गया था, यह पता लगाने में कुछ मदद चाहिए


12

क्षमा करें, यह प्रश्न थोड़ा गूढ़ है, लेकिन मैं इसे अपने सिर से नहीं निकाल सकता!

मैं आर्केड गेम DoDonPachi (साथ ही कई अन्य पुराने खेलों) में उपयोग किए जाने वाले फीका एल्गोरिदम को देख रहा हूं:

यहाँ छवि विवरण दर्ज करें

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

Starting Value: (132, 66, 189)
Frame 1:    [9, 9, 8]
Frame 2:    [8, 8, 8]
Frame 3:    [8, 8, 8]
Frame 4:    [8, 8, 9]
Frame 5:    [9, 9, 8]
Frame 6:    [8, 8, 8]
Frame 7:    [8, 8, 8]
Frame 8:    [8, 8, 9]
Frame 9:    [9, 0, 8]
Frame 10:   [8, 0, 8]
Frame 11:   [8, 0, 8]
Frame 12:   [8, 0, 9]
Frame 13:   [9, 0, 8]
Frame 14:   [8, 0, 8]
Frame 15:   [8, 0, 8]
Frame 16:   [8, 0, 9]
Frame 17:   [0, 0, 8]
Frame 18:   [0, 0, 8]
Frame 19:   [0, 0, 8]
Frame 20:   [0, 0, 9]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 8]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 0]
Frame 25:   [0, 0, 0]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (132, 0, 0)
Frame 1:    [9, 0, 0]
Frame 2:    [8, 0, 0]
Frame 3:    [8, 0, 0]
Frame 4:    [8, 0, 0]
Frame 5:    [9, 0, 0]
Frame 6:    [8, 0, 0]
Frame 7:    [8, 0, 0]
Frame 8:    [8, 0, 0]
Frame 9:    [9, 0, 0]
Frame 10:   [8, 0, 0]
Frame 11:   [8, 0, 0]
Frame 12:   [8, 0, 0]
Frame 13:   [9, 0, 0]
Frame 14:   [8, 0, 0]
Frame 15:   [8, 0, 0]
Frame 16:   [8, 0, 0]
Frame 17:   [0, 0, 0]
Frame 18:   [0, 0, 0]
Frame 19:   [0, 0, 0]
Frame 20:   [0, 0, 0]
Frame 21:   [0, 0, 0]
Frame 22:   [0, 0, 0]
Frame 23:   [0, 0, 0]
Frame 24:   [0, 0, 0]
Frame 25:   [0, 0, 0]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (165, 156, 222)
Frame 1:    [9, 8, 8]
Frame 2:    [8, 8, 8]
Frame 3:    [8, 8, 8]
Frame 4:    [8, 9, 9]
Frame 5:    [9, 8, 8]
Frame 6:    [8, 8, 8]
Frame 7:    [8, 8, 8]
Frame 8:    [8, 9, 9]
Frame 9:    [9, 8, 8]
Frame 10:   [8, 8, 8]
Frame 11:   [8, 8, 8]
Frame 12:   [8, 9, 9]
Frame 13:   [9, 8, 8]
Frame 14:   [8, 8, 8]
Frame 15:   [8, 8, 8]
Frame 16:   [8, 9, 9]
Frame 17:   [9, 8, 8]
Frame 18:   [8, 8, 8]
Frame 19:   [8, 8, 8]
Frame 20:   [8, 0, 9]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 8]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 9]
Frame 25:   [0, 0, 8]
Frame 26:   [0, 0, 8]
Frame 27:   [0, 0, 8]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

Starting Value: (156, 90, 206)
Frame 1:    [8, 8, 8]
Frame 2:    [8, 8, 9]
Frame 3:    [8, 8, 8]
Frame 4:    [9, 9, 8]
Frame 5:    [8, 8, 8]
Frame 6:    [8, 8, 9]
Frame 7:    [8, 8, 8]
Frame 8:    [9, 9, 8]
Frame 9:    [8, 8, 8]
Frame 10:   [8, 8, 9]
Frame 11:   [8, 8, 8]
Frame 12:   [9, 0, 8]
Frame 13:   [8, 0, 8]
Frame 14:   [8, 0, 9]
Frame 15:   [8, 0, 8]
Frame 16:   [9, 0, 8]
Frame 17:   [8, 0, 8]
Frame 18:   [8, 0, 9]
Frame 19:   [8, 0, 8]
Frame 20:   [0, 0, 8]
Frame 21:   [0, 0, 8]
Frame 22:   [0, 0, 9]
Frame 23:   [0, 0, 8]
Frame 24:   [0, 0, 8]
Frame 25:   [0, 0, 8]
Frame 26:   [0, 0, 0]
Frame 27:   [0, 0, 0]
Frame 28:   [0, 0, 0]
Frame 29:   [0, 0, 0]

जैसा कि आप देख सकते हैं, प्रत्येक फ्रेम में प्रत्येक रंग घटक से 8 या 9 घटाया जाता है। इसके अलावा, एक 9 हमेशा 8 के बाद तीन फ्रेम दिखाई देता है, भले ही शुरुआती घटाया गया मूल्य प्रत्येक रंग घटक के लिए अलग हो। यह भी ध्यान दें कि प्रत्येक रंग घटक 8 या 9 के अंतर के साथ 0 (यानी, काला) तक पहुंचता है, न कि कुछ मनमाना शेष। इसका मतलब यह है कि 8,8,8,9 का घटाया गया मूल्य चक्र कभी टूटा नहीं है! (यह एल्गोरिथ्म शायद यह सुनिश्चित करने के लिए लिखा गया था कि फीका का आखिरी फ्रेम दूसरों की तरह चिकना था।)

अब, यह पहेली मुझे। मेरी गणना के अनुसार, यदि आप प्रक्रिया को उल्टा करते हैं - अर्थात, 8,8,8,9 चक्र लें और इसे 29 फ्रेम में सभी संभावित संयोजनों को खोजने के लिए योग करें - आपको केवल 52 अद्वितीय नंबर मिलते हैं। लेकिन जैसा कि ऐसा होता है, प्रत्येक रंग घटक इस सेट का एक सदस्य है! इसका मतलब यह है कि या तो रंग विशेष रूप से इस फीके एल्गोरिथ्म (अप्रभावित) के लिए चुने गए थे, या यह कि फीका एल्गोरिदम को गेम के कलर पैलेट के आसपास डिजाइन किया गया था। लेकिन पृथ्वी पर कोई कैसे पता लगा सकता है कि यदि आप 8,8,8,9 लेते हैं, तो चक्र को उचित रूप से स्थानांतरित करें, और अपने पैलेट में प्रत्येक रंग घटक से संख्याओं को घटाते रहें, आप अंततः हर एक रंग के लिए 0 तक पहुंच जाएंगे। ! वहाँ कुछ गणितीय चाल है कि मैं याद आ रही है होना चाहिए। यह क्या है?


2
सिर्फ अल्फा के साथ क्यों नहीं खेलते? इसी तरह मैं फीका-इन / आउट एनिमेशन के लिए करता हूं।
डॉगडॉग

मैं अपने कोड में एल्गोरिथ्म को दोहराने की कोशिश नहीं कर रहा हूं, बस यह पता लगाने की कोशिश कर रहा हूं कि यह कैसे प्राप्त किया गया था।
अर्चागन

मुझे ऐसा लगता है कि जैसा आपने कहा था, रंगों को अनुक्रम 8,8,8,9 के आधार पर चुना गया था। उस क्रम को देखते हुए वे 52 * 52 * 52 रंगों में से चुन पाए। एक दिलचस्प नोट, यदि आप 0 से शुरू करते हैं और अनुक्रम 8,8,8,9 जोड़ते हैं, तो आपको 255 मिलेंगे। जो उन्हें काले और सफेद का उपयोग करने की अनुमति देता है।
लुइस एस्ट्राडा

@ ऑपोक: फीका-आउट की शैली अल्फा फीके से भिन्न होती है। देखें कि प्रत्येक रंग का मूल्य प्रारंभिक मूल्य के बजाय एक निश्चित संख्या (संख्या पैटर्न) से नीचे कैसे जाता है? इसका मतलब है कि ऐसी परिस्थितियां हैं जिनमें आप इसे अधिक सामान्य तरीकों पर उपयोग करना पसंद कर सकते हैं। उदाहरण के लिए रेट्रो शैली।
अल्बेअमकीर

जवाबों:


20

दरअसल, 8-8-8-9 पैटर्न के पीछे एक सरल तर्क है। यह स्वाभाविक रूप से उत्पन्न होता है यदि आप केवल 32 तीव्रता के स्तर (प्रति घटक 5 बिट) का उपयोग करते हैं, लेकिन 8-प्रति-घटक प्रदर्शन पर यह रेंडर करना चाहते हैं।

विचार करें कि क्या आपके पास 5-बिट की तीव्रता का स्तर है और इसे 8 बिट तक विस्तारित करना चाहते हैं। सबसे सरल बात यह है कि सिर्फ तीन-बिट्स को शिफ्ट-लेफ्ट किया जाए और कम तीन बिट्स को शून्य रखा जाए। मुसीबत तो यह है कि यह शुद्ध सफेद करने के लिए सभी तरह से नहीं जाता है। उच्चतम तीव्रता का स्तर आप 11111000 या 248 तक पहुंच सकते हैं। इसलिए आप 8-बिट डिस्प्ले की पूर्ण तीव्रता सीमा का उपयोग नहीं कर रहे हैं।

वास्तव में, आप जो करना चाहते हैं, वह एक गणना है intensity8 = round(intensity5 * 255.0 / 31.0), जैसे [0, 31] की सीमा [0, 255] तक। हालांकि, बिना किसी फ्लोटिंग-पॉइंट गणित या विभाजन के इसे पूरा करने के लिए एक साफ चाल है: निम्न तीन बिट्स को उच्च तीन बिट्स के बराबर सेट करें। यही है, तीव्रता को 5-बिट से 8-बिट में परिवर्तित करने के लिए जो आप करेंगे

intensity8 = (intensity5 << 3) | (intensity5 >> 2);

फिर 11111 की तीव्रता 11111111 (31 नक्शे से 255) तक जाएगी, और मध्यवर्ती परिणाम कुछ समझदार होंगे, जैसे 10000 -> 10000100 (16 -> 132)।

संख्याओं का यह सेट वास्तव में आपके पास है। आपके पहले उदाहरण के लाल घटक को लेते हुए, आपके पास:

132    10000100
123    01111011
115    01110011
107    01101011
 99    01100011
 90    01011010
 82    01010010
 74    01001010

ध्यान दें कि निम्न तीन बिट्स हमेशा शीर्ष तीन बिट्स के बराबर कैसे होते हैं। 9 का अंतर तब होता है जब बिट 0 और बिट 3 एक ही समय में फ्लिप होते हैं।

मैं अनिश्चित हूं कि इस स्थिति में 5-बिट इंटेंसिटी लेवल का उपयोग क्यों किया गया होगा; शायद यह आर्केड मशीन के हार्डवेयर की सीमा थी? यह उल्लेखनीय है कि 5-बिट आरजीबी मूल्य 15 बिट्स है, जो एक 16-बिट शब्द में अच्छी तरह से फिट बैठता है। किसी भी मामले में, यह अजीब 8-8-8-9 पैटर्न की व्याख्या करता है।


1
16 बिट प्रति पिक्सेल को 'हाई कलर' कहा जाता था। (यह सब मुझे इसके बारे में याद है) en.wikipedia.org/wiki/High_color
tugs

1
विकिपीडिया के माध्यम से एक त्वरित यात्रा के बाद, Sega Saturn ( en.wikipedia.org/wiki/Sega_Saturn#Video ) 15-बिट रंग प्रदर्शन मोड का उल्लेख करता है, साथ ही गेमबाय एडवांस ( enwikipedia.org/wiki/Game_Boy_Advance )
tugs

1
ये तो बहुत खूब है! अब सब समझ आ रहा है। धन्यवाद!
अर्चागन

खेल में 16-बिट रंग होना चाहिए था, और कलाकार शायद पारदर्शिता की कीमत पर अपने खेल से अधिक रंग निचोड़ना चाहते थे, आरजीबीए 5551 रंग योजना।
अर्चागन

0

आपको मोड 13h, या 256 रंग पैलेट लुप्त होती में देखना चाहिए। इसके बाद, आपके पास कई रंग थे और आपने जो किया, वह पूरे पैलेट के साथ खिलवाड़ कर रहा था, क्योंकि आप नए रंगों की गणना नहीं कर सकते थे जो इसमें नहीं थे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.