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

posted on 09 Jan 2008 10:52 by xnanoob  in Tutorials
สวัสดีค่า

จากวันก่อนก้องงๆ กับลำดับการวาดภาพในสองมิติ

ครั้งก่อนโน้น ใช้การวาดสองครั้ง แต่การเรียกใช้ method draw สองครั้งนั้นคงไม่ค่อยมีสไตล์เท่าไหร่

ก้อได้รับความช่วยเหลือจากคุณ "boheman" มาอะงิ ต้องขอขอบคุณมา ณ ที่นี้ด้วย

ใน XNA มี method Draw ที่ overload ตั้งหลายอันให้ใช้นะค่ะ

คุณ boheman แนะนำให้ใช้ LayerDepth เข้ามาช่วยก้ออโอเคเลย..  ทำให้ในการวาดรูปเรียกใช้ method draw เพียงครั้งเดียว  (คือเรียกใช้ SpriteBatch.Draw ครั้งเดียวแระ)

LayerDepth ก้อแบบว่าใน photoshop ที่รูปเราเป็น layerๆ อะ หรือไม่ก้อนึกแบบที่อ.ปิ้งแผ่นใสตอนสอนหนังสือที่วางๆ หน้าห้องเรียน

แต่ก่อนอื่นในการใช้นั้นต้องกำหนดใน SpriteBatch.Begin ให้เป็นแบบข้างล่างนะ เพื่อกำหนดให้มันทำงานได้

ไม่งั้นไม่รู้เหมือนกันว่าทำไมไม่มีผลกระทบของการแสดงแบบ layer

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.None);

กำหนดใน Spritebatch.Begin ก่อนนะ

spriteBatch.Draw(Door, new Vector2(500, 300),null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0.6f);

กำหนดให้ ประตูมี layer ที่ 0.6  อันนี้ก้อกำหนดเอาเอง ค่าอยู่ระหว่าง 0 ถึง 1 นะ

 - ก้อแบบว่า 0.99 ก้อวาดหลังสุด

 - 0.01 ก้อวาดก่อน ไรแบบเนี้ย

if (Position.Y+Img.Height > 372){

LayerDepth = 0.7f;

}

ตัวอย่างการเช็ค คือ ในตัวอย่างนี้ประตูมีพิกัดในแกน Y อยู่ที่ 372
ถ้ามันมากกว่าก้อเช็ค ให้ LayerDepth เป็น 0.7 คือวาดหลัง


รูป A.) ทีน่าไปหลบหลังประตู   (ประตูวาดหลัง)  และ B.) ทีน่าวาดหลัง


จบแระค่ะ บายค่ะ ... เฮือก


โคสะนา : เปิด อบรม เรียน สอน การเขียนโปรแกรมด้วยภาษา PHP+MySQL ในรูปแบบของ OOP สนใจติดต่อ
http://www.asiamediasoft.net นะค่ะ

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

สูบเก็บไว้ก่อนล่ะเด้อค้าบ...

แต่ยังไม่รู้เลยว่าจะได้ใช้เมื่อไร...T^T

#1 By robocon on 2008-01-09 12:09