Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Started by
Topic:   ตัวอย่างเกมส์ pac-man  (Read: 2104 times - Reply: 1 comments)   
AinaveltsaC

Posts: 9 topics
Joined: 25/1/2553

ตัวอย่างเกมส์ pac-man
« Thread Started on 17/2/2553 8:14:00 IP : 110.164.116.217 »
 

 

วิธีการเล่น

ควมคุมทิศทางด้วยปุ่ม W,S,A,D
ในเกมจะให้เราเป็นหมีแพนด้าตามเก็บเหรียนในปราสาทให้ครบตามจำนวนที่กำหนดไว้


ICameraSceneNode* camera = 0;  ประกาศตัวแปรเอาไว้ควบคุมกล้อง


IAnimatedMesh* pac = 0;  ประกาศตัวแปรสำหรับเอาไว้โหลดโมเดล ชื่อpac


IAnimatedMeshSceneNode* pac_node =0;  ประกาศตัวแปรสำหรับควบคุมโมเดล


IGUIFont* g_font;   ประกาศตัวแปรเอาไว้ควบคุมตัวอักษร


int i,j,score=0; ประกาศ ค่าI/J (ใช่ในอาเรย์) score

 

typedef struct  คำสังสร้างลูกบอล(ในที่นี้เป็นโมเดลเหรียญ) 

{
    vector3df pos;
    IAnimatedMesh* ball;
    IAnimatedMeshSceneNode* ball_node;
    bool Active;
}BALLINFO;

 

enum  คำสั่งสร้างแถวขนาด 10x8

{
    menu,play
}gamestatus;
BALLINFO myball[10][8];
IAnimatedMesh* world;
ISceneNode* world_node;
ITriangleSelector* selector;
ISceneNodeAnimator* anim;

 camera = g_engine.smgr->addCameraSceneNode( ); สร้างมุมกล้องแบบมุมมองบุคคลที่3


 g_font = g_engine.guienv->getFont("content/myfont.xml");  โหลดFontเพื่อที่จะนำมาใช้แสดงบนหน้าจอ
 g_engine.device->getFileSystem()->addZipFileArchive("content/map.pk3"); ไฟล์ที่นำมาจากเกม quake3 ส่วนมากจะมีการบีบอัดมาในสกุลpk3ซึ่งสามารถแตกไฟล์ย่อยออกมาเป็น.bspได้โดยคำสั่งด้านบนครับ

 world = g_engine.smgr->getMesh("kamq3dm2.bsp"); เมื่อเราแตกไฟล์pk3แล้ว ขั้นตอนนี้คือการเรียกใช้ไฟล์ .bsp ลงไปในตัวแปร world ครับ
 world_node = g_engine.smgr->addOctTreeSceneNode(world->getMesh(0) );  นำworldมาใส่ในตัวแปลควบคุม

world_node->setScale(vector3df(2,2,2));  กำหนดขนาดของworld

pac = g_engine.smgr ->getMesh("content/model/panda.x");   โหลดโมเดล PAC-MAC (ในที่นี้ใช้เป็นตัวแพนด้า) และกำหนดค่าต่างๆเช่น ขนาด แสง ตำแหน่งเริ่ม และความเร็วในอนิเมท
pac_node = g_engine.smgr->addAnimatedMeshSceneNode(pac);
pac_node->setMaterialFlag(EMF_LIGHTING,false);
pac_node->setPosition(vector3df(500,10,-300));
pac_node->setScale(vector3df(5,5,5));
pac_node->setAnimationSpeed( 30000 );

for(i=0; i<10; i++) กำหนดตำแหน่งที่ว่าเหรียน
     {
         for(j=0; j<8; j++)
        {
            myball[i][j].ball = g_engine.smgr ->getMesh("content/model/coin.x"); โหลดโมเดลเหรียน
            myball[i][j].ball_node = g_engine.smgr->addAnimatedMeshSceneNode(myball[i][j].ball); ใส่ เหรียน ของเราลงไปในตัวควบคุมเพื่อใช้ในการอ้างอิงเวลาเรา เปลี่ยนตำแหน่งหรือย่อขยายขนาด
            myball[i][j].ball_node->setMaterialFlag(EMF_LIGHTING,false);  กำหนดแสงของเหรียน
            myball[i][j].ball_node->setRotation(vector3df(0,180,0)); กำหนดมุมว่าจะให้เหรียนค้างในมุมให้
            myball[i][j].ball_node->setScale(vector3df(20.0f,20.0f,20.0f));กำหนดขนาดเหรียน
            myball[i][j].pos.X = (100.0f*(i+1))+300;    กำหนดระยะห่างระหว่างเหรียนในแนวแกนx
            myball[i][j].pos.Y = 70;กำหนความสูงลอยจากพื้น
            myball[i][j].pos.Z = (100.0f*(j+1))-2000;        กำหนดระยะห่างระหว่างเหรียนในแนวแกนz            myball[i][j].ball_node->setPosition( myball[i][j].pos ); กำหนดเหรียนทุกอันมีค่าตำแหน่งเท่ากับ ที่เรากำหนดไว้ใน pos.x/y/z ด้านบน

            myball[i][j].ball_node->setAnimationSpeed(10000); กำหนดความเร็วอนิเมชั่น
            myball[i][j].Active = true;    เตัวกำหนดว่าเหรียนมีค่าactiveอยู่เอาไปใช้ในเช้คชน

        }
     }

void cameraupdate() ล็อกมุมกล้องไม่ให้หันตามเม้า
{
    vector3df pos = pac_node->getPosition( );
    camera->setTarget( pos );
    pos += vector3df(0, 250, -250);
    camera->setPosition(  pos );
}

void text() คำสังสร้างfontให้แสดงผลบนหน้าจอ
{
wchar_t scoretext[256];
    swprintf( scoretext, 256,L"Score : %d",score ); สร้างคำว่า Score
    g_font->draw( scoretext, rect(250,40,250,40), SColor(255,255,255,0) ); กำหนดขอบเขตกล้องข้อมความ แล้วกำหนดสี
    if(score >= 50 )
    {
        g_font->draw( L"You Win", rect(250,80,250,80), SColor(255,255,255,0)); สร้างคำว่าYou Win ขึ้นบนหน้าจอเมือเก็บแต่มได้มากกว่า50และกำหนดขอบเขตและสี
    }
}

void keyboardcontrol() สร้างตัวควบคุมPac-Man
{

    if(g_input.keyDown(KEY_KEY_W)) เมื่อกดw
    {
        move_ex(camera,pac_node,vector3df(0,0,5)); ทำให้ัตัวละครเดินขึ้นและหันหน้าขึ้น
        pac_node ->setRotation(vector3df(0,180,0));
    }
    if(g_input.keyDown(KEY_KEY_S)) เมื่อกดs
    {
        move_ex(camera,pac_node,vector3df(0,0,-5)); ทำให้ัตัวละครเดินลงและหันหน้าลง
        pac_node ->setRotation(vector3df(0,0,0));
    }
    if(g_input.keyDown(KEY_KEY_A)) เมื่อกดa
    {
        move_ex(camera,pac_node,vector3df(-5,0,0)); ทำให้ัตัวละครเดินไปทางซายและหันหน้าไปทางซาย
        pac_node ->setRotation(vector3df(0,90,0));
    }
    if(g_input.keyDown(KEY_KEY_D)) เมื่อกดd
    {
        move_ex(camera,pac_node,vector3df(5,0,0));ทำให้ัตัวละครเดินไปทางขวาและหันหน้าไปทางขวา
        pac_node ->setRotation(vector3df(0,270,0));
    }
    if(g_input.keyDown(KEY_KEY_S) && g_input.keyDown(KEY_KEY_A))  เมื่อกด s /a พร้อมกัน
    {
        pac_node ->setRotation(vector3df(0,45,0));   ทำให้ัตัวละครหันเฉียงซ้ายล่าง
    }
    else if(g_input.keyDown(KEY_KEY_A) && g_input.keyDown(KEY_KEY_W)) เมื่อกด a /w พร้อมกัน
    {
        pac_node ->setRotation(vector3df(0,135,0));  ทำให้ัตัวละครหันเฉียงซ้ายบน
    }
    else if(g_input.keyDown(KEY_KEY_W) && g_input.keyDown(KEY_KEY_D)) เมื่อกด w /d พร้อมกัน
    {
        pac_node ->setRotation(vector3df(0,225,0));  ทำให้ัตัวละครหันเฉียงขวาบน
    }
    else if(g_input.keyDown(KEY_KEY_S) && g_input.keyDown(KEY_KEY_D)) เมื่อกด s /d พร้อมกัน
    {
        pac_node ->setRotation(vector3df(0,315,0));  ทำให้ัตัวละครหันเฉียงขวาล่าง
    }
}

 void hit()  ตัวเช็คชน
{
     for(i=0; i<10; i++)
     {
         for(j=0; j<8; j++)
        {
            if(collision(myball[i][j].ball_node,pac_node))เช็คว่าpac-manชนเหรียน
            {
                if(myball[i][j].Active == true)ถ้าเหรียนมีค่าactiveเป็นtrueค่าscoreจะบวกเพิ่ม1และเปรียนค่าactiveเป็นfalse
                {
                    score++;
                }
                myball[i][j].Active = false;
                
            }
            if(myball[i][j].Active == false) เมื่อค่าactiveกลายเป็นfalse

            {
                myball[i][j].ball_node->setVisible(false); สังให้เหรียนนั้นหายไป
            }
        }
     }
}

 

if(gamestatus == play) เช็คสถานะว่าเป็นplayหรือไม่ถ้าใช้ให้เรียกใช้ ฟังชั่นสามตัวข้างใน

    {
        cameraupdate();
        keyboardcontrol();
        hit();
    }

 
   Link to Post - Back to Top

Bookmark and Share

กรุณาเข้าสู่ระบบหรือสมัครสมาชิกก่อนโพสข้อความค่ะ
»
คลิ๊กที่นี่
   Main webboard   »   Irrlicht
 ย้อนกลับ  |  ตั้งกระทู้ใหม่  
Advertising Zone    Close

ด้วยความปราถนาดีจาก "สยามทูเว็บดอทคอม" และเพื่อป้องกันการเปิดเว็บไซต์เพื่อหลอกลวงขายของ โปรดตรวจสอบร้านค้าให้แน่ใจก่อนตัดสินใจซื้อของทุกครั้งนะคะ    อ่านเพิ่มเติม ...