ich habe es mal mit der freien kamera gemacht. Das programm meldet ein fehler und kann nicht ausgeführt werden.
map1.x befindet sich im anhang
main.cpp:
Code:
#include <irrlicht.h>
#include <net.h>
#include <audiere.h>
using namespace irr;
using namespace video;
using namespace scene;
using namespace core;
int modellife=10;
int mylife=10;
int scounter=0;
int rcounter=0;
int i;
netSocket *sockr;
netSocket *socks;
char sbuffer[100];
char rbuffer[100];
bool shot=false;
IrrlichtDevice *device=0;
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(SEvent event)
{
if(mylife<0)
return true;
if(event.EventType==EET_MOUSE_INPUT_EVENT){
if(event.MouseInput.Event==EMIE_LMOUSE_PRESSED_DOWN){
shot=true;
}
}
if(device && device->getSceneManager()->getActiveCamera())
device->getSceneManager()->getActiveCamera()->OnEvent(event);
return true;
}
};
void iamhit(){
printf("you are hit! life:%d",mylife);
if(mylife<0){
printf("you lose\n");
modellife=2;
}
return;
}
int main()
{
netInit ();
sockr = new netSocket();
socks = new netSocket();
socks->open(false);
sockr->open(false);
socks->setBlocking(false);
i=socks->connect("10.10.10.10",1111) ;
sockr->setBlocking(false);
i=sockr->bind("",1111) ;
MyEventReceiver receiver; // vollbild?
device=createDevice(EDT_OPENGL,dimension2d<s32>(1024, 768),16,true,false,false,&receiver);
IVideoDriver* driver=device->getVideoDriver();
ISceneManager* smgr=device->getSceneManager();
IAnimatedMesh* mapmesh=smgr->getMesh("maps/map1.x");
ISceneNode* map = 0;
map=smgr->addOctTreeSceneNode(mapmesh->getMesh(0));
map->setMaterialFlag(EMF_LIGHTING,false);
IAnimatedMesh* modelmesh=smgr->getMesh("models/tris.md2");
IAnimatedMeshSceneNode* model=smgr->addAnimatedMeshSceneNode(modelmesh);
model->setMaterialFlag(EMF_LIGHTING, false);
model->setMaterialTexture( 0, driver->getTexture("models/@.pcx") );
model->setPosition(vector3df(0,75,100));
model->setScale(vector3df(3.2,3.2,3.2));
model->setMD2Animation(EMAT_STAND);
ICameraSceneNode* camera=smgr->addCameraSceneNodeFPS();
camera->setPosition(vector3df(0,150,20));
IMetaTriangleSelector* metaselector;
metaselector=smgr->createMetaTriangleSelector();
ITriangleSelector* mapselector=smgr->createOctTreeTriangleSelector(mapmesh->getMesh(0), map, 128);
metaselector->addTriangleSelector(mapselector);
mapselector->drop();
ITriangleSelector* modelselector=smgr->createTriangleSelector(modelmesh->getMesh(0), model);
metaselector->addTriangleSelector(modelselector);
modelselector->drop();
ISceneNodeAnimator* anim=smgr->createCollisionResponseAnimator(
// metaselector, camera, vector3df(30,50,30),
// vector3df(0,-100,0), 100.0f, vector3df(0,50,0));
metaselector, camera, vector3df(0,0,0),
vector3df(0,0,0), 100.0f, vector3df(0,0,0));
camera->addAnimator(anim);
anim->drop();
device->getCursorControl()->setVisible(false);
audiere::AudioDevicePtr audiodevice(audiere::OpenDevice());
audiere::OutputStreamPtr sht1(audiere::OpenSound(audiodevice, "sound/sht1.wav", true));
sht1->setRepeat(true);
sht1->setVolume(1);
sht1->play();
while(device->run())
{
driver->beginScene(true, true, SColor(0,10,10,10));
smgr->drawAll();
driver->endScene();
vector3d<f32> explosion;
int frames=driver->getFPS();
if (frames<30)
frames=30;
rcounter+=1;
scounter+=1;
if(scounter>float(frames)/5){
scounter=0;
vector3d<f32> pos=camera->getPosition();
vector3d<f32> rot=camera->getRotation();
int len=sprintf(sbuffer,"%.1f %.1f %.1f %.1f %d\n\0",pos.X,pos.Y,pos.Z,rot.Y,modellife);
socks->send(sbuffer,len,0);
}
if(sockr->recv(rbuffer,100,0)>=0){
float x,y,z,rot;
int life;
sscanf(rbuffer,"%f %f %f %f %d",&x,&y,&z,&rot,&life);
if(life==9999){
mylife=life;
break;
}
if(life<mylife){
mylife=life;
iamhit();
}
int time=(float(rcounter)/frames)*1000;
rcounter=0;
ISceneNodeAnimator* runto=smgr->createFlyStraightAnimator(model->getPosition(),vector3df(x,y,z),time,0);
model->setRotation(vector3df(0,rot,0));
model->addAnimator(runto);
runto->drop();
}
if(shot){
shot=false;
vector3d<f32> direction=camera->getTarget()-camera->getPosition();
direction.normalize();
line3d<f32> bullet;
bullet.start=camera->getPosition();
bullet.end=camera->getPosition()+direction*1500;
triangle3d<f32> dummy;
vector3d<f32> mapcollision;
vector3d<f32> modelcollision;
bool gotmap=smgr->getSceneCollisionManager()->getCollisionPoint(bullet,mapselector,mapcollision,dummy);
bool gotmodel=smgr->getSceneCollisionManager()->getCollisionPoint(bullet,modelselector,modelcollision,dummy);
float mapdistance=0;
float modeldistance=0;
if(gotmap){
mapdistance=camera->getPosition().getDistanceFromSQ(mapcollision);
}
if(gotmodel){
modeldistance=camera->getPosition().getDistanceFromSQ(modelcollision);
}
if(gotmodel && gotmap){
if(modeldistance<=mapdistance){
modellife-=1;
printf("you score!\n");
explosion=modelcollision;
}
else
explosion=mapcollision;
}
if(gotmodel && !gotmap){
modellife-=1;
printf("you score!\n");
explosion=modelcollision;
}
if(!gotmodel && gotmap){
explosion=mapcollision;
}
}
}
if(mylife==2)
printf("you win!\n");
else
printf("you lose!\n");
device->drop();
sockr -> close ();
socks -> close ();
return 0;
}