นี่คือตรรกะที่เกี่ยวข้องที่ฉันใช้กับพงษ์ในหน้าแรกของฉัน : (โปรดไปเล่นก่อนอ่านเพื่อที่คุณจะได้รู้ถึงผลกระทบที่ฉันได้รับด้วยรหัสต่อไปนี้)
โดยพื้นฐานแล้วเมื่อลูกบอลชนกับไม้พายทิศทางของมันจะไม่ถูกมองข้ามอย่างสมบูรณ์ มันจะได้รับทิศทางใหม่ตามระยะทางจากจุดศูนย์กลางของการชนกันของพาย หากลูกบอลกระทบไม้พายเข้าหากึ่งกลางตรงจะถูกส่งออกไปในแนวนอน ถ้ามันกระทบกับขอบมันจะพุ่งออกมาในมุมที่รุนแรง (75 องศา) และมันก็เดินทางด้วยความเร็วคงที่เสมอ
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
ใช้ค่า Y กลางของไม้พายและลบจุดตัด Y ของลูกบอล ถ้าไม้พายมีความสูง 10 พิกเซลตัวเลขนี้จะอยู่ระหว่าง -5 ถึง 5 ฉันเรียกสิ่งนี้ว่า "การตัดกันแบบญาติ" เพราะมันอยู่ใน "พื้นที่พายเรือ" ตอนนี้การแยกของลูกบอลเมื่อเทียบกับกลางไม้พาย
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
ใช้จุดตัดสัมพัทธ์แล้วหารครึ่งความสูงของไม้พาย ทีนี้ตัวเลข -5 ถึง 5 ของเราคือทศนิยมจาก -1 ถึง 1; มันปกติ จากนั้นคูณด้วยมุมสูงสุดที่คุณต้องการให้ลูกบอลกระดอน ฉันตั้งค่าเป็น 5 * Pi / 12 เรเดียน (75 องศา)
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
สุดท้ายคำนวณความเร็วลูกใหม่โดยใช้ตรีโกณมิติอย่างง่าย
นี่อาจไม่ใช่เอฟเฟกต์ที่คุณกำลังทำหรือคุณอาจต้องการกำหนดความเร็วโดยการคูณการแยกญาติแบบปกติด้วยความเร็วสูงสุด สิ่งนี้จะทำให้ลูกบอลไปเร็วขึ้นถ้ามันกระทบกับขอบของไม้พายหรือช้ากว่าถ้ามันกระทบกับกึ่งกลาง
ฉันอาจต้องการโค้ดบางอย่างเกี่ยวกับเวกเตอร์ที่มีลักษณะหรือวิธีที่ฉันสามารถบันทึกตัวแปรของเวกเตอร์ที่ลูกมี (ความเร็วและทิศทาง)
เวกเตอร์มีทั้งความเร็วและทิศทางโดยนัย ฉันเก็บเวกเตอร์ของฉันเป็น "vx" และ "vy"; นั่นคือความเร็วในทิศทาง x และความเร็วในทิศทาง y ถ้าคุณยังไม่ได้เรียนวิชาฟิสิกส์เบื้องต้นนี่อาจจะดูแปลกสำหรับคุณ
เหตุผลที่ฉันทำเช่นนี้เพราะลดการคำนวณต่อเฟรมที่จำเป็น ทุกเฟรมคุณทำx += vx * time;
และy += vy * time;
เวลาเป็นเวลานับตั้งแต่เฟรมสุดท้ายเป็นมิลลิวินาที (ดังนั้นความเร็วจะเป็นพิกเซลต่อมิลลิวินาที)
เกี่ยวกับการใช้ความสามารถในการโค้งบอล:
ก่อนอื่นคุณต้องรู้ความเร็วของไม้พายในขณะที่ลูกบอลกระทบ ซึ่งหมายความว่าคุณต้องติดตามประวัติของไม้พายเพื่อที่คุณจะได้รู้ตำแหน่งในอดีตของไม้พายอย่างน้อยหนึ่งอย่างเพื่อให้คุณสามารถเปรียบเทียบมันกับตำแหน่งปัจจุบันของไม้พายเพื่อดูว่ามันเคลื่อนไหวหรือไม่ (เปลี่ยนตำแหน่ง / เปลี่ยนเวลา = ความเร็วดังนั้นคุณต้องมี 2 ตำแหน่งหรือมากกว่าและเวลาของตำแหน่งเหล่านั้น)
ตอนนี้คุณต้องติดตามความเร็วเชิงมุมของลูกบอลซึ่งแสดงถึงความโค้งตามที่มันกำลังเคลื่อนที่ แต่เทียบเท่ากับการหมุนของลูกบอลในโลกแห่งความเป็นจริง เช่นเดียวกับที่คุณจะสอดแทรกมุมเด้งจากตำแหน่งที่สัมพันธ์กันของลูกบอลในการชนกับไม้พายคุณจะต้องสอดแทรกความเร็วเชิงมุมนี้ (หรือหมุน) จากความเร็วของไม้พายในการชน แทนที่จะตั้งค่าการหมุนเหมือนกับที่คุณทำกับมุมเด้งคุณอาจต้องการเพิ่มหรือลบการหมุนที่มีอยู่ของลูกบอลเนื่องจากมีแนวโน้มที่จะทำงานได้ดีในเกม (ผู้เล่นสามารถสังเกตเห็นว่าลูกบอลหมุนและทำให้หมุน มากยิ่งขึ้นอย่างรุนแรงหรือตอบโต้การหมุนในความพยายามที่จะทำให้มันเดินทางตรง)
อย่างไรก็ตามโปรดทราบว่าในขณะที่นี่เป็นความรู้สึกที่พบได้บ่อยที่สุดและอาจเป็นวิธีที่ง่ายที่สุดในการใช้มัน แต่ฟิสิกส์ที่แท้จริงของการตีกลับไม่ได้ขึ้นอยู่กับความเร็วของวัตถุที่มันกระทบเท่านั้น วัตถุที่ไม่มีความเร็วเชิงมุม (ไม่มีสปิน) ซึ่งกระทบกับพื้นผิวที่มุมหนึ่ง สิ่งนี้อาจนำไปสู่การเป็นช่างเกมที่ดีกว่าดังนั้นคุณอาจต้องการตรวจสอบเรื่องนี้ แต่ฉันไม่แน่ใจเรื่องฟิสิกส์เบื้องหลังดังนั้นฉันจะไม่พยายามอธิบาย