จางหายไปในเกมที่เก่ากว่า ต้องการความช่วยเหลือในการหาวิธีที่อัลกอริทึมได้รับมา


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 แม้ว่าค่าลบเริ่มต้นจะแตกต่างกันสำหรับแต่ละองค์ประกอบสี โปรดทราบว่าองค์ประกอบแต่ละสีมีค่าเป็น 0 (นั่นคือดำ) ซึ่งมีความแตกต่างของ 8 หรือ 9 ไม่ใช่ส่วนที่เหลือโดยพลการ ซึ่งหมายความว่าวงจรค่าลบที่ 8,8,8,9 จะไม่แตก! (อัลกอริทึมนี้อาจถูกเขียนขึ้นเพื่อให้แน่ใจว่าเฟรมสุดท้ายของเฟดนั้นเรียบเนียนกว่าเฟรมอื่น ๆ )

ตอนนี้จิ๊กซอว์ฉัน ตามการคำนวณของฉันหากคุณย้อนกลับกระบวนการนั่นคือใช้วงจร 8,8,8,9 และสรุปผลรวมเพื่อหาชุดค่าผสมที่เป็นไปได้ทั้งหมดใน 29 เฟรม - คุณจะได้รับ 52 หมายเลขที่ไม่ซ้ำกัน แต่อย่างที่เกิดขึ้นส่วนประกอบแต่ละสีเป็นสมาชิกของชุดนี้! ซึ่งหมายความว่าสีจะถูกเลือกโดยเฉพาะสำหรับอัลกอริทึมเฟดนี้ (ไม่น่าเป็นไปได้) หรืออัลกอริธึมเฟดได้รับการออกแบบรอบจานสีของเกม แต่บนโลกนี้มีใครคิดได้อย่างไรว่าถ้าคุณใช้ 8,8,8,9 เลื่อนวงจรอย่างเหมาะสมและลบตัวเลขจากองค์ประกอบแต่ละสีในจานสีของคุณในที่สุดคุณจะถึง 0 สำหรับทุก ๆ สี? ! มีเคล็ดลับทางคณิตศาสตร์ที่ฉันขาดหายไป มันคืออะไร?


2
ทำไมไม่ลองเล่นกับอัลฟ่าล่ะ? นั่นเป็นวิธีที่ฉันทำเพื่ออนิเมชั่นจางหาย
DogDog

ฉันไม่ได้พยายามที่จะทำซ้ำอัลกอริทึมในรหัสของฉันเองเพียงแค่พยายามที่จะหาวิธีที่มันได้มา
Archagon

ฉันรู้สึกว่ามันเป็นสิ่งที่คุณพูดสีถูกเลือกตามลำดับ 8,8,8,9 ด้วยลำดับนั้นพวกเขาสามารถเลือกจาก 52 * 52 * 52 สี บันทึกที่น่าสนใจหากคุณเริ่มต้นที่ 0 และเพิ่มลำดับ 8,8,8,9 คุณจะได้รับ 255 ซึ่งช่วยให้พวกเขาใช้ขาวดำ
Luis Estrada

@Apoc: สไตล์ของการจางหายไปอย่างเห็นได้ชัดแตกต่างจากอัลฟาจาง มาดูกันว่าค่าสีแต่ละค่าลดลงตามจำนวนที่กำหนด (รูปแบบตัวเลข) แทนที่จะเป็นเปอร์เซ็นต์ของค่าเริ่มต้นหรือไม่ ซึ่งหมายความว่ามีสถานการณ์ที่คุณอาจต้องการใช้มากกว่าวิธีการทั่วไป ตัวอย่างสไตล์เรโทร
AlbeyAmakiir

คำตอบ:


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) และผลลัพธ์ระดับกลางจะทำสิ่งที่มีสติเช่น 10,000 -> 10,000100 (16 -> 132)

ชุดตัวเลขนี้เป็นสิ่งที่คุณมี รับองค์ประกอบสีแดงของตัวอย่างแรกของคุณคุณมี:

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

สังเกตว่าบิตต่ำสามบิตจะเท่ากับสามบิตแรกเสมออย่างไร ความแตกต่างของ 9 เกิดขึ้นเมื่อทั้งบิต 0 และบิต 3 พลิกในเวลาเดียวกัน

ฉันไม่แน่ใจว่าทำไมระดับความเข้ม 5 บิตจะถูกใช้ในสถานการณ์นี้ บางทีนั่นอาจเป็นขีด จำกัด ของฮาร์ดแวร์ของเครื่องอาร์เคด? เป็นที่น่าสังเกตว่าค่า RGB 5 บิตคือ 15 บิตซึ่งเข้ากันได้ดีกับคำ 16 บิต ไม่ว่าในกรณีใดนั้นจะอธิบายรูปแบบ 8-8-8-9 ที่แปลก


1
16 บิตต่อพิกเซลเรียกว่า 'High Color' (นั่นคือทั้งหมดที่ฉันจำได้) en.wikipedia.org/wiki/High_color
ชักเยื้อ

1
หลังจากการเดินทางอย่างรวดเร็วผ่านวิกิพีเดีย, เซก้าแซทเทิร์น ( en.wikipedia.org/wiki/Sega_Saturn#Video ) กล่าวถึงโหมดการแสดงผลสี 15 บิตเช่นเดียวกับเกมบอยแอดวานซ์ ( en.wikipedia.org/wiki/Game_Boy_Advance )
tugs

1
นั่นยอดเยี่ยม! ทุกอย่างสมเหตุสมผลแล้ว ขอบคุณ!
Archagon

เกมดังกล่าวจะต้องมีสี 16 บิตและศิลปินอาจต้องการที่จะบีบสีมากขึ้นจากเกมของพวกเขาด้วยค่าใช้จ่ายของความโปร่งใสทำให้มีรูปแบบสี RGBA 5551
Archagon

0

คุณควรดูในโหมด 13h หรือ 256 palette color fading เมื่อก่อนคุณมีหลายสีและสิ่งที่คุณทำไปยุ่งกับจานสีทั้งหมดเนื่องจากคุณไม่สามารถคำนวณสีใหม่ที่ไม่ได้อยู่ในนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.