วันพุธที่ 8 มกราคม พ.ศ. 2563

[Action Script 2.0]สร้าง gravity ระบบ physic เพื่อต้นแบบ platform game แบบ mario

สร้าง Movie Clip มา 2 ตัว ตัวแรกตั้ง instance ว่า ground เป็นพื้น อีกตัวชื่อ sprite เป็นตัวละครของเรา

คลิ๊กขวาที่ movieclip sprite แล้วเลือก action

ฟังก์ชั่น onload เพื่อตั้งค่าเริ่มต้น


onClipEvent(load)
{
 gravity = 0; //แรงโน้มถ่วง

 jumping = false; //ตั้งค่าว่ายังไม่โดด
 jumpheight = 10; //ความสูงตอนกระโดด
}


ใน enterframe ใส่ code เพื่อจัดการแรงโน้มถ่วงดังนี้


onClipEvent(enterFrame)
{

if(!_root.ground.hitTest(_x, _y, true)) //ตัวละครเท้าไม่ติดพื้น
 {
  gravity++; //เกิดแรงโน้มถ่วง
  _y += gravity;//ค่าแกน y เริ่มเยอะขึ้น
 } else //เมื่อเท้าติดพื้นให้ตั้งค่าเป็น 0
 {
  jumping = false;
  gravity = 0;
 }
 //วนลูป set ค่า ตัวละคร อยู่ในตำแหน่ง บนพื้น (ค่าy-ความสูงตนเอง)
 while(_root.ground.hitTest(_x, _y - _height, true))
 {
  jumping = false;
  _y--;
 }

}

ตอนนี้ เราได้ระบบ physic สำหรับทำเกมต่างๆแล้ว
ต่อมาจะทำการเขียน code ส่วนควบคุมตัวละคร
ใส่ keydown เพื่อกระโดดลงไป

if(Key.isDown(Key.UP) && !jumping) // ใส่ เพื่อไม่ให้กด โดดซ้ำได้
 {
  gravity = -jumpheight;
  jumping = true;
 }


 ใส่ code เดินซ้ายขวา

if(Key.isDown(Key.RIGHT))
 {
  _x += 5;
 }

 if(Key.isDown(Key.LEFT))
 {
  _x -= 5;
 }


สรุป code ทั้งหมดด้านล่างนี้

----------------------------------------------------------

onClipEvent(load)
{
 gravity = 0;
 jumping = false;
 jumpheight = 15;
}

onClipEvent(enterFrame)
{
 if(Key.isDown(Key.RIGHT))
 {
  _x += 5;
 }

 if(Key.isDown(Key.LEFT))
 {
  _x -= 5;
 }

 if(Key.isDown(Key.UP) && !jumping)
 {
  gravity = -jumpheight;
  jumping = true;
 }

 if(!_root.ground.hitTest(_x, _y, true))
 {
  gravity++;
  _y += gravity;
 } else
 {
  jumping = false; 
  gravity = 0;
 }

 while(_root.ground.hitTest(_x, _y +_height , true))
 {
  jumping = false;
  _y--;
 }

}








1 ความคิดเห็น:

  1. เขียนอีกแบบ ถ้าไม่อยกเขียน loop while เพราะ enterframe ก็เหมือนเป็น loop อยู่แล้ว ตอน hittest ก็ใส่ _y+height ไปเลย

    if(!_root.ground.hitTest(_x, _y+_height, true))
    {
    gravity++;
    _y += gravity;
    } else
    {
    jumping = false;
    gravity = 0;
    _y--;
    }

    ตอบลบ