ฉันควรแสดงจุดและขนาดเป็นโครงสร้างเมื่อใด


9

ในฐานะที่เป็นส่วนหนึ่งของกรอบการพัฒนาเกม Ruby 2D ที่เรียบง่ายวัตถุในเกมของฉันมีตำแหน่ง (ค่า x และ y) และขนาด (ความกว้างและความสูง)

class MyGameObject
  attr_accessor :x
  attr_accessor :y
  attr_accessor :width
  attr_accessor :height
  ...

อีกวิธีที่ฉันเห็นคือรักษาตำแหน่งเป็นPointโครงสร้างและขนาดเป็นSizeโครงสร้าง:

Point = Struct.new(:x, :y)
Size = Struct.new(:width,:height)

class MyGameObject
  attr_accessor :position   # Point instance
  attr_accessor :size       # Size instance
  ...

เฟรมเวิร์กบางตัวใช้เฟรมก่อน (ฉันคิดว่า GDX, Gosu ... ) อื่น ๆ ใช้หลัง (cocos2d-iphone) ปัญหาคือมันไม่ชัดเจนสำหรับฉันถึงข้อดีและข้อเสียของทั้งสองพฤติกรรม (ในการพัฒนาเกม) - ฉันไม่รู้ว่าทำไมกรอบบางอันเลือกหนึ่งและไม่ใช่อีกอย่าง

ฉันควรพิจารณาความแตกต่างอย่างมีนัยสำคัญหรือไม่

คำตอบ:


8

บางคนใช้Rectangleคลาส:

class Rectangle
{
    float x, y, w, h;
}
class GameObject
{
    Rectangle dimensions;
}

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

ฉันจะบอกว่าไปกับเวกเตอร์สองตัวที่แยกจากกันเช่นนี้

class Vector2
{
    float x, y;
    //helper functions like operator overload, dot, length, distance, etc.
}

class GameObject
{
    Vector2 position;
    Vector2 size;
    Vector2 direction;
}

วิธีนี้คุณสามารถจัดการสิ่งต่าง ๆ เช่นมุมระหว่างวัตถุได้ง่ายขึ้นเช่น:

GameObject foe;
GameObject player;
Vector2 dist = player.position - foe.position;
dist.normalize();
float angleBetween = acos(dist.dot(foe.direction));

แทนที่จะต้องดึงเวกเตอร์ออกมาจากสี่เหลี่ยมหรือสร้างมันขึ้นมาจากการลอยแบบธรรมดา


2

โดยทั่วไปให้ใช้โครงสร้างข้อมูลแยกต่างหากเสมอ ทำให้รหัสของคุณง่ายต่อการใช้อ่านและบำรุงรักษา คุณต้องการxแยกจากyvs บ่อยแค่ไหนที่คุณต้องการคำนวณเวกเตอร์ออฟเซ็ต, ความยาว, ผลิตภัณฑ์ดอท ฯลฯ ? มีจุดมุ่งหมายสำหรับกรณีทั่วไป; ทำให้รหัสที่คุณเขียนง่ายขึ้นเพื่อให้ทำงานกับจุดและเวกเตอร์ได้ง่ายขึ้นซึ่งโดยทั่วไปจะเป็นการดำเนินการกับ "วัตถุ" ทั้งหมดแทนที่จะดำเนินการกับแต่ละองค์ประกอบ

ข้อยกเว้นเดียวที่ฉันจะทำคือหลังจากสร้างโปรไฟล์อย่างถูกต้องแล้วคุณจะพบว่าโครงสร้างที่แยกต่างหากนั้นช้าเกินไป ภาษาอย่าง Ruby ไม่ได้ทำให้ผู้ใช้กำหนด "ตามค่า" ง่าย ๆ เท่าที่จะเป็นไปได้และจากประสบการณ์ของฉันการมีคะแนนและเวกเตอร์เป็นประเภท "อ้างอิงโดย" เป็นทั้งความเจ็บปวดในบางครั้งและอาจช้าลงอย่างมาก . มันอาจเป็นประโยชน์ตัวอย่างเช่นมีสองอาร์เรย์ของ ints หนึ่งxและหนึ่งสำหรับyนั้นจะมีอาร์เรย์ของPointวัตถุเดียว; มันเจ็บปวดมากกว่าที่จะทำงานด้วยแม้ว่าจะทำอย่างนั้นก็ต่อเมื่อคุณมีตัวชี้วัดประสิทธิภาพที่ถูกต้องเพื่อบ่งบอกว่ามันคุ้มค่า!


+1 แต่ฉันต้องการพูดถึงว่าการเพิ่มประสิทธิภาพก่อนกำหนดเป็นรากของความชั่วร้ายทั้งหมด
Gustavo Maciel

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