AI 2009 Homework#2 งานกลุ่ม แก้ไข map ใหม่ ให้สวยงาม เพิ่มพื้นทราย ( มีรูปให้ แล้ว ) แก้ไขโปรแกรม เส้นทางการเดิน ที่ใช้ A* ดังนี้ กำหนดส่ง วันที่ 20 มกราคม 2553 รูปเล่มรายงาน อธิบาย – หลักการทำงานของ A* – ส่วนของโปรแกรมที่ได้ปรับปรุงแก้ไข พื้นหญ้าพื้นทราย +7 +4
การเรียกโปรแกรม 1.ลง C# 2.ลง XNA 3. unrar TileMap7 4. double click Tilemap.sln
เกี่ยวกับไฟล์ Game1 โปรแกรมหลัก Mymap ส่วนจัดการ map และ A* Myview ส่วนจัดการ view ( แสดงผลส่วนย่อยๆ ของ map) Mypath ส่วนเก็บข้อมูลเส้นทาง path ที่ตัวละคร เดิน Myobject ส่วนจัดการตัวละคร ตำแหน่งของตัว ละคร Mysprite ส่วนจัดการวาดรูปตัวละคร การ เคลื่อนไหว Myutils ฟังก์ชั่นย่อยๆ ต่างๆ
MyMap.cs ตัวละครเดินได้หรือไม่ ขึ้นอยู่กับค่า mapenum // ค่าสถานะของ map public enum mapenum { map_none = 0, map_walk = 1, map_obstracle = 2 }; ภาพในฉากแผนที่ ขึ้นกับค่า mapenumimage public enum mapenumimage { empty=0, block, pira, chest, doorclose, dooropen, //5 grass, grassshadow, rocks, sandgrass1, sandgrass2, //10 sandgrass3, sandgrass4, sandgrass, sandgrass6, sandgrass7, //15 sandgrass8, sandgrass9, sand, wall1, waterwall, //20 watergrass, water, waterref2, waterref3, waterref //25 };
MyMap.cs.2 แต่ล่ะตำแหน่งของ map จะเก็บค่าดังนี้ public struct mapelement { public mapenum maptype; // ประเภทของ map public mapenumimage mapimage; // รูปของ map public float g; // ตัวแปร A* public float h; // ตัวแปร A* public float f; // ตัวแปร A* public int parentX; // ตัวแปร A* public int parentY; // ตัวแปร A* public bool isopenlist; // ตัวแปร A* public bool iscloselist; // ตัวแปร A* public int count; // ตัวแปร A* } public mapelement[,] mapdata; array 2D ของ map public Texture2D[] mappic; array ของ รูป public mypath pathdata; path ที่สร้างโดย A*
Clearmap() ล้างข้อมูล Createmap() สร้างข้อมูลแผนที่ drawmap(Vector2 startpos) วาดแผนที่ clearAstarParams() ล้างข้อมูล A* // A* fn g : g fn มีค่าเพิ่มขึ้นจากการเคลื่อนที่ public float fn_g(int px, int py, int fromX, int fromY) // A* fn h : heuristic fn มีค่าลดลงเมื่อเข้าใกล้ target public float fn_h(int px, int py, int targetX, int target AstarAB(Vector2 a) คำนวณ A จาก ตำแหน่ง a ไปยัง targetX, targetY คือค่าเป็น path
C# XNA : 2D Map Scrolling and others related useful functions Dr.Yodthong Rodkaew RTS + RPG
2D Map in XNA Map as 2D array 1 block of map is struct If map area is larger than screen area ? 64,64 800,600
2D Map in XNA If map area is larger than screen area ? 64,64 800,600 MAP AREA SCREEN AREA
2D Map Scrolling MAP AREA SCREEN AREA Viewport Map[0,0] Screen(0,0) Screen(800,600) Map[w,h]
2D Map Scrolling Screen(0,0) Screen(800,600) Map[20,20]
2D Map Scrolling Screen(0,0) Screen(800,600) Map[10,20]
2D Map Scrolling Screen(0,0) Screen(800,600) Map[10,20]
2D Map to Block Screen(0,0) Screen(800,600) Map[10,20] Mouse Pointer = Map[x,y] ?? Mouse pointer at (400,250)
การใช้ view View สำหรับควบคุม การเลื่อนหน้าจอ
map view View.position View.width View.height Map.width Map.height Mouse.position [Need] -View center at mapblock(x,y) -View moving: up/down/left/right -map mouse to view position, to real mapblock -is_position_in_view(x,y) Map RTS, select & move
view View.position View.width View.height View.center_at_mapblock(int mapx, int mapy) viewx = ________________? viewy = ________________? map (mapx,mapy) View (viewx,viewy) Center of view ต้องการหา viewxy ทราบ mapxy view width height
view View.position View.width View.height View.mouse_to_viewblock(int mousex, int mousey) mapx = ________________? mapy = ________________? map (mapx,mapy) View (viewx,viewy) Mouse Screen(0,0) Screen (800,600) ต้องการหา mapxy ทราบ mousexy view width height
view View.position View.width View.height View.is_position_in_view(int mapx, int mapy) In_view = ________________________? map (mapx,mapy) View (viewx,viewy) ต้องการหา mapxy อยู่ใน view หรือไม่ ทราบ mapxy,viewxy, view width height map (mapx,mapy)
map view View.position View.width View.height Map.width Map.height Move down Task.I: arrow key move view If ( ______ ) { _______________ } Task.II: mouse near border move view If ( ______ ) { _______________ } Move right
view View.position View.width View.height step1 Click & Move Step1: find what hero is clicked [source+hero] Step2: find what area is clicked [target] Step3: get path from A* Step4: make hero move follow a path step2 Step3&4