Mercurial > hg > Members > e075743
view src/GameManager.cpp @ 10:5727d511a13a
add src in Martial Project Xcode.
author | tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp |
---|---|
date | Wed, 03 Feb 2010 03:39:04 +0900 |
parents | |
children | d45a95c697c3 |
line wrap: on
line source
/* * GameManager.cpp * Martial * * Created by ryoma on 10/01/23. * Copyright 2010 琉球大学. All rights reserved. * */ #include "GameManager.h" /** ここはサブクラスにまかせたい。 */ GameManager::GameManager() { //movableObjectList = new std::list<MovableObject*>(); /* グラフィックスとジョイスティックを初期化 */ puts("SDL_INIT_JOYSTICK.. "); if (SDL_Init(SDL_INIT_JOYSTICK) < 0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); exit(0); } else { puts("success!!"); } int i; printf("%d joysticks found.\n",SDL_NumJoysticks()); printf("their names are:\n"); for(i=0; i<SDL_NumJoysticks(); i++) printf("%d = %s\n",i,SDL_JoystickName(i)); root = new osg::Group(); collisionDetector = new CollisionDetector(); } void GameManager::addMovableObject(MovableObject* mob) { movableObjectList.push_back(mob); return; } void GameManager::initStage() { osg::Geode* clothGeode = new osg::Geode(); osg::Geometry* clothGeometry = new osg::Geometry(); clothGeode->addDrawable(clothGeometry); //root->addChild(clothGeode); float clen; clen = 100.0; osg::Vec3Array* clothVertices = new osg::Vec3Array; clothVertices->push_back (osg::Vec3( clen, clen, 0.0)); clothVertices->push_back (osg::Vec3( clen, -clen, 0.0)); clothVertices->push_back (osg::Vec3( -clen, -clen, 0.0)); clothVertices->push_back (osg::Vec3( -clen, clen, 0.0)); clothGeometry->setVertexArray(clothVertices); osg::DrawElementsUInt* cloth = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0); cloth->push_back(3); cloth->push_back(2); cloth->push_back(1); cloth->push_back(0); clothGeometry->addPrimitiveSet(cloth); osg::Texture2D* clothTexture = new osg::Texture2D; clothTexture->setDataVariance(osg::Object::DYNAMIC); osg::Image* clothImage = osgDB::readImageFile("Cell 23.rgb"); if (!clothImage) { printf("Error!!"); return; } clothTexture->setImage(clothImage); osg::StateSet* stateOne = new osg::StateSet(); stateOne->setTextureAttributeAndModes(0,clothTexture,osg::StateAttribute::ON); clothGeometry->setStateSet(stateOne); osg::AutoTransform* fieldForm = new osg::AutoTransform(); fieldForm->addChild(clothGeode); fieldForm->setPosition(osg::Vec3(0,0,-5)); root->addChild(fieldForm); } void GameManager::gameStart() { puts("entory gameStart"); osg::Timer_t sTick, eTick; osgViewer::CompositeViewer viewer; puts("Initialize Stage..."); sTick = osg::Timer::instance()->tick(); initStage(); eTick = osg::Timer::instance()->tick(); printf("ok.. (%.6f msec)\n",osg::Timer::instance()->delta_s(sTick, eTick)*1000.0); puts("Create Avatar.."); sTick = osg::Timer::instance()->tick(); Robot* roboObj1 = new Robot("robo1"); roboObj1->setPos(osg::Vec3(10,0,0)); roboObj1->setDefaultDirection(osg::Vec3(0.0, 0.0, 90.0)); //物体のデフォルトの向き root->addChild(roboObj1->getForm()); movableObjectList.push_back(roboObj1); collisionDetector->addCollisionObject(roboObj1); eTick = osg::Timer::instance()->tick(); printf("%s: created.. (%.6f msec)\n",roboObj1->getName(), osg::Timer::instance()->delta_s(sTick, eTick)*1000.0); sTick = osg::Timer::instance()->tick(); Robot* movObj = new Robot("robo2"); //movObj->setPos(osg::Vec3(-10,0,0)); movObj->setDefaultDirection(osg::Vec3(0.0, 0.0, 90)); movObj->setAvatarDirection(-1); root->addChild(movObj->getForm()); movableObjectList.push_back(movObj); collisionDetector->addCollisionObject(movObj); eTick = osg::Timer::instance()->tick(); printf("%s: created.. (%.6f msec)\n",movObj->getName(), osg::Timer::instance()->delta_s(sTick, eTick)*1000.0); puts("Initialize Window"); sTick = osg::Timer::instance()->tick(); osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); if (!wsi) { osg::notify(osg::NOTICE) << "Error, no WindowSystemInterface available, cannot create windows."<<std::endl; return; } unsigned int width, height; wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 100; traits->y = 100; traits->width = Martial::CONFIG::WINDOW_WIDTH; traits->height = Martial::CONFIG::WINDOW_HEIGHT; traits->windowDecoration = true; traits->doubleBuffer = true; traits->sharedContext = 0; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); if (gc.valid()) { osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<std::endl; // need to ensure that the window is cleared make sure that the complete window is set the correct colour // rather than just the parts of the window that are under the camera's viewports gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f)); gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } else { osg::notify(osg::NOTICE)<<" GraphicsWindow has not been created successfully."<<std::endl; } eTick = osg::Timer::instance()->tick(); printf("ok.. (%.6f msec)\n", osg::Timer::instance()->delta_s(sTick, eTick)*1000.0); puts("Initialize View"); eTick = osg::Timer::instance()->tick(); EyePoint* globalEyePoint = new GlobalEyePoint(); globalEyePoint->setTarget(roboObj1); globalEyePoint->setTarget(movObj); //ここは後で書き直す -> <Playerの中でsetOwnerする> PlayerEyePoint* playerEyePoint = new PlayerEyePoint(roboObj1); playerEyePoint->setOwner(roboObj1); addMovableObject(globalEyePoint); addMovableObject(playerEyePoint); Player* player1 = new Player("Player1", roboObj1, playerEyePoint); SDL_Joystick *joy = SDL_JoystickOpen(0); KeyboardEventHandler* keh = new KeyboardEventHandler(); bool canUseJoy = (joy != NULL && SDL_JoystickNumHats(joy)); canUseJoy = false; // joypad動かないので保留 if (canUseJoy) { player1->registerJOY(joy); } else { player1->registerKEH(keh); } // view one { osgViewer::View* view = new osgViewer::View; viewer.addView(view); view->setSceneData(root); view->getCamera()->setViewport(new osg::Viewport(0,0, traits->width, traits->height)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(globalEyePoint->getManpulator()); // add the state manipulator osg::ref_ptr<osgGA::StateSetManipulator> statesetManipulator = new osgGA::StateSetManipulator; statesetManipulator->setStateSet(view->getCamera()->getOrCreateStateSet()); view->addEventHandler(keh); } // view two { osgViewer::View* view = new osgViewer::View; viewer.addView(view); view->setSceneData(root); view->getCamera()->setViewport(new osg::Viewport(0, traits->height/3*2, traits->width/3, traits->height/3)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(playerEyePoint->getManpulator()); } viewer.realize(); //viewer.addEventHandler(keh); eTick = osg::Timer::instance()->tick(); printf("ok.. (%.6f msec)\n", osg::Timer::instance()->delta_s(sTick, eTick)*1000.0); osg::Timer_t startFrameTick, moveFrameTick, renderFrameTick; std::list<MovableObject*>::iterator mobIter; const int SAMPLE_RATE = Martial::CONFIG::FRAME_RATE/2; int frame; float frameAverageTime, renderAvarageTime, moveAverageTime, frameTime; frame = frameAverageTime = renderAvarageTime = moveAverageTime = 0; puts("[Game Main Loop]"); //メインループ while (!viewer.done()) { startFrameTick = osg::Timer::instance()->tick(); player1->frame(); //SceneGraphの走査 -> 座標計算, 衝突判定 //衝突処理はcheckCollision内部で行なう?(未実装) for(mobIter = movableObjectList.begin(); mobIter != movableObjectList.end(); ++mobIter) { (*mobIter)->frame(); } //衝突判定 - CollisionDetector にまかせる collisionDetector->frame(); //描画 ここで一番時間がかかる moveFrameTick = osg::Timer::instance()->tick(); moveAverageTime += osg::Timer::instance()->delta_s(startFrameTick, moveFrameTick); viewer.frame(); renderFrameTick = osg::Timer::instance()->tick(); renderAvarageTime += osg::Timer::instance()->delta_s(moveFrameTick, renderFrameTick); frameAverageTime += (frameTime = osg::Timer::instance()->delta_s(startFrameTick, renderFrameTick)); frame++; if (Martial::TEST::SHOW_FPS) { if (frame == SAMPLE_RATE) { printf("\nfps: %.3f\n (move: %.6f msec, render: %.6f msec)\n\n", (float)SAMPLE_RATE/frameAverageTime, moveAverageTime*1000.0/(float)SAMPLE_RATE, renderAvarageTime*1000.0/(float)SAMPLE_RATE); frame = frameAverageTime = renderAvarageTime = moveAverageTime = 0; } } if (frameTime < Martial::CONFIG::FRAME_MIN_TIME) { OpenThreads::Thread::microSleep(1000000.0*(Martial::CONFIG::FRAME_MIN_TIME-frameTime)); } } return; }