วันพุธที่ 10 มีนาคม พ.ศ. 2553

Dota

Dota
1. ผู้เล่นมี ยูนิด 3 ประเภทคือ
1.1 Hero unit
1.2 Keeper unit
1.3 Base unit
2.Hero จะโจมตีก็ต่อเมื่้อไปคลิกที่ศัตรูเท่านั้น
3.Keeper จะไปเก็บ energy pack โดยการคลิก energy pack จะเกิดแบบสุ่ม
4.ถ้า energy pack อยู่ที่ 10 , 20 และ 30 Base unit จะเป็น ขั้น 1 ,ขั้น2 และ ขั้น 3 = ชนะ
4.1 ในแต่ละขั้นจะหน้าตาไม่เหมือนกัน
5.ศัตรูจะโจมตี Base ถ้าเลือด เท่ากับ 0 ก็จะแพ้เกม
6. แสดงคะแนนของ energy pack บนหน้าจอ


Code

selector = g_engine.smgr->createTerrainTriangleSelector( terrain );
terrain->setTriangleSelector(selector);
selector->drop();

anim = g_engine.smgr->createCollisionResponseAnimator( selector, myhero.hero_node );
myhero.hero_node->addAnimator(anim);


anim = g_engine.smgr->createCollisionResponseAnimator( selector, myseeker.seeker_node );
myseeker.seeker_node->addAnimator(anim);


anim->drop();


ทำให้ตัวละครเดินติดกับพื้น

if(g_input.mouseX()>620&&g_input.mouseX()<640)>setPosition(mymove.pos); }
if(g_input.mouseX()<20&&g_input.mousex()>0)
{ mymove.pos.X-=10;
mymove.move_node->setPosition(mymove.pos); }
if(g_input.mouseY()<20&&g_input.mousey()>0)
{ mymove.pos.Z+=10;
mymove.move_node->setPosition(mymove.pos); }
if(g_input.mouseY()>460&&g_input.mouseY()<480)>setPosition(mymove.pos); }


ใช้ mouse คลิกแล้วเดิน

vector3df pos = mymove.move_node->getPosition( );
camera->setTarget( pos );
pos += vector3df(0,1000, -500);
camera->setPosition( pos );


ทำมุมมองแบบบุคคลที่ 3

if( g_input.leftMousePressed() )
{

ISceneNode * SelectedNode = g_engine.smgr->getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB(g_engine.device->getCursorControl()->getPosition(),0,true);
if(SelectedNode==myhero.hero_node)
choose=1;
if(SelectedNode==myseeker.seeker_node)
choose=2;

const position2di clickPosition = g_engine.device->getCursorControl()->getPosition();
const line3df ray = g_engine.smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(clickPosition, g_engine.smgr->getActiveCamera());
vector3df desiredPosition;
triangle3df outTriangle;

if(g_engine.smgr->getSceneCollisionManager()->getCollisionPoint(ray, selector, desiredPosition, outTriangle))
{
if(choose==1)
{
myhero.pos2.X=desiredPosition.X;
myhero.pos2.Z=desiredPosition.Z;
}
if(choose==2)
{
myseeker.pos2.X=desiredPosition.X;
myseeker.pos2.Z=desiredPosition.Z;
}
}
}

กำหนดว่าเลือกอะไรอยู่ แล้วถ้าคลิก mouse ก็จะเป็นการกำหนดตำแหน่งที่จะเดินไป

//move hero
if(myhero.pos.X<=myhero.pos2.X) myhero.pos.X+=7; if(myhero.pos.X>myhero.pos2.X)
myhero.pos.X-=7;
if(myhero.pos.Z<=myhero.pos2.Z) myhero.pos.Z+=7; if(myhero.pos.Z>myhero.pos2.Z)
myhero.pos.Z-=7;
myhero.hero_node->setPosition(myhero.pos);

//move seeker
if(myseeker.pos.X<=myseeker.pos2.X) myseeker.pos.X+=5; if(myseeker.pos.X>myseeker.pos2.X)
myseeker.pos.X-=5;
if(myseeker.pos.Z<=myseeker.pos2.Z) myseeker.pos.Z+=5; if(myseeker.pos.Z>myseeker.pos2.Z)
myseeker.pos.Z-=5;
myseeker.seeker_node->setPosition(myseeker.pos);


ขยับตัวละครที่เลือกอยู่ไปในตำแหน่งที่คลิก mouse

if(energy%2==0&&energy!=0&&myrune[0].Active==false&&myrune[1].Active==false&&myrune[2].Active==false&&myrune[3].Active==false&&myrune[4].Active==false&&myrune[5].Active==false)
{
for(i=0; i<6; active =" true;">setVisible( true );
}
cr=rand()%3;
}

กำหนดให้ energy pack สุ่มตำแหน่ง

switch(cr)
{
case 0:
{
for(i=0; i<6;> myseeker.pos.X-distance && myrune[i].pos.X <> myseeker.pos.Z-distance && myrune[i].pos.Z < compare =" myrune[i].Active;" active =" false;" 3="=">setVisible( false );}
}
}
}break;
case 1:
{
for(i=0; i<6;> myseeker.pos.X-distance && myrune[i].pos.X <> myseeker.pos.Z-distance && myrune[i].pos.Z < compare =" myrune[i].Active;" active =" false;" 3="=">setVisible( false );}
}
}
}break;
case 2:
{
for(i=0; i<6;> myseeker.pos.X-distance && myrune[i].pos.X <> myseeker.pos.Z-distance && myrune[i].pos.Z < compare =" myrune[i].Active;" active =" false;" 3="=">setVisible( false );}
}
}
}break;
default: break;
}


กำหนดเลเวลของ energy pack

if(energy==10)
{
mybase1.base1_node->setVisible(false);
mybase2.base2_node->setVisible(true);
}
if(energy==20)
{
mybase2.base2_node->setVisible(false);
mybase3.base3_node->setVisible(true);
}


เปลี่ยนรูปร่างของฐาน

for(j=3;j<6;>300&&mykeep[j].pos.Z>-600)
mykeep[j].pos.Z-=0.1;
if(mykeep[j].pos.X>300&&mykeep[j].pos.Z<-600) mykeep[j].pos.Z+=0.1; mykeep[j].keep_node->setPosition(mykeep[j].pos);
}
for(j=0;j<3;>800)
mykeep[j].pos.X-=0.1;
if(mykeep[j].pos.Z>-600)
mykeep[j].pos.Z-=0.5;
mykeep[j].keep_node->setPosition(mykeep[j].pos);
}

กำหนดให้ศัตรูเดินมาที่ฐาน

for(j=0;j<6;> myhero.pos.X-distance2 && mykeep[j].pos.X <> myhero.pos.Z-distance2 && mykeep[j].pos.Z < x="">myhero.pos.X)
mykeep[j].pos.X-=0.5;
if(mykeep[j].pos.Zmyhero.pos.Z)
mykeep[j].pos.Z-=0.5;
mykeep[j].keep_node->setPosition(mykeep[j].pos);
}
}
}

ศัตรูเดินไปหา Hero

for(j=0;j<6;> myseeker.pos.X-distance2 && mykeep[j].pos.X <> myseeker.pos.Z-distance2 && mykeep[j].pos.Z < x="">myseeker.pos.X)
mykeep[j].pos.X-=0.5;
if(mykeep[j].pos.Zmyseeker.pos.Z)
mykeep[j].pos.Z-=0.5;
mykeep[j].keep_node->setPosition(mykeep[j].pos);
}
}
}

ศัตรูเดินไปหา seeker

for(j=0;j<6;> 800-distance && mykeep[j].pos.X <> -600-distance && mykeep[j].pos.Z < -600+distance) { compare = mykeep[j].Active; mykeep[j].Active = false; if(compare != mykeep[j].Active) bhp--; } if( !mykeep[j].Active ) {mykeep[j].keep_node->setVisible( false );}
}
}


ศัตรูชนกับฐานแล้วเลือดลดลงไป 1

for(j=0;j<6;> myseeker.pos.X-distance && mykeep[j].pos.X <> myseeker.pos.Z-distance && mykeep[j].pos.Z < compare =" mykeep[j].Active;" active =" false;">setVisible( false );}
}
}

ศัตรูชนกับ seeker

for(j=0;j<6;> myhero.pos.X-distance && mykeep[j].pos.X <> myhero.pos.Z-distance && mykeep[j].pos.Z < compare =" mykeep[j].Active;" active =" false;">setVisible( false );}
}
}


ศัตรูชนกับ Hero

if(g_input.rightMousePressed())
{
for(j=0;j<6;> myhero.pos.X-distance3 && mykeep[j].pos.X <> myhero.pos.Z-distance3 && mykeep[j].pos.Z < selectednode =" g_engine.smgr-">getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB(g_engine.device->getCursorControl()->getPosition(),0,true);
if(SelectedNode == mykeep[j].keep_node)
{
be[j]--;
if(be[j]<=0) { mykeep[j].Active=false; mykeep[j].keep_node->setVisible(false);
}
}
}
}
}
}


ฆ่า keep

if(mykeep[0].Active==false&&mykeep[1].Active==false&&mykeep[2].Active==false&&mykeep[3].Active==false&&mykeep[4].Active==false&&mykeep[5].Active==false)
{
mykeep[0].keep_node->setPosition( vector3df(900, 200, 2650) );
mykeep[1].keep_node->setPosition( vector3df(800, 200, 2550) );
mykeep[2].keep_node->setPosition( vector3df(700, 200, 2450) );
mykeep[3].keep_node->setPosition( vector3df(-2350, 200, -700) );
mykeep[4].keep_node->setPosition( vector3df(-2250, 200, -600) );
mykeep[5].keep_node->setPosition( vector3df(-2150, 200, -500) );
for(j=0; j<6; pos="mykeep[j].keep_node-">getPosition();
mykeep[j].Active = true;
mykeep[j].keep_node->setVisible( true );
}
}


ทำให้ keep เกิดใหม่เรื่อยๆ

swprintf ( text, 256, L"BASE HP : %d Level : %d",bhp,energy);
g_font->draw( text, rect(5,0,260,22), SColor(255,255,255,255) );

if(energy==20)
{
swprintf ( text, 256, L"YOU WIN");
g_font->draw( text, rect(280,200,0,22), SColor(255,255,255,255) );
}

if(bhp<=0) { swprintf ( text, 256, L"GAMEOVER"); g_font->draw( text, rect(280,200,0,22), SColor(255,255,255,255) );


แสดงคะแนน และบอกว่า ชนะ หรือ แพ้

Download Source code
ทั้งหมด

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

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