Code: Select all
#include <irrlicht.h>
#include <iostream>
#pragma comment(lib, "Irrlicht.lib")
#include "EventReceiver.cpp"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
int main(){
EventReceiver receiver;
IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<s32>(800, 600), 32, 0);
device->setWindowCaption(L"Test");
device->setEventReceiver(&receiver);
IVideoDriver *driver = device->getVideoDriver();
ISceneManager *smgr = device->getSceneManager();
IGUIEnvironment *guienv = device->getGUIEnvironment();
// device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
//
// IAnimatedMesh *levelMesh = smgr->getMesh("20kdm2.bsp");
// ISceneNode *levelNode = 0;
//
// if(levelMesh){
// levelNode = smgr->addOctTreeSceneNode(levelMesh->getMesh(0));
// }
//
// ITriangleSelector *selector = 0;
// if(levelNode){
// levelNode->setPosition(vector3df(-1350, -130, -1400));
// selector = smgr->createOctTreeTriangleSelector(levelMesh->getMesh(0), levelNode, 128);
// levelNode->setTriangleSelector(selector);
// }
ITerrainSceneNode *terrain = smgr->addTerrainSceneNode("terrain-heightmap.bmp", 0, -1, vector3df(0, 0, 0), vector3df(0, 0, 0), vector3df(40, 4.4f, 40), SColor(255, 255, 255, 255), 5, ETPS_17, 4);
terrain->setMaterialFlag(EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("terrain-texture.jpg"));
terrain->setMaterialTexture(1, driver->getTexture("detailmap3.jpg"));
terrain->setMaterialType(EMT_DETAIL_MAP);
terrain->scaleTexture(1.0f, 20.0f);
ITriangleSelector *selector = smgr->createTerrainTriangleSelector(terrain, 0);
terrain->setTriangleSelector(selector);
float camDistance = 80;
ICameraSceneNode *cam = smgr->addCameraSceneNode(); //FPS(0, 100.0f, 300.0f, -1, 0, 0, true);
cam->setPosition(vector3df(0, 0, 0));
cam->setFarValue(12000.0f);
//ISceneNodeAnimator *anim = smgr->createCollisionResponseAnimator(selector, cam, vector3df(30, 50, 30), vector3df(0, -3, 0), vector3df(0, 50, 0));
// selector->drop();
// cam->addAnimator(anim);
// anim->drop();
SMaterial material;
material.setTexture(0, driver->getTexture("faerie2.bmp"));
material.Lighting = false;
IAnimatedMeshSceneNode *fnode = 0;
IAnimatedMesh *faerie = smgr->getMesh("faerie.md2");
fnode = smgr->addAnimatedMeshSceneNode(faerie);
fnode->setPosition(vector3df(1900 * 2, 355 * 2, 3700 * 2));
fnode->setRotation(vector3df(0, 150, 0));
fnode->setMD2Animation(EMAT_STAND);
fnode->getMaterial(0) = material;
bool isRunning = false;
bool isStanding = true;
ISceneNodeAnimator *anim = smgr->createCollisionResponseAnimator(selector, fnode, vector3df(30, 50, 30), vector3df(0, -3, 0), vector3df(0, 50, 0));
selector->drop();
fnode->addAnimator(anim);
anim->drop();
material.setTexture(0, 0);
device->getCursorControl()->setVisible(false);
smgr->addLightSceneNode(0, vector3df(-60, 100, 400), SColorf(1.0f, 1.0f, 1.0f, 1.0f), 600.0f);
ISceneNode *selectedSceneNode = 0;
ISceneNode *lastSelectedSceneNode = 0;
while(device->run()){
if(device->isWindowActive()){
if(receiver.IsKeyDown(KEY_ESCAPE)){
device->closeDevice();
device->drop();
exit(0);
}
vector3df pos = fnode->getPosition();
vector3df rot = fnode->getRotation();
if(receiver.IsKeyDown(KEY_KEY_W)){
pos.X += 20 * cos((rot.Y) * 3.14 / 180);
pos.Z -= 20 * sin((rot.Y) * 3.14 / 180);
if(!isRunning){
fnode->setMD2Animation(EMAT_RUN);
isRunning = true;
}
}else if(receiver.IsKeyDown(KEY_KEY_S)){
pos.X -= 16 * cos((rot.Y) * 3.14 / 180);
pos.Z += 16 * sin((rot.Y) * 3.14 / 180);
if(!isRunning){
fnode->setMD2Animation(EMAT_RUN);
isRunning = true;
}
}else{
isRunning = false;
}
if(!isRunning){
fnode->setMD2Animation(EMAT_STAND);
isStanding = true;
}
if(receiver.IsKeyDown(KEY_KEY_A)){
rot.Y -= 20;
}else if(receiver.IsKeyDown(KEY_KEY_D)){
rot.Y += 20;
}
fnode->setPosition(pos);
fnode->setRotation(rot);
cam->setPosition(vector3df(vector3df(pos.X - 150 * cos((rot.Y) * 3.14 / 180), pos.Y + camDistance, pos.Z + 150 * sin((rot.Y) * 3.14 / 180))));
cam->setTarget(pos);
driver->beginScene(true, true, 0);
smgr->drawAll();
guienv->drawAll();
lastSelectedSceneNode = selectedSceneNode;
driver->endScene();
}
}
device->drop();
return 0;
}