ฉันจะสร้างอนุภาคที่ตอบสนองต่อผู้เล่นและศัตรูได้อย่างไร


38

ขณะนี้ฉันกำลังสร้างเกมด้วยเอ็นจิ้นเกมของฉันซึ่งฉันเขียนด้วย C ++ และฉันใช้ directx SDK ล่าสุด

เกมดังกล่าวเป็นเกมยิงอวกาศจากบนลงล่าง (ด้วยการหมุนที่น่าสนใจมาก) และฉันกำลังมองหาเนบิวลาเอฟเฟกต์ที่ผู้เล่นจะต้องบินผ่าน ฉันอยากลองทำเล็บที่สัมผัสได้ดีกับอนุภาคหลายร้อยชิ้นที่เคลื่อนตัวออกจากทางของผู้เล่นขณะที่มันแล่นเข้าหาพวกมัน ค่อนข้างคล้ายกับว่าอนุภาคเคลื่อนที่ผ่านวิถีของผู้เล่นใน Geomtry Wars บน XBLA อย่างไร

ฉันเป็นโปรแกรมเมอร์ที่มีประสบการณ์เมื่อพูดถึง C ++ อย่างไรก็ตามฉันไม่รู้ว่าจะเริ่มใช้เอฟเฟกต์นี้ได้อย่างไร ใครบ้างมีความคิดเจ๋ง ๆ หรือตัวเลือกการออกแบบที่ฉันอาจต้องการดู? อย่าลังเลที่จะตอบระดับความลึกที่คุณต้องการ

คำตอบ:


65

มันเป็นความคิดที่ยอดเยี่ยม คุณต้องการการไล่ระดับสีแบบกระจายรอบเรือของคุณ มีสามแบบจำลองทางกายภาพที่ฉันสามารถนึกได้ว่าคุณอาจต้องการ:

  1. คุณต้องการให้มันดูเหมือนว่าเป็นสื่อกลางของเหลวที่ซึ่งการไล่ระดับสีของความกดดันเกิดขึ้นเช่นเมื่อคุณผ่านอนุภาคบางอย่างที่พวกมันเคลื่อนที่กลับเข้าสู่การปลุกของคุณ (เช่นน้ำหลังเรือ) ในตัวอย่างนี้ตำแหน่งของอนุภาคนั้นสมบูรณ์และเป็นเพียงความสัมพันธ์ของพวกเขากับผู้เล่นซึ่งปรับเปลี่ยนตำแหน่งการแสดงผลชั่วคราว นี่เป็นเหมือนเมื่อคุณผ่านแว่นขยายหนาเหนือสิ่งต่าง ๆ และการเลี้ยวเบนดูเหมือนจะทำให้มันเคลื่อนที่ - แต่จนกว่าคุณจะขยับกระจกออกไป ในกรณีนี้เรือของคุณเป็นแก้ว

  2. หากคุณต้องการให้พวกเขาย้ายออกจากเรือและดำเนินการต่อเมื่อพวกเขาย้าย นี่เป็นเหมือนฟิสิกส์มาตรฐานในพื้นที่ว่างเปล่าโดยทั่วไปซึ่งไม่มีการไล่ระดับความดัน (หรือเล็กมาก)

  3. คุณต้องการย้ายอนุภาคออกไปจากเรืออย่างรวดเร็วในขณะที่เข้าใกล้เช่นใน (1) และ (2) แต่เมื่อเรือหายไปอนุภาคจะค่อยๆปรับสมดุลตัวเองอย่างช้าๆ

ร่วมกันแก้ปัญหาทั้งสาม : คุณต้องมีฟิลด์การแพร่ที่เคลื่อนที่ด้วยเรือของคุณ ในตัวอย่างนี้เราจะทำให้มันเป็นวงกลม จากนั้นคุณตรวจจับเวกเตอร์, เรียกมันว่า v1, ระหว่างเรือและแต่ละอนุภาคภายในภูมิภาคนั้น ผลักอนุภาคของคุณออกไปตามเวกเตอร์นั้น วิธีการขอคุณจะผลักดันมันออกไปจะขึ้นอยู่กับระยะทางของมันจากเรือ: 1 - v1.magnitudeใช้งาน สูตรนี้จะให้ความแข็งแรงเชิงเส้นแก่คุณอย่างไรก็ตามคุณสามารถปรับเปลี่ยนให้ใช้อย่างอื่นเช่นเส้นโค้งความแข็งแรงแบบวงกลมที่ลดความแข็งแรงลงทางขอบ นี่จะทำให้มันดูราวกับว่ามันเป็นทรงกลมมากกว่าการไล่ระดับแรงดันแบบวงกลมรอบ ๆ เรือ

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

สำหรับโซลูชันที่ 2 : แทนที่จะใช้ v1 กับตำแหน่งมุมมองให้ใช้มันในการอัพเดทแบบลอจิกแต่ละครั้งกับตำแหน่งของอนุภาค p1.position += v1ดังนั้น ดังนั้นคุณกำลังใช้แรงเร่งกับอนุภาคซึ่งแปลเป็นความเร็ว อาจเป็นไปได้ว่าคุณต้องการให้ความเร็วของแต่ละอนุภาคลดลงเพื่อที่พวกเขาจะชะลอความเร็วลงและหยุดชะงักเมื่อคุณผ่านไปแล้ว คุณสามารถดูว่าวิธีการแก้ปัญหานี้จะส่งผลให้เกิดอนุภาคกระจุกตัวในเนบิวลาของคุณเพราะพวกเขาจะไม่เคย rediffuse ไม่เหมือนจริงมากฉันแน่ใจว่าเนื่องจากเนบิวลามีแรงกดดันในการไล่ระดับสีภายในพวกเขาไม่ว่าในความเป็นจริงจะอ่อนแอแค่ไหน

สำหรับวิธีแก้ปัญหา 3: เหมือนกับ (2) แต่ในกรณีนี้คุณจะต้อง rediffuse อนุภาคของคุณ ในการทำเช่นนี้ได้ง่าย ๆ เป็นวิธีการที่ดุร้าย แต่เนื่องจากสิ่งเหล่านี้เป็นเพียงอนุภาคและทำให้ลูกตาคุณอาจไม่จำเป็นต้องครอบคลุมพื้นที่ขนาดใหญ่ที่น่าสนใจ (อาจเป็นเพียงรัศมีของผู้เล่นตำแหน่ง + maxPlayerSpeedPerTick หรืออะไรก็ตาม พื้นที่สี่เหลี่ยมล้อมรอบเพื่อวัตถุประสงค์เชิงตรรกะ) แต่ละอนุภาคจะใช้แรงกับอนุภาคอื่น ๆ ในพื้นที่ที่น่าสนใจ พวกเขาจะใช้กองกำลังตามระยะทางของพวกเขาจากกันอีกครั้ง คำนวณกองกำลัง interparticle ทั้งหมดในการกวาดครั้งเดียวข้ามบริเวณที่สนใจแล้วใช้แรงทั้งหมดในการกวาดครั้งเดียว สุดท้ายตรวจสอบให้แน่ใจว่าคุณทำการประมวลผลแรงระหว่างอนุภาคกับอนุภาคที่ไม่มีความเร็วเท่านั้น และเมื่อใดก็ตามที่มีอนุภาคถึงความเร็วขั้นต่ำ

มีสูตรการแพร่กระจายทุกชนิด ฯลฯ มี แต่ฉันคิดว่าในกรณีนี้วิธีแก้ปัญหาง่าย ๆ ทำงานได้ดีที่สุด


Mate โชคไม่ดีที่ตอนนี้ฉันไม่มีชื่อเสียงที่จะยกเลิกคำตอบของคุณ (และฉันสามารถทำได้เพียงครั้งเดียวเท่านั้นซึ่งน้อยกว่าที่ควรจะเป็น) คุณตอกย้ำสิ่งที่ฉันกำลังมองหาในการแก้ปัญหาครั้งแรกของคุณ คำตอบที่ยอดเยี่ยม อย่างสุจริต ขอบคุณ!
Matt McDonald

ความสุขโดยรวมแมตต์เป็นคำถามที่ดีคุ้มค่าที่จะงอสมอง
วิศวกร

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