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;
}