มุมของการสะท้อน


11

ฉันมีเกมนี้

ฉันมีปืนใหญ่ที่กึ่งกลางบล็อกรอบปืนใหญ่และแผ่นรองรอบบล็อก นี่คือลักษณะของเกม:

เกมฝ่าวงล้อมวงกลม

ฉันจัดการเพื่อให้ได้การชนกันของแต่ละพิกเซลและลูกบอลของฉัน " สะท้อน " เมื่อสัมผัสกับบล็อคด้วยคณิตศาสตร์ต่อไปนี้:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

รูปภาพแสดงมุมของการคำนวณการสะท้อนกลับ

โดยที่เส้นสีฟ้าคือทิศทางของลูกบอลและเส้นสีดำ (เส้นฐาน) คือพื้นผิวบล็อก

Directionเป็นมุมที่แสดงเป็นเรเดียน (ซึ่งสามารถแปลงเป็นองศาได้)
ลูกบอลถูกย้ายโดย:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

จนถึงตอนนี้ดีมาก

ปัญหาของฉันมาถึงตอนนี้โดยใช้แผ่นอิเล็กโทรนิกส์ (3 บล็อกที่มีขนาดใหญ่และมืดรอบ ๆ บล็อกสีขนาดเล็ก)

ในขณะที่พวกเขาหมุนมุมผิวจะเปลี่ยนไป
ยิ่งไปกว่านั้นลูกบอลควรตีที่ด้านข้างด้วยดังนั้นฉันจะวัดทิศทางของการตีและทิศทางการเคลื่อนที่ของลูกบอลได้อย่างไร

ป.ล. : ถ้าจำเป็นฉันสามารถจัดหารหัสและ swf ที่เล่นได้


แก้ไข

ตกลงปัญหาเกี่ยวกับมุมได้รับการแก้ไขด้วยเวกเตอร์แต่ฉันยังคงมีปัญหากับการชนด้านข้างและด้านหลัง

ฉันจะเปิดคำถามอื่นสำหรับสิ่งนั้นและเชื่อมโยงที่นี่


3
หากคุณเชื่อมโยงบัญชีของคุณอีกครั้งคุณควรได้รับ +100 โบนัสชื่อเสียง ควรเป็นตัวเลือกในแท็บบัญชีของคุณในโปรไฟล์ อย่างไรก็ตามในระหว่างนี้ฉันจะโพสต์ภาพเหล่านั้นให้คุณ
เกรซหมายเหตุ

ฉันรวบรวมทิศทางของคุณเป็นมุมระหว่าง 0 ถึง 360 และเพื่อย้ายลูกบอลที่คุณใช้ตรีโกณมิติ?
Jonathan Connell

@ เกรซขอบคุณมากสำหรับรูป ... @ 3nixios ฉันได้เพิ่มข้อมูลเพิ่มเติมเกี่ยวกับมุมและการเคลื่อนไหว
NemoStein

หากคุณเก็บ "ทิศทาง" เพียงหนึ่งบล็อกต่อบล็อกบางทีคุณอาจคำนวณแต่ละบล็อกสีดำเป็นกลุ่มของบล็อกสี่บล็อกซึ่งใบหน้า "ทิศทาง" หันหน้าออกด้านนอกเสมอ อาจมีกรณีขอบที่มุมทั้งสี่
horatio

คำตอบ:


8

ฉันไม่แน่ใจว่าฉันเข้าใจปัญหาของคุณถูกต้องหรือไม่ แต่ฉันคิดว่าสิ่งที่คุณต้องการจะทำคือหาทิศทางผลลัพธ์ของคุณหลังจากการปะทะ

นี่คือภาพวาดอย่างรวดเร็วบนกระดานไวท์บอร์ดของฉันที่แสดงวิธีแก้ปัญหาที่เป็นไปได้

ป้อนคำอธิบายรูปภาพที่นี่

ลูกศรสีเขียวแสดงถึงความเร็วของลูกบอล (เป็นเวกเตอร์) บล็อกสีน้ำเงินแสดงถึงบล็อกสีดำขนาดใหญ่ของคุณและลูกศรสีแดงเป็นเวกเตอร์ผลลัพธ์

ในกรณีแรกบล็อกสีน้ำเงินมีความโน้มเอียง 30 องศา อีกวิธีหนึ่งในการแก้ไขปัญหาการชนคือนำทุกอย่างกลับคืนบนแกนนอน สิ่งที่คุณต้องทำคือหมุนทุกอย่าง 30 องศา (ความเอียงของบล็อก) (คุณสามารถใช้เมทริกซ์สำหรับสิ่งนั้น)

จากนั้นคุณตรวจสอบว่าการชนมาจากที่ใด หากการชนกันเป็นแนวนอนให้ย้อนกลับองค์ประกอบ x ของความเร็ว หากเป็นแนวตั้ง (เช่นในกรณีนี้) องค์ประกอบ y ( ball.Velocity.Y = -ball.Velocity.Y) สิ่งนี้จะทำให้ลูกบอลทำหน้าที่ได้อย่างถูกต้องเมื่อมันชนกับมุม (มันจะสลับองค์ประกอบทั้งสอง) หลังจากนั้นคุณต้องหมุนกลับไปที่สถานการณ์จริง (ซึ่งไม่ได้อยู่ในรูปวาด)

ในกรณีที่สองมันเป็นสิ่งเดียวกันยกเว้นว่าความเร็วของลูกบอลไม่ได้ตั้งฉากกับบล็อก คุณหมุนได้ 70 องศาตรวจสอบว่ามีการชนกันที่ใดและกลับส่วนประกอบที่เหมาะสม หลังจากนั้นคุณหมุนกลับไปสู่สถานการณ์จริง

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

นี่ไม่ใช่วิธีที่ดีที่สุดที่จะไปและฉันแน่ใจว่าคุณสามารถคำนวณได้อย่างใด แต่ฉันคิดว่ามันเป็นทางออกที่เป็นไปได้สำหรับปัญหาของคุณ


ขอบคุณ ... รักบอร์ดของคุณ ฉันจะลองอีกสักครู่ ... Ahn และคุณคิดว่าเวกเตอร์น่าจะดีกว่าที่จะดูแล / ทำงานด้วยหรือไม่?
NemoStein

ฮ่าฮ่าให้อภัยทักษะการวาดที่ไม่ดีของฉัน
Jesse Emond

อุ๊ปส์ฉันลืมขั้นตอนสำคัญขณะวาด .. คุณต้องหมุนกลับ-block inclination angleเพื่อให้มีการตอบสนองการชนที่เหมาะสม .. โง่ฉัน
Jesse Emond

ฉันเดาว่ามันเกี่ยวกับความชอบส่วนบุคคล แต่ฉันชอบเวกเตอร์จำนวนมาก คุณไม่ต้องคิดเกี่ยวกับคณิตศาสตร์ที่อยู่ข้างหลังพวกเขาส่วนใหญ่แล้วมันมักจะทำให้โค้ดสะอาด เพื่อให้คุณสามารถเก็บDirection(เป็นพาหะ) ball.Position += ball.Direction * ball.Speed;และอัปเดตตำแหน่งของลูกเช่นดังนั้น:
Jesse Emond

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