การเขียนโปรแกรมด้วย PocketC# ตอนที่ 10-Game:III

เพื่อความสนุกสนานยิ่งขึ้น คราวนี้เราจะมาเขียนเครื่องบินศัตรูสักลำหนึ่ง หลักการสร้างก็เช่นเดียวกับเครื่องบินสีฟ้าของเรา นั่นคือ สร้าง sprite ของเครื่องบินศัตรู แล้ววาดรูปลงบน sprite กำหนดการเคลื่อนที่ของเครื่องบินศัตรูซึ่งใช้วิธีเดียวกันกับเครื่องบินของเรา คือกำหนดให้เครื่องบินศัตรูบินไปยังจุดควบคุม หรือ controlX,Y ซึ่งจะทำให้สะดวกต่อการกำหนดโปรแกรมการโจมตีได้หลาย ๆ แบบด้วยการปรับเปลี่ยน controlX,Y ตามที่เราต้องการครับ

This time, I will add an enemy plane by create enemy sprite, enemy position and control position, in the same way as my blue plane.

ขอให้เพื่อน ๆ เพิ่มคำสั่งลงใน class grx : Form เพื่อกำหนด sprite และตำแหน่งควบคุมของเครื่องบินศัตรูดังนี้

…

class grx : Form

{

…

Bitmap spriteEnemy =new Bitmap(60,60);

…

//enemy position

int enemyX,enemyY;

//enemy control position

int enControlX, enControlY;

…

จากนั้นเราจะวาดรูปเครื่องบินศัตรู โดยเพิ่มคำสั่งลงใน method initSprite() ดังนี้

private void initSprite()

{

//my plane

…

//enemy plane

enemyX=240;

enemyY=0;

enControlX=100;

enControlY=200;

gr=Graphics.FromImage(spriteEnemy);

gr.FillRectangle(new SolidBrush(Color.Violet),21,5,8,35);

gr.FillRectangle(new SolidBrush(Color.Green),4,2,45,10);

gr.FillRectangle(new SolidBrush(Color.Green),13,5,25,7);

gr.FillRectangle(new SolidBrush(Color.Cyan),22,22,6,9);

gr.Dispose();

}

ต่อมาเราก็มาเพิ่มในส่วนการเคลื่อนที่ของเครื่องบินศัตรูลงใน method OnTimerTick(..) เช่นเดียวกันการเคลื่อนที่ของเครื่องบินของเรา และเพื่อให้ง่ายแก่การเขียนและอ่านโปรแกรม เราจะแยกการเคลื่อนที่ของเครื่องบินของเราและเครื่องบินของศัตรู ออกเป็น method ต่างหาก ขอให้เพื่อน ๆ copy code ในส่วนการเคลื่อนที่ของเครื่องบินของเรา ตั้งแต่ if(spriteX<controlX)….จนถึง spriteY-=3; ออกไปเป็น method ใหม่ ชื่อว่า myPlaneMove() ครับ

In OnTimerTick() I move all codes of myPlane sprite movement into new method called myPlaneMove() and create new method called enemyMove().Please notice that the enemy plane moves in X-axis slower than my blue plane.

แล้วเพิ่ม method enemyMove() โดยใช้แนวทางเดียวกับ myPlaneMove() เพียงแต่ให้การเคลื่อนที่ของเครื่องบินศัตรูบินช้ากว่าของเราเล็กน้อยดังนี้ครับ

private void enemyMove()

{

if(enemyX<enControlX)

enemyX+=1;

if(enemyX>enControlX)

enemyX-=1;

if(enemyY<enControlY)

enemyY+=3;

if(enemyY>enControlY)

enemyY-=3;

}

จะเห็นว่าเครื่องบินศัตรูจะบินในแนวแกน X ช้ากว่าเครื่องบินของเราครับ ทั้งนี้เพื่อให้เราสามารถใช้ฝีมือหลบหลีกได้ง่ายขึ้นนั่นเอง

ในส่วนการวาด sprite ของเครื่องบินทั้งสองลำ เพื่อความสะดวกขอให้เพื่อน ๆ แยกคำสั่งในการวาด sprite ออกไปรวมเป็น method ต่างหากชื่อ drawAllPlanes() ดังนี้

private void drawAllPlanes()

{

//draw myplane

imgattr.SetColorKey(spritePlane.GetPixel(0,0),spritePlane.GetPixel(0,0));

grBuffer.DrawImage(spritePlane,new Rectangle(spriteX,spriteY,60,60),0,0,60,60,GraphicsUnit.Pixel,imgattr);

//draw enemy plane

imgattr.SetColorKey(spriteEnemy.GetPixel(0,0),spriteEnemy.GetPixel(0,0));

grBuffer.DrawImage(spriteEnemy,new Rectangle(enemyX,enemyY,60,60),0,0,60,60,GraphicsUnit.Pixel,imgattr);

}

เมื่อเรียบร้อยแล้วจะเห็นว่าโปรแกรมในส่วน method OnTimerTick() จะดูง่ายมากครับ

I move all sprites drawing into a new method called drawAllPlanes() ,so the OnTimerTick() method is easy to read.

private void OnTimerTick(object sender, EventArgs evArgs)

{

myPlaneMove();

enemyMove();

updateBackground();

drawAllPlanes();

Invalidate();

grBuffer.Dispose();

}

เมื่อ build และ run เครื่องบินสีฟ้าของเราจะบินจากจุด 0,0 มายังจุดล่างกลางจอ ในขณะที่เครื่องบินศัตรูจะบินจากนอกจอทางขวาลงมาเผชิญหน้ากับเครื่องบินของเราแล้ว อุ๊ย ตื่นเต้น ตื่นเต้น

ต่อไปเป็นส่วนที่สนุกมากครับ คือการตั้งโปรแกรมโจมตีให้เครื่องบินศัตรู ศัตรูจะเก่งและฉลาดแค่ไหนขึ้นกับโปรแกรมส่วนนี้ครับ ถ้าศัตรูฉลาดมากไป เกมจะยาก เล่นไม่สนุก แต่ถ้าศัตรูโง่มาก เกมจะง่ายเกินไป และไม่สนุกเช่นกันครับ ขอให้เพื่อน ๆ เพิ่ม method enemyAttack() ดังนี้ครับ

private void enemyAttack()

{

enControlX=controlX;

enControlY=320;

if(enemyY>300)

enemyY=0;

}

จากที่กล่าวแล้ว การกำหนดการโจมตีของเครื่องบินศัตรูทำได้ง่าย ๆ โดยการกำหนดเป้าหมาย enControlX,Y ให้เครื่องบินศัตรูบินไปยังจุดที่ต้องการนั่นเอง ในที่นี้ผมกำหนดให้เครื่องบินศัตรูบินพุ่งเข้าชนเครื่องบินของเราแบบ kamikaze เลย โดยกำหนดจุด enControlX ให้ เท่ากับ controlX คือไม่ว่าเครื่องบินเราจะอยู่ที่ไหนซ้ายหรือขวา เครื่องบินศัตรูจะบินเข้าหาทันที (แต่บินช้ากว่าเราเล็กน้อยเพราะเรากำหนดใน method enemyMove() ให้ศัตรูบินในแนวแกน X ทีละ 1 pixels ในขณะที่เราบินทีละ 3 pixels อิอิ) โดยกำหนดให้ enControlY=320 หมายถึงให้บินจากด้านบนของจอลงมาทางด้านล่างขอจอภาพ และกำหนดเงื่อนไขว่าหากเครื่องบินศัตรูบินพ้นจอภาพด้านล่างไปแล้วให้ไปเริ่มบินใหม่จากบนสุดของจอภาพ ทำดังนี้ไปเรื่อย ๆ ครับ

I add enemyAttack() method to order the enemy plane to attack my blue plane. The enemy plane will head to my blue plane in kamekaze way until it flies pass the bottom of screen. You can write your own attacking style in enemyAttack() method.

 

ขอให้เพื่อน ๆ ลอง build และ run แล้วลองบังคับเครื่องบินของเราหลบหลีกอย่าให้ถูกศัตรูชนได้ครับ สนุกไหมครับ

 

นี่ก็เป็นรูปแบบการโจมตีแบบหนึ่งครับ เพื่อน ๆ อาจกำหนดรูปแบบการโจมตีได้ตามต้องการเลยครับ เช่น อาจกำหนดตำแหน่งสุ่มของการปรากฏของเครื่องบินศัตรูโดยใช้ Random() หรือการกำหนดให้เครื่องบินศัตรูบินแบบซิกแซกไป ๆ มา ๆ ฯลฯ โดยเขียน code ใน enemyAttack() แล้วลองเล่นดูว่าสนุกมั้ย

Next time, I will write about collision detection and add some explosions and sound effects.

พอเล่นไปสักพักจะเห็นว่าแม้เครื่องบินสีฟ้าของเราจะถูกเครื่องบินศัตรูชนแล้วก็ไม่มีอะไรเกิดขึ้น ทั้งนี้เพราะยังขาดกระบวนการตรวจสอบการชน คราวหน้าเราจะมากำหนดวิธีการตรวจจับการชน รวมทั้งอาจจะใส่ภาพเครื่องบินระเบิดและเสียงประกอบด้วยครับ

ขอให้สนุกครับ

[email protected]

21 สิงหาคม 2550

 

 

 

 

 

 

 

Hosted by www.Geocities.ws

1