ฉันจะรับมือกับการเคลื่อนไหว RPG แบบบนลงล่างได้อย่างไร


13

ฉันมีเกมที่ฉันกำลังเขียนใน Java มันเป็นเกม RPG บนลงล่างและฉันพยายามจัดการกับการเคลื่อนไหวในโลกนี้ โลกเป็นขั้นตอนส่วนใหญ่และฉันมีช่วงเวลาที่ยากลำบากในการจัดการกับการเคลื่อนไหวของตัวละครทั่วโลกและทำการเปลี่ยนแปลงบนหน้าจอ ฉันมีโลกที่เต็มไปด้วยบล็อกซึ่งมีกระเบื้องทั้งหมด

ฉันจะรับมือกับการเคลื่อนไหวของตัวละครได้อย่างไร

ฉันนิ่งงันและคิดไม่ออกว่าควรจะไปที่ไหน

แก้ไข : ฉันเป็นนามธรรมกับปัญหาในมือ

ตอนนี้ฉันสามารถนึกถึงทุกอย่างอย่างเหนียวแน่นในอาร์เรย์ 2D และบันทึก ID บล็อกและโปรแกรมเล่นออฟเซ็ตในบล็อกหรือฉันสามารถ "ลอย" ทุกอย่างและย้ายไปมาระหว่างแผ่นกระเบื้องเพื่อพูด

คำตอบ:


11

ใช้พิกัดโลก

(หรือตามที่คุณวางไว้ลอยทุกอย่าง)

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

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


ส่วนที่เหลือของคำตอบนี้จะอธิบายถึงวิธีการคำนวณบล็อกโลกที่ผู้เล่นอยู่บนพื้นฐานของพิกัดโลกของเขา

ฉันจะเขียนข้อมูลโค้ดเช่นถ้าคุณมี 2D เวกเตอร์ชั้นชื่อVector2- ชนิดของเวกเตอร์ที่คุณพบในเรขาคณิตไม่ได้เป็นรายการประเภทที่นำเสนอโดยVector java.utilหากคุณไม่มีคลาส Vector ทางเรขาคณิตคุณควรหาแบบออนไลน์หรือเขียนด้วยตัวเอง

คลาส Vector2 จะมีXเขตข้อมูลและYเขตข้อมูลซึ่งเป็นตัวเลขสาธารณะ (ไม่สำคัญว่าจะเป็นประเภทตัวเลขใดที่นี่)

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2 ฟังก์ชั่น> ระเบียบทั้งหมดของการติดตามภายในบล็อกและการถ่ายโอนระหว่างบล็อก


1
คำตอบที่ดีกว่าที่ฉันกำลังมองหา
WarmWaffles

0

คำถามของคุณค่อนข้างเป็นนามธรรม แต่บางทีคุณกำลังมองหาอัลกอริธึมในการค้นหาเส้นทางฉันขอแนะนำ A * (http://en.wikipedia.org/wiki/A*_search_algorithm) สิ่งนี้จะช่วยให้คุณย้ายไทล์ตัวละครของคุณไปที่ไทล์หากไทล์ไม่ได้ถูกบล็อกภูมิประเทศ


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