ฉันจะจัดการกับสไปรต์ชีตที่มีขนาดสไปรต์ที่ไม่ใช่แบบฟอร์มได้อย่างไร


14

สำหรับชุดสไปรต์ที่มีขนาดสไปรต์ที่ไม่สม่ำเสมอฉันจะหารูปสี่เหลี่ยมมุมฉากสำหรับสไปรต์แต่ละตัวได้อย่างไร (เช่นกล่องสีน้ำเงินในภาพต่อไปนี้ / ฉันวาดตัวอย่างเพียงไม่กี่ชิ้น)?

สิ่งที่ฉันต้องการตรวจสอบคือ: offset_x, offset_y, width, height

ป้อนคำอธิบายรูปภาพที่นี่

จนถึงตอนนี้ฉันได้ใช้ Spriteheets ที่ Sprite ทั้งหมดมีขนาดเท่ากัน ในกรณีนั้นเราต้องการเพียงระบุ x และ y-offset เพื่อรับ sprite เฉพาะ อย่างไรก็ตามสำหรับสไปรต์ของชุดที่มีขนาดไม่เท่ากันก็ไม่สามารถใช้งานได้

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


1
ดูเหมือนว่าพวกเขาทุกคนมีขนาดเท่ากันพื้นที่ที่ไม่ถูกเติมเต็มด้วยสีเป็นเพียงพิกเซลโดยที่อัลฟาตั้งค่าเป็นศูนย์
ดีเร็ก

คำตอบ:


8

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

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


สิ่งนี้ - ในขณะที่วิธีการที่ใช้การตรวจจับอัตโนมัติมีประโยชน์ในทางปฏิบัติพวกมันมีความพิถีพิถันและเกิดข้อผิดพลาดได้ง่าย คุณจำเป็นต้องมีแล้วเมตาดาต้าสำหรับที่มาของเทพดาที่ (สไปรท์ของคุณทำมีต้นกำเนิดที่ใช่ไหม?) เพื่อให้ข้อมูลเป็นพิเศษคือแทบจะไม่มากเกินไปของภาระ ศิลปินควรรู้ดีกว่าแอปของคุณเสมอขนาดของสไปรต์แต่ละรายการคือเท่าไหร่
Steven Stadnicki

+1. จัดหาข้อมูลเมตากับสไปรท์มีการประกันการแก้ปัญหามันsanely
Bartek Banachewicz

5

คุณสามารถทำการวิเคราะห์บนรูปภาพเพื่อค้นหาสี่เหลี่ยมขอบของสไปรต์จัดเรียงสี่เหลี่ยมมุมฉากเหล่านั้น (อาจเพิ่ม X ขั้นต่ำตามด้วย Y) และคุณจะมีชุดของขอบเขตขอบเขตที่สอดคล้องกับเฟรมของแผ่นสไปรต์

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

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


1
+1 ฉันยอมรับว่ามันจะต้องใช้ทักษะการรับรู้ทางคอมพิวเตอร์ / การจัดการรูปภาพเพื่อค้นหาขอบเขตสไปรต์ที่ถูกต้อง บางครั้งมันอาจเป็นไปไม่ได้เช่นถ้าคุณดูเต่ากับแอนิเมชั่นของเชลล์ มันจะยากที่จะกำหนดตำแหน่งที่ถูกต้องสำหรับที่เกี่ยวข้องกับเฟรมภาพเคลื่อนไหวอื่น ๆ และสำหรับสาเหตุ : เป็นไปได้มากที่สุดเนื่องจากการใช้พื้นที่พื้นผิวที่เหมาะสมที่สุด และโดยปกติแล้วไฟล์ที่มีพิกัดควรให้มาพร้อมกับ spritesheet แต่ถ้าคุณเพียงแค่คว้ามันจากการค้นหารูปภาพของ Google ก็อาจขาดข้อมูลนี้
bummzack

คุณเพิ่มจุดดี: คำตอบของฉันไม่ได้แก้ไขปัญหาของสไปรต์ต้นกำเนิด; มันจะนำไปสู่การหารูปสี่เหลี่ยมมุมฉากที่มีข้อต่อแน่นและสำหรับแผ่นที่มีสไปรต์แบบ nonuniform การรู้ที่มาของแต่ละเฟรมนั้นมีความสำคัญพอสมควร สิ่งนี้จะยากที่จะทำโดยอัตโนมัติเว้นแต่คุณจะได้ตั้งสมมติฐาน (เฉพาะโดเมนที่น่าจะเป็นไปได้) ตัวอย่างเช่นที่มานั้นมักจะเป็น (ความกว้าง / 2, สูงสุด Y) หรือบางสิ่งบางอย่าง

4

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

ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าคุณจะสร้างชุดสไปรต์แผ่นเดียวที่มีอนิเมชั่นเดียวจากชุดที่ไม่เหมือนกันใช่ไหม หรือฉันกำลังตีความสิ่งนี้ผิด
Ben

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

ดูเหมือนว่าเป็นเครื่องมือที่เรียบร้อยมากที่คุณทำที่นั่น ต้องการแบ่งปันเครื่องมือหรือไม่
eckyputrady

@eckyputrady ฉันขอโทษ แต่มันก็ยังห่างไกลจากความสมบูรณ์ แต่ฉันขอแนะนำเครื่องมืออื่น (ซึ่งโดยทั่วไปเป็นแรงบันดาลใจให้ฉัน) คุณสามารถค้นหาได้ที่นี่: colourclash.com/sprite_buddy/sprite_buddy.html
Anonymouse

0

ตรวจสอบ texturepacker

http://www.texturepacker.com/

มันจะส่งออกไฟล์เช่นนี้ (ขึ้นอยู่กับการตั้งค่าของคุณ)

    {
    "filename": "image_front_1",
    "frame": {"x":1,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":2,"w":36,"h":40},
    "sourceSize": {"w":36,"h":40}
},
{
    "filename": "image_front_2.png",
    "frame": {"x":36,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":36,"h":42},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_3.png",
    "frame": {"x":71,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_4.png",
    "frame": {"x":106,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
}

เมื่อใช้ข้อมูลนี้คุณสามารถจับสี่เหลี่ยมแยกจากภาพได้อย่างง่ายดาย


นี่ไม่ใช่เทคโนโลยีที่จะใช้คำถาม เพียงแค่ตอบด้วยลิงก์ไปยังเครื่องมือและตัวอย่างของผลลัพธ์นั้นไม่เพียงพอในความคิดของฉัน
MichaelHouse

-1

spritebuddy.comทำงานได้ดีสำหรับฉัน ไม่พบความช่วยเหลือในเว็บไซต์ แต่โพสต์ของ Google Groups นี้อธิบายได้ดีจริงๆ มันคาดเดาขอบเขตของสไปรต์ของคุณโดยอัตโนมัติช่วยให้คุณสามารถปรับได้และช่วยให้คุณจัดเรียงลำดับภาพเคลื่อนไหวได้ จากนั้นจะแยกไฟล์ข้อมูลเมตาทั้งหมดนี้ออกเป็น JSON หรือ XML จากนั้นสิ่งที่คุณต้องทำคือแยกไฟล์ข้อมูลในเกมของคุณเพื่อให้ได้สี่เหลี่ยมมุมฉากที่ถูกต้อง


1
นี่ไม่ใช่เทคโนโลยีที่จะใช้คำถาม นอกจากนี้เครื่องมือนี้ได้รับการแนะนำในหนึ่งในความคิดเห็น
MichaelHouse

ฉันอัปเดตคำตอบของฉันแล้ว แต่ฉันไม่เห็นด้วยว่าไม่ได้ตอบคำถามของ OP: "สิ่งที่ฉันต้องการพิจารณาคือ: offset_x, offset_y, width, height" ไม่ว่าสิ่งนี้จะต้องเกิดขึ้นในช่วงเวลาของเกมหรือไม่ก็ตาม ในส่วนของ "EDIT: [... ] ฉันได้ปรับปรุงคำถามของฉันใหม่เพื่อให้มันครอบคลุมมากขึ้นกระบวนการที่เกิดขึ้นจริงในการใช้ spritesheet ในเกม" นี่เป็นกระบวนการของฉัน ฉันสร้างไฟล์ JSON ที่เหมาะสมโดยใช้ spritebuddy แล้วแยกวิเคราะห์ในเกมเพื่อรับข้อมูลที่ฉันต้องการ
CletusW

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