วันอังคารที่ 12 เมษายน พ.ศ. 2554

Basic Side Scrolling Game 2 ต่อ

จากตัวอย่างที่แล้ว 

อันนี้เราเพิ่้มพวกการเช็คชนและระบบฟิสิกส์เข้าไปนิดหน่อยนะครับ โดยเพิ่มโคทและแก้ตรงโน้นนิดตรงนี้หน่อยเข้าไป มาดูกันว่ามีไรเพิ่มบ้าง


ภายในซิมโบลตัวละครของเรา เราสร้างซิมโบลสี่เหลื่ยมขึ้นมาแล้วใส่ชื่อ instance เข้าไปแล้ววางตำแหน่งประมาณนี้ กล่องพวกนี้เราเอาไว้ให้ตัวละครของเราเช็คชนด้านต่างๆ

ตรงคีย์เฟรมแรกในตัวละคร ประกาศตัวแปรนี้ลงไป

var VelY = 0; // แรงเฉื่อยแนว Y
var VelX = _x; // แรงเฉื่อยแนว X
var OnAir = true; // ตัวแปรไว้เก็บค่าสำหรับเช็คว่าลอยอยู่กลางอากาศหรือเปล่า


ตรงซิมโบลกล่องสี่ส้มๆคือตัวเช็คชน สร้างเฟรมที่ 2 แล้วใส่คำสั่ง

_root.BlockList[_root.NumBlock] = this;
_root.NumBlock += 1;
stop();


เว้นเฟรมแรกไว้เฉยๆนะ

กลับมาดูที่ scene หลักสร้างฟังชั่นสำหรับเช็คชน 



function WorldCheck(obj) {
obj.OnAir = true;
obj._y += obj.VelY;
obj._x += (obj.VelX-obj._x)/10;
for (i=0; i<_root.BlockList.length; i++) {
if (obj.Bfloor.hitTest(_root.BlockList[i])) {
obj._y = _root.BlockList[i]._y;
obj.OnAir = false;
}
if (obj.Bhead.hitTest(_root.BlockList[i])) {
obj.VelY = Gravity;
}
if (obj.Bleft.hitTest(_root.BlockList[i])) {
obj.VelX = obj._x;
obj._x = obj._x+(2*obj._xscale/Math.abs(_xscale));
}
if (obj.Bright.hitTest(_root.BlockList[i])) {
obj.VelX = obj._x;
obj._x = obj._x-(2*obj._xscale/Math.abs(_xscale));
}
}
if (obj.OnAir) {
obj.VelY += _root.Gravity;
}
}


ที่ต้องสร้างเป็นฟังชั่นเพราะเผื่อไว้ให้พวกตัวละครอื่นๆ หรือ NPC ไว้เช็คชนด้วย




player คือชื่อ instance ของซิมโบลตัวละครเรา



ตรง Frame 1


var Speed:Number = 5;
var BlockList:Array = new Array(); // ตัวแปรไว้เก็บ list ของตัวเช็คชน
var Gravity = 1;
var NumBlock = 0;
เว้นเฟรมแรก 1 เฟรมแล้วสั่ง stop ที่ frame 2 เพราะว่าเอาไว้ประกาศตัวแปรเริ่มต้น
เช่น HP MP SP mana อะไรต่อมิอะไรที่เกมใช้และฟังชั่นต่างๆเป็นส่วน Initialize

onEnterFrame = function () {
if (Key.isDown(Key.LEFT)) {
_root.player._xscale = 100; 
_root.player.VelX -= Speed;
_root.player.gotoAndPlay("run");
}
if (Key.isDown(Key.RIGHT)) {
_root.player._xscale = -100;
_root.player.VelX += Speed;
_root.player.gotoAndPlay("run");
}
if (Key.isDown(Key.UP)) {
if (!_root.player.OnAir) {
_root.player.VelY = -20;
_root.player.OnAir = true;
}
}
if (_root.player._x>=800) {
_root.player._x = 10;
_root.player.VelX = _root.player._x;
_root.NumBlock = 0;
_root.nextFrame();
}
if (_root.player._x<=0) {
_root.player._x = 790;
_root.player.VelX = _root.player._x;
_root.NumBlock = 0;
_root.prevFrame();
}


_root.WorldCheck(_root.player);

//เรียกใช้ฟั้งชั่นเช็คชนที่เราทำไว้ ใส่ชื่อของตัวละครเราเข้าไป สำหรับพวก NPC อื่นๆ ก็แค่ประกาศ//ชื่อ instance ซะแล้วส่งค่าไปแบบ player นี้แหละ


};




โหลดตัวอย่างไปดูดีกว่า






ไม่มีความคิดเห็น:

แสดงความคิดเห็น