#include #pragma comment(lib, "Irrlicht.lib") // Irrlicht namespaces using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; // Global variables bool quit = false; ISceneNode* p1Paddle; ISceneNode* p2Paddle; IrrlichtDevice* device = 0; class CEventReceiver : public IEventReceiver { public: virtual bool OnEvent(SEvent Event); }; int main() { // Create the Irrlicht device CEventReceiver EventReceiver; device = createDevice(EDT_OPENGL, dimension2d(640, 480), 16, false, true, true, &EventReceiver); ISceneManager* smgr = device->getSceneManager(); IVideoDriver* driver = device->getVideoDriver(); IGUIEnvironment* guienv = device->getGUIEnvironment(); // Create meta triangle selector to hold all other triangle selectors IMetaTriangleSelector* metaSelector = smgr->createMetaTriangleSelector(); // Add a camera and hide the mouse ICameraSceneNode* camera = smgr->addCameraSceneNode(0, vector3df(0, 0, 0), vector3df(0, 0, 100)); device->getCursorControl()->setVisible(false); // Use media.vxp device->getFileSystem()->addZipFileArchive("media.vxp", false, false); // Textures ITexture* TWall = driver->getTexture("wall.jpg"); ITexture* TWall2 = driver->getTexture("wall.bmp"); ITexture* TParticle = driver->getTexture("particle.bmp"); // Create world scene node ISceneNode* world = smgr->addCubeSceneNode(500); // Create p1Paddle p1Paddle = smgr->addCubeSceneNode(1, world, 0, vector3df(-75, 0, 100), vector3df(0, 0, 0), vector3df(1, 25, 25)); p1Paddle->setMaterialTexture(0, TWall); p1Paddle->setMaterialFlag(EMF_LIGHTING, false); // Create p2Paddle p2Paddle = smgr->addCubeSceneNode(1, world, 0, vector3df(75, 0, 100), vector3df(0, 0, 0), vector3df(1, 25, 25)); p2Paddle->setMaterialTexture(0, TWall2); p2Paddle->setMaterialFlag(EMF_LIGHTING, false); // Create the ball ISceneNode* ball = smgr->addSphereSceneNode(5, 512, world); ball->setMaterialTexture(0, TParticle); ball->setMaterialFlag(EMF_LIGHTING, false); // Fling the ball to the left ISceneNodeAnimator* ballAnim = smgr->createFlyStraightAnimator(vector3df(0, 0, 100), vector3df(-100, 0, 100), 5000, false); ball->addAnimator(ballAnim); ballAnim->drop(); // Particle system IParticleSystemSceneNode* particleSystem = smgr->addParticleSystemSceneNode(false, ball); particleSystem->setMaterialFlag(EMF_LIGHTING, false); particleSystem->setMaterialTexture(0, TParticle); particleSystem->setMaterialType(EMT_TRANSPARENT_VERTEX_ALPHA); // 2 Particle emitters for the ball IParticleEmitter* ballEmitter = particleSystem->createPointEmitter(vector3df(0.03f, 0.03f, 0.03f), 50, 100, SColor(0, 50, 25, 25), SColor(0, 200, 50, 50), 200, 400); particleSystem->setEmitter(ballEmitter); ballEmitter->drop(); ITriangleSelector* ballSelector = smgr->createTriangleSelectorFromBoundingBox(ball); metaSelector->addTriangleSelector(ballSelector); ballSelector->drop(); ISceneNodeAnimatorCollisionResponse* collision = smgr->createCollisionResponseAnimator(metaSelector, ball, vector3df(5, 5, 5), vector3df(0, 0, 0)); ball->addAnimator(collision); collision->drop(); // Show information IGUIStaticText* leet = guienv->addStaticText(L"Velox Pong", rect(10, 10, 200, 30), true); leet->move(position2d(driver->getFPS(), 0)); float index = 0; while (device->run() && quit != true) { driver->beginScene(true, true, SColor(255, 113, 113, 113)); smgr->drawAll(); guienv->drawAll(); if (camera->getPosition().Y < 100 && index < 100) camera->setPosition(vector3df(0, index++, 0)); driver->endScene(); } // We're all done, time to drop the Irrlicht device metaSelector->drop(); device->drop(); return 0; } bool CEventReceiver::OnEvent(SEvent Event) { if (Event.EventType == EET_KEY_INPUT_EVENT) { if (Event.KeyInput.Key == KEY_UP) p2Paddle->setPosition(p2Paddle->getPosition() + vector3df(0.0f, 0.0f, 1.0f)); if (Event.KeyInput.Key == KEY_DOWN) p2Paddle->setPosition(p2Paddle->getPosition() + vector3df(0.0f, 0.0f, -1.0f)); if (Event.KeyInput.Key == KEY_KEY_W) p1Paddle->setPosition(p1Paddle->getPosition() + vector3df(0.0f, 0.0f, 1.0f)); if (Event.KeyInput.Key == KEY_KEY_S) p1Paddle->setPosition(p1Paddle->getPosition() + vector3df(0.0f, 0.0f, -1.0f)); switch (Event.KeyInput.Key) { // Did the user press the "Esc" button? case 27: quit = true; break; } } return true; }