ป้องกันการเกิดภัยพิบัติในเกมแข่งรถ


9

เมื่อเล่น GTA III บน Android ฉันสังเกตเห็นบางสิ่งที่สร้างความรำคาญให้ฉันในเกือบทุกเกมแข่งที่ฉันเคยเล่น (อาจยกเว้น Mario Kart): การขับตรงไปข้างหน้านั้นเป็นเรื่องง่าย แต่เส้นโค้งนั้นยากมาก เมื่อฉันเปลี่ยนเลนหรือผ่านใครบางคนรถเริ่มหมุนไปมาและความพยายามใด ๆ ที่จะแก้ไขให้แย่ลงเท่านั้น สิ่งเดียวที่ฉันทำได้คือกดเบรก ฉันคิดว่านี่เป็นงานหนักเกินไป

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

คุณสามารถทำอะไรได้บ้างในฐานะผู้พัฒนาเกมเพื่อป้องกันการเกิดเสียงดังกังวานและทำให้การขับขี่รู้สึกถูกต้อง? (สำหรับเกมแข่งรถทั่วไปที่ไม่ได้มุ่งมั่นเพื่อฟิสิกส์ที่สมจริง 100%)

ฉันยังสงสัยว่าเกมอย่าง Super Mario Kart นั้นแตกต่างกันอย่างไรเพื่อที่พวกเขาจะได้ไม่ต้องออกแรงมากเกินไป

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


3
คุณต้องพิจารณาว่ากลุ่มเป้าหมายของคุณคือใคร หากเป็นคนที่คลั่งไคล้ในการขับเกมเมอร์คุณจะต้องทำให้พวกเขาเป็นจริงด้วยการ 'ตรึง' ความเป็นจริง คุณอาจไม่แข่งรถและไม่เข้าใจว่าด้วยความเร็วสูงของการแข่งขันปัญหาที่คุณประสบอยู่นั้นเป็นของจริงมากที่เป็นปัญหาสำหรับนักแข่งรถแข่งจริง 'การแก้ไข' ที่แท้จริงคือการเป็นกันเองมากขึ้นและนั่นคือสิ่งที่ Mario Kart ทำในสิ่งที่แตกต่าง พวกเขามีความอดทนกับฟิสิกส์และไม่ได้จำลองพลังที่จำเป็นในการสร้าง Fishtailing ดังนั้นจึงไม่เป็นที่สนใจของแฟนเกมขับรถฮาร์ดคอร์
DampeS8N

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

คำตอบ:


7

ทางออกหนึ่งคือโกงบิตและเดาว่าผู้เล่นต้องการทำอะไร เมื่อผู้เล่นอยู่ในส่วนตรงและกดซ้ายคุณสามารถสันนิษฐานได้ว่าเขาต้องการเปลี่ยนเลน เมื่อเขาอยู่ใกล้กับโค้งหรือสี่แยกแน่นอนว่าเขาต้องการที่จะเลี้ยว ผู้เล่นไม่สามารถควบคุมมันเป็นมุมบังคับเลี้ยวที่แน่นอนในโค้งดังนั้นคุณสามารถตัดสินใจที่จะให้ผู้เล่นได้รับประโยชน์จากความสงสัยและปล่อยให้เขาขับผ่านโค้งในมุมที่สมบูรณ์แบบเมื่อเขากดปุ่มเทิร์นในเวลาที่เหมาะสม เป็นไปได้ทางร่างกาย - ผู้เล่นใด ๆ ที่พยายามขับผ่านกิ๊บโค้งที่มี 200 กม. / ชม. ควรถูกลงโทษโดยการบินระยะสั้นเหนือหญ้า)

แน่นอนว่านี่อาจเป็นเรื่องยากเมื่อผู้เล่นต้องการที่จะเลี้ยวตรงส่วนหรือต้องการเปลี่ยนเลนก่อนถึงทางแยก

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

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


ขอบคุณสำหรับการแก้ไข @kotekzot แต่คุณสามารถแนะนำการแก้ไขโพสต์ของคนอื่นโดยตรงโดยไม่ต้องถามพวกเขา
ฟิลิปป์

ความคิดของคุณเป็นสิ่งที่ดี เมื่อกดปุ่มขวา (0/1) มันจะหมุนรถด้วยมุมที่ขึ้นอยู่กับโค้ง เหมือนตอนที่คุณขับ: คุณพูดว่า 'i เลี้ยวซ้าย' (0/1) แต่ในความเป็นจริงคุณจะหมุนพวงมาลัยมากหรือน้อยขึ้นอยู่กับความลาดชัน และยังเป็นสิ่งที่ควรค่าแก่การพูดถึง: มุมจะค่อยๆเปลี่ยนไป
GameAlchemist

0

ฉันเจอคำถาม (เก่า) นี้ในขณะที่ค้นคว้าสิ่งที่เกมอื่น ๆ นอกเหนือจาก Grand Theft Auto IV และ V ได้นำไปใช้ แต่ฉันมีคำตอบที่ดีเพื่อให้ได้ผู้ดูแลที่ควบคุมได้ ฉันมีประสบการณ์บางอย่างที่ยุ่งเกี่ยวกับรูปแบบการขับขี่ใน Grand Theft Auto V เท่านั้น แต่ข้อมูลนี้ควรใช้กับรูปแบบการขับขี่ที่เหมือนจริงมากที่สุด

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

สิ่งที่สามารถสังเกตได้ใน Grand Theft Auto V คืออินพุตพวงมาลัยของผู้ใช้ไม่ได้เชื่อมโยงโดยตรงกับเอาต์พุตพวงมาลัย ยานพาหนะนำพาตัวเองไปสู่เวกเตอร์ความเร็วปัจจุบัน สิ่งนี้สามารถมองเห็นได้เมื่อบังคับให้เกิดสถานการณ์ที่ค่อนข้างเกินขนาดและสังเกตล้อที่ถูกนำมาใช้โดยไม่ต้องป้อนข้อมูลใด ๆ ผู้ใช้ที่ป้อนเข้าจะถูกเพิ่มที่ด้านบนของการแก้ไข "ธรรมชาติ" เหล่านี้

อย่างไรก็ตามข้อเสียของวิธีนี้คือรถมีความรู้สึกเหนียวและดื้อรั้นมากพอที่จะเข้าหา Powerlide หรือ Drift - ดังนั้นค่าของ Countersteer สามารถ จำกัด ได้ในบางมุม

ทฤษฎีนี้สามารถตรวจสอบได้โดยการนำระบบบังคับเลี้ยวกลับมาใช้ใหม่และเปรียบเทียบกับพฤติกรรมดั้งเดิม

  • เมื่อเชื่อมโยงอินพุตกับเอาต์พุตโดยตรงยานพาหนะนั้นควบคุมได้ยากอย่างยิ่งแม้จะใช้ตัว จำกัด การป้อนข้อมูลความเร็วพวงมาลัยตามก็ตาม
  • เมื่อเพิ่มใน Countersteer แบบธรรมชาติพฤติกรรมเกือบจะเหมือนกับการใช้งานของเกม แต่รถยนต์มีความเสถียร "เกินไป"
  • เมื่อเพิ่มขีด จำกัด 15 องศาในการตอบโต้พฤติกรรมจะเหมือนกันเกือบทั้งหมด

สิ่งที่ต้องคำนึงถึงก็คือ Grand Theft Auto V ถูกนำมาใช้เป็น "อุดมคติ" ที่นี่ - แม้ว่าฉันจะยังไม่พบเกมอื่นที่ใช้ระบบนี้

หากคุณอยากรู้รหัสบางส่วนนี่เป็นตัวอย่างการใช้งานของฉัน

// Returns in radians
float Racer_calculateDesiredHeading(float steeringMax, float desiredHeading,
    float reduction) {
    desiredHeading *= reduction;
    float correction = desiredHeading;

    // Get the relative velocity vector
    Vector3 speedVector = ENTITY::GET_ENTITY_SPEED_VECTOR(vehicle, true);
    if (abs(speedVector.y) > 3.0f) {
        // Simplify it to an angle
        Vector3 target = Normalize(speedVector);
        float travelDir = atan2(target.y, target.x) - static_cast<float>(M_PI) / 2.0f;
        if (travelDir > static_cast<float>(M_PI) / 2.0f) {
            travelDir -= static_cast<float>(M_PI);
        }
        if (travelDir < -static_cast<float>(M_PI) / 2.0f) {
            travelDir += static_cast<float>(M_PI);
        }
        // Correct for reverse
        travelDir *= sgn(speedVector.y);

        // Limit to some degree, R* uses 15 degrees
        travelDir = std::clamp(travelDir, deg2rad(-15.0f), deg2rad(15.0f));

        // User input deviation
        correction = travelDir + desiredHeading;
    }

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