รับคะแนนในบรรทัดระหว่างสองคะแนน


9

ฉันกำลังสร้างเกมอวกาศง่ายๆใน JavaScript แต่ตอนนี้ฉันตีกำแพงเกี่ยวกับเวกเตอร์

มุมมองเกมอยู่บนลงบนกริด 2d เมื่อผู้ใช้คลิกบนกริดยานอวกาศจะบินไปยังจุดนั้น

ดังนั้นถ้าฉันมีคะแนนสองชุด:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

หากเกมวนซ้ำที่ 60 รอบต่อวินาทีและความเร็วของเรือรบที่ต้องการคือ 0.05 คะแนนต่อเห็บ (3 คะแนนต่อวินาที) ฉันจะคำนวณพิกัดชุดใหม่สำหรับเรือแต่ละเห็บของวงวนของเกมได้อย่างไร

ป.ล. ฉันไม่ต้องการบัญชีความเฉื่อยหรือเวกเตอร์หลายตัวที่มีผลต่อเรือฉันแค่ต้องการให้เรือหยุดสิ่งที่กำลังทำ (เช่นบินทางเดียว) และย้ายไปยังพิกัดที่คลิกด้วยความเร็วคงที่

คำตอบ:


8

ใน Pseudocode:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

@Tristan: คุณหมายถึงgoal_distในifสภาพของคุณ?
Nate W.

21

LERP การแก้ไขเชิงเส้น

ฉันให้คำตอบสำหรับปัญหาที่คล้ายกันเมื่อหลายวันก่อน แต่ที่นี่เราไป:

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


The Great Formula - วิธีการคำนวณ

สูตร LERP pu = p0 + (p1 - p0) * uทั่วไปจะได้รับจาก ที่ไหน:

  • pu: หมายเลขผลลัพธ์
  • p0: หมายเลขเริ่มต้น
  • p1: หมายเลขสุดท้าย
  • u: ความคืบหน้า มันจะได้รับในอัตราร้อยละระหว่าง 0 และ 1

วิธีรับเปอร์เซ็นต์

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

ดูสิสิ่งนี้: percentage = currentTime / finalTime;


กำลังคำนวณเวกเตอร์

ในการรับเวกเตอร์ผลลัพธ์สิ่งที่คุณต้องทำคือใช้สูตรสองครั้งหนึ่งรายการสำหรับองค์ประกอบ X และอีกหนึ่งองค์ประกอบ Y บางสิ่งเช่นนี้

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

การคำนวณเวลาผันแปร

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

คุณสามารถทำได้ดังนี้

  • รับความยาวระยะทางสำหรับมันคุณจะต้องมีสองอย่าง รับเวกเตอร์ระยะทางจากนั้นแปลงเป็นค่าความยาว

    distancevec = final - start;
    distance = distancevec.length();

ฉันหวังว่าคุณจะรู้คณิตศาสตร์เวกเตอร์ ถ้าคุณทำไม่ได้คุณสามารถคำนวณเวกเตอร์ความยาวด้วยสูตรd = sqrt(pow(v.x, 2) + pow(v.y, 2));นี้

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

    finalTime = distance / 0.5f;

เสร็จสิ้น

ข้อสังเกต:บางทีนี่อาจไม่ใช่ความเร็วที่คุณตั้งใจ แต่นี่เป็นสิ่งที่ถูกต้อง ดังนั้นคุณมีการเคลื่อนที่เชิงเส้นแม้ในแนวทแยง หากคุณต้องการทำ x + = 0.5f, y + = 0.5f ให้อ่านหนังสือคณิตศาสตร์เวกเตอร์และตรวจสอบแผนของคุณอีกครั้ง


ถ้าคุณต้องการ% ซ้ายไปยังปลายทางจากตำแหน่งของคุณ หากคุณไม่สามารถใช้เวลาเดลต้า แต่ใช้ x: y พิกัด
เดฟ

หากคุณคำนวณprogressตามที่ระบุไว้ในคำตอบนี้ควรอยู่ใน0..1ช่วง เพิ่งทำ:progressLeft = 1.0 - progress;
Gustavo Maciel

3

ซึ่งสามารถทำได้โดยการคำนวณตามปกติของทิศทางแล้วคำนวณตำแหน่งปัจจุบันผ่านสมการพารามิเตอร์

newPoint = startPoint + directionVector * velocity * t

เวลาที่ผ่านไปเมื่อเรือเริ่มเดินทางในทิศทางที่ต้องการ คุณสามารถทำการอัปเดตนี้ผ่านทาง

newPoint = currentPoint + directionVector * velocity * timeDelta

และคุณคำนวณนี่ได้ทุกเฟรม / ฟิสิกส์ / ฯลฯ อัปเดตจนกว่าเรือจะถึงปลายทาง

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