รูปแบบทั่วไปเพื่อขยาย“ หน่วยจริง” เป็นพิกเซล?


10

นี่คือคำถามที่ติดตามเพื่อคนอื่น ๆ นี้

ฉันต้องการทราบว่ามีรูปแบบทั่วไป / ทั่วไป / ดีที่สุดในการขยายการเป็นตัวแทนของโลก (ปัจจุบัน 160Kmx160Km) เพื่อให้พอดีกับพื้นที่วาดรูป (ปัจจุบันคือ 800x600 พิกเซล)

ฉันสามารถคิดถึงวิธีที่แตกต่างกันอย่างน้อยสี่วิธี:

หนึ่งเดียว (วิธีที่ฉันทำจนถึงตอนนี้) ฉันใช้งานฟังก์ชั่นระดับโลกsc(vector)ซึ่งจะคืนค่าสำเนาเวกเตอร์ที่ลดขนาดลงซึ่งแน่นอนว่าใช้ได้ผล แต่ฉันต้องเขียนโค้ดเช่น:

drawCircle(sc(radius), sc(position))

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

มัณฑนากรฟังก์ชั่น ฉันก็สามารถตกแต่งฟังก์ชั่นมิดเดิลแวร์ที่มีอยู่ให้ปรับอัตโนมัติสำหรับพารามิเตอร์ทั้งหมดที่เป็น instantiation ของชั้นVector3Dแต่ปัญหาก็คือว่าฟังก์ชั่นเหล่านั้นยังทำงานร่วมกับพารามิเตอร์เดียวกันเป็นlistหรือVector2Dเกินไปและมัณฑนากรจะมีวิธีที่จะรู้ว่าไม่มี รายการใดที่ต้องปรับขนาด (รัศมีเช่น) และไม่ (ค่า RGB)

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

... แต่อย่างใด: เนื่องจากนี่เป็นปัญหาที่พบบ่อยมากฉันสงสัยว่ามีรูปแบบที่จัดตั้งขึ้นซึ่งแก้ปัญหาที่ฉันไม่สามารถหาได้อย่างสง่างาม

PS: สำหรับโครงการนี้ฉันใช้ python (กับpygame ) แต่ถึงแม้ว่าคำตอบเฉพาะของไพ ธ อน / pygame ก็ดีมากฉันสนใจในคำอธิบายทั่วไป / ระดับสูงของรูปแบบมากกว่าการนำไปปฏิบัติอย่างเป็นรูปธรรม

ขอบคุณล่วงหน้าสำหรับเวลาและความเชี่ยวชาญของคุณ

คำตอบ:


6

วิธีมาตรฐานในการทำนั่นคือการตั้งค่าเมทริกซ์การแปลงเพื่อทำการแปลงระหว่างการเรนเดอร์ สำหรับการเรนเดอร์ 3D มันเป็นเมทริกซ์การแปลงมุมมองสำหรับกล้องที่ทำ

API 2D ส่วนใหญ่มีวิธีการระบุการแปลงมุมมองด้วยเช่นเมทริกซ์ 2x3 หรือเป็นมาตราส่วนการแปลและการหมุนแยกต่างหาก

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


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

1
เนื่องจากมันเป็นแบบ 2 มิติและไม่มีการหมุนที่เกี่ยวข้องกับ @mac โดยทั่วไปจะพูดถึงการห่อฟังก์ชั่นและคุณสามารถใช้สเกลแบ่งง่าย ๆ ของคุณในโปรแกรมเสริมเหล่านี้ เหตุผลที่มักใช้เมทริกซ์แบบเต็มคือ API ส่วนใหญ่มีเมทริกซ์ควบคุมวิวพอร์ต แต่ดูเหมือนว่า pygame ไม่ได้ดังนั้นคุณต้องทำด้วยตัวเองหนึ่งชั้น
Patrick Hughes

2

ตั้งแต่นี้เป็นปัญหาที่พบบ่อยมากฉันสงสัยว่ามีรูปแบบที่จัดตั้งขึ้นที่สง่างามแก้ปัญหาที่ฉันล้มเหลวในการค้นหา

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

หากคุณใช้ 3D API คุณสามารถรับฟังก์ชั่นนี้ได้ฟรีเพียงแค่เปลี่ยนพารามิเตอร์กล้อง / วิวพอร์ต

PyGame เป็น API ที่เก่ามากและน่าเสียดายที่เหมาะกับ 2D เท่านั้น แม้ว่าคุณจะสามารถทำงานกับระบบการปรับสเกลที่เพียงพอสำหรับระดับการซูมที่แตกต่างกัน แต่ประสิทธิภาพจะไม่ดีพอและลักษณะที่ปรากฏอาจไม่ดีอย่างที่ยอมรับไม่ได้

ฉันอยากจะแนะนำว่าหากคุณต้องการซูมเข้าและออกมากคุณต้องย้ายไปที่ 3D API ที่ทันสมัยโดยเร็วที่สุด ฉันจะแนะนำpygletแต่มีแนวโน้มที่จะเป็นคนอื่นด้วย


ขอบคุณสำหรับคำตอบ (+1) ฉันเคยใช้pygletsในอดีตสำหรับการจำลอง 3 มิติ แน่นอนมันมีความสามารถมากขึ้นกว่าpygameแต่การสนับสนุนสำหรับ 2D pygameเป็นธรรมในระดับต่ำกว่ามากกว่าหนึ่งใน เอกสาร / ตัวอย่างที่มีให้นั้นมีรายละเอียดน้อยกว่าซึ่งเป็นเรื่องที่น่ากลัวสำหรับฉันเนื่องจากฉันเป็นผู้เริ่มต้นในการพัฒนาเกม :) สำหรับ "อายุ" ของ pygame: คุณพูดถูก ความทันสมัยอยู่ในความคืบหน้าอย่างไร! :)
mac

สำหรับ: "มันยากที่คุณต้องการรูทีนใด ๆ เพื่อให้ทำงานที่ระดับการซูม 2 ระดับที่แตกต่างกัน" ... ฉันคิดว่านั่นเป็นสิ่งที่จะถูกใช้เมื่อเปลี่ยนขนาดของหน้าต่าง / ความละเอียดของเกมแบบเต็มหน้าจอ จากความคิดเห็นของคุณฉันเข้าใจว่าไม่ได้: ตัวชี้ไปที่ "ธรรมดา" อะไรแทน?
แม็ค

คุณกำลังทำการแสดง 2D แบบไหนที่ pyglet อยู่ในระดับต่ำกว่า pygame? ทั้งสองให้คุณวาดเทพดาด้วยรหัส 1 บรรทัด เมื่อคุณเปลี่ยนขนาดหน้าต่างของเกม 2D อัตราส่วนพิกเซลต่อหน่วยโลกจะคงที่ตลอดเวลา ดังนั้นคุณเพียงแค่วาดรูปสไปรท์มากขึ้น: คุณจะไม่วาดพวกมันต่างกัน
Kylotan

ในระดับต่ำของสิ่งต่าง ๆ : ฉันไม่ได้เป็นผู้เชี่ยวชาญอย่างแท้จริงในสอง libs แต่ใน pyglets ฉันไม่สามารถจำลองแบบออกมานอกกรอบพฤติกรรมการแสดงผลกลุ่มที่นำเสนอโดย pygame (เช่นในpygame.sprite.LayeredUpdatesตัวอย่าง) สำหรับอัตราส่วนที่ไม่เปลี่ยนแปลง: ฉันได้สิ่งที่คุณหมายถึง พฤติกรรมที่คุณอธิบายไม่ใช่สิ่งที่ฉันต้องการทำซ้ำ แต่ฉันเข้าใจสิ่งที่คุณหมายถึงขอบคุณสำหรับการชี้แจง! :)
แม็ค

pyglet มีวัตถุ OrderedGroup - เอกสารอยู่ที่นี่ถ้าคุณหรือคนอื่นที่มีความสนใจ: pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.