ปัญหาบ่อน้ำ (Draw Order)

posted on 08 Jan 2008 13:53 by xnanoob  in Tutorials

สวัสดีค่า

วันนี้มามั่วกับปัญหาลำดับการวาดภาพนะค่ะ ในการจัดอันดับการวาดภาพนั้นในสองมิติ

ใครมาก่อนก้อจะโดนวาดก่อนนะ   ใครมาหลังก้อโดนวาดหลัง

วาดหลังนั้นหมายถึงว่า วาดทับ ทับภาพที่วาดไป


ภาพที่1 แสดงภาพบ่อน้ำวาดหลังตัวละคร

เพราะฉะนั้นภาพบ่อน้ำก้อจะทับตัวละคร ในภาพที่1.A) นั้น เหมือนจะแสดงผลผิดพลาด
แต่ในส่วนของภาพที่ 1.B) นั้น เป็นสิ่งที่เราต้องการ เพราะตัวละครยืนอยู่ส่วนบนของบ่อ

การแก้ไขนั้น ถ้าเราให้ตัวละครวาดหลัง ก้อจะแก้ปัญหาในภาพ A ได้ แต่ในกรณี B
ก้อจะมีปัญหาสลับกันเกิดขึ้นมา (นึกภาพตามเองเองนะ)

ดังนั้นลองแก้ปัญหาแบบชาวบ้านๆ คือหาพิกัดในแนวแกน Y ที่เป็นจุดสูงสุดของขอบบ่อ
และทำการวาดอีกครั้งหนึ่ง

spriteBatch.Begin();
// วาดบ่อ
spriteBatch.Draw(well, new Vector2(200, 140), Color.White);

// วาดตัวละคร
spriteBatch.Draw(Actor, Position, Color.White);

if (Position.Y < 162){
spriteBatch.Draw(well, new Vector2(200, 140), Color.White);
}

spriteBatch.End();




หาพิกัด ตัวอย่าง พิจารณาแกน Y ที่ความสูงคือ 162



ผลการทดลอง

 

จบแระค่ะ บายค่ะ

ปล. ใครมีวิธีอื่นๆ บ้างแนะนำหน่อยนะค่ะ เพราะถ้ามีของในฉากเยอะคงไม่ดีแน่นอน เฮือก งุงิ งุงิ


โคสะนา : บริการเว็บไซด์สำเร็จรูป ใช้งานง่ายม๊ากมาก จริงๆ นะค่ะ  เพียงคุณติดต่อไปและแจ้งว่าได้ข่าวจาก XNANOOB ลดทันที 10% ขอบคุณค่ะ   กดเลย http://www.smewell.com

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

รู้สึกปกติเค้าจะแยกเป็น object ไปเลย แล้วตรวจทีเดียว วาด object ละครั้งก็พอครับ
งึมๆๆ

#2 By FF6 (58.8.124.235) on 2008-01-08 16:23

#1: งงอยู่ดิ งิ

#3 By xnanoob on 2008-01-08 22:09

ลองใช้ layerDepth จะเหมาะกว่านะครับ แล้ว XNA จะจัดการลำดับการวาดให้เอง

public void Draw(Texture2D texture, Rectangle destinationRectangle, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, SpriteEffects effects, float layerDepth);

เวลาตัวละครเคลื่อนที่ เราก้อ update ค่า layerDepth ของตัวละครตามตำแหน่งของมัน

#4 By boheman (67.129.148.82) on 2008-01-09 02:02

#4 By boheman : ขอบคุณ คุณ boheman มากนะค่ะ

ได้แล้วค่ะ แบบนี้ใน method Draw ก้อวาดครั้งเดียวแล้ว ดูมีสไตล์ขึ้นเยอะ งุงิ

#5 By xnanoob on 2008-01-09 10:26

ขอตัวอย่างการใช้ layerdepth หน่อยสิครับ เดาไม่ถูกครับ

#6 By xnapadawan (203.107.169.250) on 2008-05-08 16:51

โทดทีครับ ลืมไปว่าอ่าน blog เก่า เห็นมีโพสไว้แระ

#7 By xnapadawan (203.107.169.250) on 2008-05-08 16:52