Example #1
0
	void Framework::update(){
		if ( gFirstFrame ){
			gFirstFrame = false;
			gImage = new Image( "background.dds" ); 
			createTexture( 
				&gTexture,
				gImage->width(), 
				gImage->height(), 
				gImage->data(), 
				gImage->width(), 
				gImage->height() );
			SAFE_DELETE( gImage );
		}
		setTexture( gTexture );
		double p0[ 2 ] = { 100.0, 100.0 };
		double p1[ 2 ] = { 200.0, 120.0 };
		double p2[ 2 ] = { 120.0, 200.0 };
		double t0[ 2 ] = { 0.0, 0.0 };
		double t1[ 2 ] = { 1.0, 0.0 };
		double t2[ 2 ] = { 0.0, 1.0 };
		drawTriangle2D( p0, p1, p2, t0, t1, t2 );

		//終了処理してみようか
		if ( isEndRequested() ){
			destroyTexture( &gTexture );
		}		
	}
Example #2
0
	void Framework::update(){
		sleep( 16 );
		if ( !gWave ){
			//トラッククラス生成
			Track tracks[ 2 ];
			tracks[ 0 ].setData( gTrack0Notes, gTrack0NoteNumber );
			tracks[ 1 ].setData( gTrack1Notes, gTrack1NoteNumber );
			short* buffer = new short[ BUFFER_SIZE ];
			for ( int i = 0; i < BUFFER_SIZE; ++i ){
				buffer[ i ] = 0;
			}
			for ( int i = 0; i < 2; ++i ){
				tracks[ i ].addWave( buffer, BUFFER_SIZE, FREQUENCY );
			}
			gWave = Sound::Wave::create( buffer, BUFFER_SIZE, FREQUENCY, 1 );
			SAFE_DELETE_ARRAY( buffer );
			gPlayer = Sound::Player::create( gWave );
			gPlayer.play();
		}
		if ( isEndRequested() ){
			//破棄します。
			gPlayer.release();
			gWave.release();
		}
	}
Example #3
0
void Window::update(){
	Window w;
	Graphics::Manager m;
	WorkSpace ws;
	bool sleep = false;
	if( w.isMinimized() ){
		sleep = true;
	}
	//終了チェック
	if( isEndRequested() ){
		ws.requestEnd();
	}
	if( !sleep ){
		ws.preUpdate();
	}
	if( sleep ){
		ws.sleep( 50 );
	} else {
		try{
			ws.update();
		}
		catch( ... ){
			WorkSpace::destroy();
			end();
			throw Mashiro::EXCEPTION_EXIT;
		}
		ws.postUpdate();
	}
	if( ws.isEndRequested() ){
		WorkSpace::destroy();
		end();
	}
}
Example #4
0
	void Framework::update(){
		if ( !gThread ){
			//スレッド生成、開始
			gThread = new MyThread();
			gThread->start();
		}
		if ( isEndRequested() ){
			gThread->wait(); //終わってから消すこと。
			SAFE_DELETE( gThread );
		}
	}
Example #5
0
	void Framework::update(){
		if ( !Loader::instance() ){
			Loader::create( "data.bin" );
//			Loader::create(); //こっちの行にすると、アーカイブなしでアクセス。
		}
		//ローダ実行
		Loader::instance()->update();

		//ロード済みなら削除
		for ( int i = 0; i < 100; ++i ){
			if ( gFiles[ i ] ){
				if ( gFiles[ i ]->isReady() ){
					Loader::instance()->destroyFile( &gFiles[ i ] );
				}
			}
		}
		ostringstream oss;
		//空いてるだけ全スロットロード
		for ( int i = 0; i < 100; ++i ){
			if ( gFiles[ i ] == 0 ){
				oss.str( "" );
				oss << "data\\" << getRandom( 1000 ) << ".txt";
				Loader::instance()->createFile( &gFiles[ i ], oss.str().c_str() );
			}
		}
		oss.str( "" );
		int framerate = frameRate();
		oss << "Framerate: " << frameRate();
		int c = ( framerate > 255 ) ? 255 : framerate;
		drawDebugString( 0, 0, oss.str().c_str(), 0xffff0000 | ( c << 8 ) | c );
		int previousFrame = previousFrameInterval();
		oss.str( "" );
		oss << "PreviousFrame: " << previousFrameInterval();
		c = ( previousFrame > 63 ) ? 0 : ( 255 - previousFrame * 4 );
		drawDebugString( 0, 1, oss.str().c_str(), 0xffff0000 | ( c << 8 ) | c );

		//止まってるのをわかりやすくする描画
		double p[ 4 ][ 4 ];
		p[ 0 ][ 2 ] = p[ 1 ][ 2 ] = p[ 2 ][ 2 ] = p[ 3 ][ 2 ] = 0.0;
		p[ 0 ][ 3 ] = p[ 1 ][ 3 ] = p[ 2 ][ 3 ] = p[ 3 ][ 3 ] = 1.0;
		p[ 0 ][ 0 ] = p[ 2 ][ 0 ] = ( gCount % 640 ) / 320.0 - 1.05;
		p[ 1 ][ 0 ] = p[ 3 ][ 0 ] = ( gCount % 640 ) / 320.0 - 0.95;
		p[ 0 ][ 1 ] = p[ 1 ][ 1 ] = -0.05;
		p[ 2 ][ 1 ] = p[ 3 ][ 1 ] = 0.05;
		drawTriangle3DH( p[ 0 ], p[ 1 ], p[ 2 ] );
		drawTriangle3DH( p[ 3 ], p[ 1 ], p[ 2 ] );
		++gCount;

		if ( isEndRequested() ){
			Loader::destroy();
		}
	}
Example #6
0
	void Framework::update(){
		if ( !Sequence::Parent::instance() ){
			Sequence::Parent::create();
			setFrameRate( 60 );
		}
		Sequence::Parent::instance()->update();
		//終了判定(qが押されたか、マウスで×ボタンが叩かれたか)
		if ( isKeyOn( 'q' ) ){
			requestEnd();
		}
		if ( isEndRequested() ){
			Sequence::Parent::destroy();
		}
	}
Example #7
0
    void Framework::update()
    {
        if( bFirstFrame )
        {
            Pad::Create();
            bFirstFrame = false;
            g_ResourceStage = new GraphicData("data.txt");
            g_ResourceRobot = new GraphicData("robo.txt");
            g_Model[0] = g_ResourceRobot->CreateModel("robo");
            g_Model[1] = g_ResourceRobot->CreateModel("robo");

            Document doc;
            Element* root = doc.GetRoot();
            Element* tmp = new Element("Test");
            double p[3] = { 10,0,-10 };

            Attribute* a = new Attribute("Pos", "1,1,1");
            a->Set("Hehe",p,3);
            tmp->AddAttribute(a);
            root->AddElement(tmp);
            doc.Write("MyFirst.txt");
        }
        setFrameRate( 60 );
        g_cnt++;
        
        // View matrix 
        //camera.SetPos( Vector3(sin(g_cnt)*10, 1, cos(g_cnt)*10) );
        camera.SetPos( Vector3(0, 1, 10) );
        camera.SetTarget( Vector3(0,0,0) );
 
        Matrix44 matProjView;
        camera.CreateProjViewMatrix(&matProjView);        

        g_ResourceStage->GetBatch("batch")->Draw(matProjView);
        g_Model[0]->SetPos(Vector3(2,0,0));
        g_Model[0]->Draw(matProjView);

        g_Model[1]->SetPos(Vector3(-2,1,0));
        g_Model[1]->SetScale(Vector3(2,1,2));
        g_Model[1]->Draw(matProjView);

        enableDepthTest( true );

        if ( isEndRequested() ){            			
            SAFE_DELETE( g_ResourceStage );
            SAFE_DELETE( g_ResourceRobot );
            Pad::Destroy();
		}
    }
Example #8
0
void WindowCreator::update(){
	WindowCreator wc;
	Graphics::Manager gm;
	Framework f;
	//WindowCreatorの状態次第でいろいろする
	bool sleepFlag = false;
	//最小化していれば寝る
	if ( wc.isMinimized() ){
		sleepFlag = true;
	}
	//デバイスロストこいているようなら復帰を試みるが、基本的に寝る。
/*
	if ( !gm.canRender() ){
		gm.restore();
		sleepFlag = true;
	}
	//Windowからモード切替シグナル
	bool wcFullScreen = wc.isFullScreen();
	if ( f.isFullScreen() != wcFullScreen ){
		f.enableFullScreen( wcFullScreen );
	}
*/
	if ( !sleepFlag ){
		f.preUpdate();
	}
	//上流(×ボタンとか)から終了命令が来ているかチェック
	if ( isEndRequested() ){ //来ていればFrameworkに終了命令を伝達
		f.requestEnd();
	}
	if ( sleepFlag ){
		Threading::sleep( 50 ); //50ms寝る
	}else{
		f.update();
		f.postUpdate();
	}
	//終了判定
	if ( f.isEndRequested() ){
		Framework::destroy();
		end(); //上流にも知らせを
	}
}
Example #9
0
	void Framework::update(){
		if ( !gRootSequence ){
			gRootSequence = new Sequence::Parent();
		}
		//フレームレート調整
		setFrameRate( 60 ); //一回呼べばいいのだが面倒なので呼んでしまう。

		if ( gCounter % 60 == 0 ){ //60フレームに一回フレームレート表示
			cout << " FrameRate:" << frameRate() << endl;
		}
		++gCounter;

		gRootSequence->update();

		//終了判定(qが押されたか、マウスで×ボタンが叩かれたか)
		if ( isKeyOn( 'q' ) ){
			requestEnd();
		}
		if ( isEndRequested() ){
			SAFE_DELETE( gRootSequence );
		}
	}
Example #10
0
	void Framework::update(){
		sleep( 16 );
		if ( gFirstFrame ){
			gFirstFrame = false;
			gImage = new Image( "background.dds" ); 
			gImageWidth = gImage->width();
			gImageHeight = gImage->height();
			createTexture( 
				&gTexture,
				gImageWidth, 
				gImageHeight, 
				gImage->data(), 
				gImageWidth, 
				gImageHeight );
			SAFE_DELETE( gImage );
		}
		setTexture( gTexture );
		
		double rotation = static_cast< double >( gCount );
		Vector2 scale( sin( rotation ) + 0.5, cos( rotation ) + 0.5 );

		//行列作る
		Matrix23 m;
		m.setTranslation( Vector2( gImageWidth/2, gImageHeight/2 ) );
		if ( gScaleFirst ){
			m.rotate( rotation );
			m.scale( scale );
		}else{
			m.scale( scale );
			m.rotate( rotation );
		}
		m.translate( Vector2( -gImageWidth/2, -gImageHeight/2 ) );

		Vector2 p0( 0.0, 0.0 );
		Vector2 p1( 100.0, 0.0 );
		Vector2 p2( 0.0, 100.0 );
		Vector2 p3( 100.0, 100.0 );
		double t0[ 2 ] = { 0.0, 0.0 };
		double t1[ 2 ] = { 1.0, 0.0 };
		double t2[ 2 ] = { 0.0, 1.0 };
		double t3[ 2 ] = { 1.0, 1.0 };
		//行列乗算
		m.multiply( &p0, p0 );
		m.multiply( &p1, p1 );
		m.multiply( &p2, p2 );
		m.multiply( &p3, p3 );
		//描画
		//Vector2はそのままは渡せません。
		drawTriangle2D( &p0.x, &p1.x, &p2.x, t0, t1, t2 ); //012
		drawTriangle2D( &p3.x, &p1.x, &p2.x, t3, t1, t2 ); //312

		//スペースで切り替え
		if ( Input::Manager::instance().keyboard().isTriggered( ' ' ) ){
			gScaleFirst = !gScaleFirst;
		}
		++gCount;

		drawDebugString( 0, 0, "press SPACE to swap ROTATION and SCALING" );
		//終了処理してみようか
		if ( isEndRequested() ){
			destroyTexture( &gTexture );
		}
	}
Example #11
0
	void Framework::update(){
		if ( !gStage ){
			gPrimitiveRenderer = Scene::PrimitiveRenderer::create( 1000, 100 );
			Pad::create();
			gRobo[ 0 ] = new Robo( 0 );
			gRobo[ 1 ] = new Robo( 1 );
			gRobo[ 0 ]->setPosition( Vector3( 0.0, 0.0, 50.0 ) );
			gRobo[ 0 ]->setAngleY( 180.0 );
			gStage = new Stage();
			gPlaying = true;
		}
		if ( gPlaying ){
			gRobo[ 0 ]->update( gRobo[ 1 ] );
			gRobo[ 1 ]->update( gRobo[ 0 ] );
			++gTime;
		}

		//0番ロボからカメラ行列ゲット
		Matrix44 pvm;
		pvm.setPerspectiveTransform( 45.f, 
			static_cast< float >( width() ),
			static_cast< float >( height() ),
			1.f,
			10000.f );
		Matrix34 vm;
		Vector3 eyePosition;
		gRobo[ 0 ]->getView( &vm, &eyePosition ); //ビュー行列はロボに作ってもらう
		pvm *= vm;

		//描画
		//グローバルなライティング設定
		Graphics::Manager gm = Graphics::Manager::instance();
		gm.setProjectionViewMatrix( pvm );
		gm.setEyePosition( eyePosition );
		gm.setLightingMode( Graphics::LIGHTING_PER_PIXEL );
		gm.setAmbientColor( gAmbient );
		gm.setLightColor( 0, Vector3( 0.7f, 0.4f, 0.2f ) );
		gm.enableDepthTest( true );
		gm.enableDepthWrite( true );
		Vector3 lightPos[ 4 ];
		lightPos[ 0 ].set( 100000.f, 100000.f, 100000.f );
		float lightIntensities[ 4 ];
		lightIntensities[ 0 ] = lightPos[ 0 ].length(); //長さを強度にすれば、だいたいその距離で1になる
		//残り三つのライトは弾のところに置こうか。
		//カメラに近い順に3つ選ぼう。
		float nearestDistance[ 3 ];
		int nearestIndex[ 3 ];
		for ( int i = 0; i < 3; ++i ){
			nearestDistance[ i ] = numeric_limits< float >::max();
			nearestIndex[ i ] = -1;
		}
		//距離を測りながら最小を三つ取得
		//100はロボあたりの弾の数の最大数。
		for ( int i = 0; i < 2; ++i ){
			for ( int j = 0; j < 100; ++j ){
				const Vector3* p = gRobo[ i ]->getBulletPosition( j );
				if ( p ){
					Vector3 t;
					t.setSub( *p, eyePosition );
					float d = t.squareLength();
					if ( d < nearestDistance[ 0 ] ){
						nearestDistance[ 2 ] = nearestDistance[ 1 ];
						nearestDistance[ 1 ] = nearestDistance[ 0 ];
						nearestDistance[ 0 ] = d;
						nearestIndex[ 2 ] = nearestIndex[ 1 ];
						nearestIndex[ 1 ] = nearestIndex[ 0 ];
						nearestIndex[ 0 ] = i * 100 + j;
					}else if ( d < nearestDistance[ 1 ] ){
						nearestDistance[ 2 ] = nearestDistance[ 1 ];
						nearestDistance[ 1 ] = d;
						nearestIndex[ 2 ] = nearestIndex[ 1 ];
						nearestIndex[ 1 ] = i * 100 + j;
					}else if ( d < nearestDistance[ 2 ] ){
						nearestDistance[ 2 ] = d;
						nearestIndex[ 2 ] = i * 100 + j;
					}
				}
			}
		}
		for ( int i = 0; i < 3; ++i ){
			if ( nearestIndex[ i ] != -1 ){
				int robo = nearestIndex[ i ] / 100;
				int bullet = nearestIndex[ i ] % 100;
				const Vector3* p = gRobo[ robo ]->getBulletPosition( bullet );
				lightPos[ i + 1 ] = *p;
				if ( robo == 1 ){
					gm.setLightColor( i + 1, Vector3( 1.f, 0.2f, 0.4f ) );
				}else{
					gm.setLightColor( i + 1, Vector3( 0.2f, 0.4f, 1.f ) );
				}
				lightIntensities[ i + 1 ] = 10.f;
			}else{
				lightIntensities[ i + 1 ] = 0.f;
			}
		}
		gm.setCullMode( Graphics::CULL_BACK );
		//ライト設定
		for ( int i = 0; i < 4; ++i ){
			gm.setLightPosition( i, lightPos[ i ] );
			gm.setLightIntensity( i, lightIntensities[ i ] );
		}
		gStage->draw();
		gRobo[ 0 ]->draw();
		gRobo[ 1 ]->draw();

		//以下フロントエンド描画
		//モデル描x画でいじられたものを元に戻す
		gm.setDiffuseColor( Vector3( 1.f, 1.f, 1.f ) );
		gm.setTransparency( 1.f );
		gm.setLightingMode( Graphics::LIGHTING_NONE );

		//必要な情報を抜いて
		int hp0 = gRobo[ 0 ]->getHitPoint();
		int hp1 = gRobo[ 1 ]->getHitPoint();
		int e0 = gRobo[ 0 ]->getEnergy();
		bool lockOn0 = gRobo[ 0 ]->getLockOn();

		//Zテスト無用。アルファブレンドON
		gPrimitiveRenderer.enableDepthTest( false );
		gPrimitiveRenderer.enableDepthWrite( false );
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_LINEAR );

		Vector2 p[ 4 ];
		unsigned c1;
		unsigned c2;
		//体力バー背景
		p[ 0 ].set( -0.9f, 0.95f );
		p[ 1 ].set( -0.9f, 0.87f );
		p[ 2 ].set( 0.1f, 0.95f );
		p[ 3 ].set( 0.1f, 0.87f );
		c1 = c2 = 0xff406080;
		drawRect( p, c1, c2 );
		p[ 0 ].set( -0.9f, 0.85f );
		p[ 1 ].set( -0.9f, 0.82f );
		p[ 2 ].set( 0.1f, 0.85f );
		p[ 3 ].set( 0.1f, 0.82f );
		c1 = c2 = 0xff806040;
		drawRect( p, c1, c2 );
		//体力バー本体
		float length = static_cast< float >( hp0 ) / static_cast< float >( Robo::mMaxHitPoint );
		p[ 0 ].set( -0.9f, 0.95f );
		p[ 1 ].set( -0.9f, 0.87f );
		p[ 2 ].set( -0.9f + length, 0.95f );
		p[ 3 ].set( -0.9f + length, 0.87f );
		c1 = 0xff882244;
		c2 = 0xff88ccff;
		drawRect( p, c1, c2 );
		length = static_cast< float >( hp1 ) / static_cast< float >( Robo::mMaxHitPoint );
		p[ 0 ].set( -0.9f, 0.85f );
		p[ 1 ].set( -0.9f, 0.82f );
		p[ 2 ].set( -0.9f + length, 0.85f );
		p[ 3 ].set( -0.9f + length, 0.82f );
		c1 = 0xffff4422;
		c2 = 0xffffcc88;
		drawRect( p, c1, c2 );
		//武器エネルギー
		//背景
		p[ 0 ].set( -0.1f, -0.7f );
		p[ 1 ].set( -0.1f, -0.8f );
		p[ 2 ].set( 0.1f, -0.7f );
		p[ 3 ].set( 0.1f, -0.8f );
		c1 = c2 = 0x80404040;
		drawRect( p, c1, c2 );
		//本体
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_ADDITIVE ); //加算にしてみようかな
		length = 0.2f * static_cast< float >( e0 ) / static_cast< float >( Robo::mMaxEnergy );
		p[ 0 ].set( -0.1f, -0.7f );
		p[ 1 ].set( -0.1f, -0.8f );
		p[ 2 ].set( -0.1f + length, -0.7f );
		p[ 3 ].set( -0.1f + length, -0.8f );
		c1 = 0x80ff0000;
		c2 = 0x80ffff00;
		drawRect( p, c1, c2 );

		//レーダー
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_LINEAR );
		//背景
		p[ 0 ].set( 0.7f, 0.7f );
		p[ 1 ].set( 0.7f, 0.9f );
		p[ 2 ].set( 0.9f, 0.7f );
		p[ 3 ].set( 0.9f, 0.9f );
		c1 = c2 = 0x80404040;
		drawRect( p, c1, c2 );
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_ADDITIVE ); //加算にしてみようか
		//自分
		Vector2 t;
		t.set( gRobo[ 0 ]->position()->x, gRobo[ 0 ]->position()->z ); //x.z
		t *= 0.002f; //+-50のステージを0.2の大きさに縮小するんだから、0.2/100で0.002
		t += Vector2( 0.8f, 0.8f ); //(0.8,0.8)が中心なのだから、それを足す
		p[ 0 ].set( t.x - 0.005f, t.y - 0.005f );
		p[ 1 ].set( t.x - 0.005f, t.y + 0.005f );
		p[ 2 ].set( t.x + 0.005f, t.y - 0.005f );
		p[ 3 ].set( t.x + 0.005f, t.y + 0.005f );
		c1 = c2 = 0xcc0080ff;
		drawRect( p, c1, c2 );
		//敵
		t.set( gRobo[ 1 ]->position()->x, gRobo[ 1 ]->position()->z ); //x.z
		t *= 0.002f; //+-50のステージを0.2の大きさに縮小するんだから、0.2/100で0.002
		t += Vector2( 0.8f, 0.8f ); //(0.8,0.8)が中心なのだから、それを足す
		p[ 0 ].set( t.x - 0.005f, t.y - 0.005f );
		p[ 1 ].set( t.x - 0.005f, t.y + 0.005f );
		p[ 2 ].set( t.x + 0.005f, t.y - 0.005f );
		p[ 3 ].set( t.x + 0.005f, t.y + 0.005f );
		c1 = c2 = 0xccff8000;
		drawRect( p, c1, c2 );

		//ロックオンマーク
		if ( lockOn0 ){
			gPrimitiveRenderer.setBlendMode( Graphics::BLEND_ADDITIVE ); //加算にしてみようかな
			//敵ロボを座標変換してスクリーン座標に変換
			Vector3 t = *gRobo[ 1 ]->position();
			Vector4 p4;
			pvm.mul( &p4, t );
			//XY座標はwで割れば出る。
			float x = p4[ 0 ] / p4[ 3 ];
			float y = p4[ 1 ] / p4[ 3 ];
			//色は赤かなあ
			c1 = c2 = 0x80ff0000;
			//線4本でやろう。
			p[ 0 ].set( x - 0.01f, y + 0.2f );
			p[ 1 ].set( x - 0.01f, y + 0.1f );
			p[ 2 ].set( x + 0.01f, y + 0.2f );
			p[ 3 ].set( x + 0.01f, y + 0.1f );
			drawRect( p, c1, c2 );
			p[ 0 ].set( x - 0.01f, y - 0.2f );
			p[ 1 ].set( x - 0.01f, y - 0.1f );
			p[ 2 ].set( x + 0.01f, y - 0.2f );
			p[ 3 ].set( x + 0.01f, y - 0.1f );
			drawRect( p, c1, c2 );
			p[ 0 ].set( x - 0.2f, y - 0.01f );
			p[ 1 ].set( x - 0.2f, y + 0.01f );
			p[ 2 ].set( x - 0.1f, y - 0.01f );
			p[ 3 ].set( x - 0.1f, y + 0.01f );
			drawRect( p, c1, c2 );
			p[ 0 ].set( x + 0.2f, y - 0.01f );
			p[ 1 ].set( x + 0.2f, y + 0.01f );
			p[ 2 ].set( x + 0.1f, y - 0.01f );
			p[ 3 ].set( x + 0.1f, y + 0.01f );
			drawRect( p, c1, c2 );
		}
		//時間制限
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_LINEAR ); //もどして
		length = 1.9f * static_cast< float >( 60 * TIME_LIMIT - gTime ) / static_cast< float >( 60 * TIME_LIMIT );
		p[ 0 ].set( -0.95f, -0.95f );
		p[ 1 ].set( -0.95f, -0.9f );
		p[ 2 ].set( 0.95f, -0.95f );
		p[ 3 ].set( 0.95f, -0.9f );
		c1 = c2 = 0x80404040;
		drawRect( p, c1, c2 );
		p[ 0 ].set( -0.95f, -0.95f );
		p[ 1 ].set( -0.95f, -0.9f );
		p[ 2 ].set( -0.95f + length, -0.95f );
		p[ 3 ].set( -0.95f + length, -0.9f );
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_ADDITIVE ); //加算?
		c1 = 0x80ff8888;
		c2 = 0x8088ffff;
		drawRect( p, c1, c2 );

		if ( Input::Manager().keyboard().isTriggered( ' ' ) ){
			gPlaying = !gPlaying;
		}

		if ( hp0 <= 0 || hp1 <= 0 || gTime >= 60 * TIME_LIMIT ){
			gPlaying = false;
			DebugScreen::instance().draw( 20, 5, "Game Over. press FIRE" );
			if ( Pad::instance()->isTriggered( Pad::FIRE, 0 ) ){
				//セットしているものは後始末
				gm.setVertexBuffer( 0 );
				gm.setIndexBuffer( 0 );
				gm.setTexture( 0 );

				SAFE_DELETE( gRobo[ 0 ] );
				SAFE_DELETE( gRobo[ 1 ] );
				gRobo[ 0 ] = new Robo( 0 );
				gRobo[ 1 ] = new Robo( 1 );
				gRobo[ 0 ]->setPosition( Vector3( 0.f, 0.f, 50.f ) );
				gRobo[ 0 ]->setAngleY( 180.0 );
				gPlaying = true;
				gTime = 0;
			}
		}
		gPrimitiveRenderer.draw(); //足し終わったら描画
		//終了判定(マウスで×ボタンが叩かれたか)
		if ( isEndRequested() ){
			if ( gStage ){
				Pad::destroy();
				SAFE_DELETE( gRobo[ 0 ] );
				SAFE_DELETE( gRobo[ 1 ] );
				SAFE_DELETE( gStage );
				//グローバルにあるものは勝手には消えないので開放
				gPrimitiveRenderer.release(); 
			}
		}
	}
Example #12
0
	void Framework::update(){

		WindowCreator wc = WindowCreator::instance();
		if ( gFirst ){
			const char* filename = wc.commandLineString();
			if ( filename && filename[ 0 ] != '\0' ){
				load( filename );
			}
			gFirst = false;
		}else{
			//ドラッグアンドドロップを処理する
			int dropN = wc.droppedItemNumber();
			if ( dropN > 0 ){
				const char* filename = wc.droppedItem( 0 ); //0番以外無視
				load( filename );
				wc.clearDroppedItem(); //これを呼ぶとfilenameもこわれるので最後に。
			}
		}
		
		//カメラ入力反映
		Input::Manager im = Input::Manager::instance();
		Input::Mouse mouse = im.mouse();
		Input::Keyboard keyboard = im.keyboard();
		if ( mouse.isOn( Input::Mouse::BUTTON_MIDDLE ) ){
			Graphics::Manager().captureScreen( "capture.tga" );
		}
		//ビュー行列を作ろう
		Vector3 eyePosition = gEyeTarget;
		eyePosition.z += gEyeDistance;

		Matrix34 rm;
		rm.setRotationY( gAngleY );
		rm.rotateX( gAngleX );
		Vector3 tv( 0.f, 0.f, 1.f );
		rm.mul( &tv, tv );
		eyePosition.setMadd( gEyeTarget, tv, gEyeDistance );
		Matrix34 zrm;
		zrm.setRotationZ( gAngleZ );
		Vector3 up( 0.f, 1.f, 0.f );
		zrm.mul( &up, up );

		Matrix34 vm;
		vm.setViewTransform( eyePosition, gEyeTarget, up );
		if ( gContainer ){
			float x = static_cast< float >( mouse.velocityX() );
			float y = static_cast< float >( mouse.velocityY() );
			if ( mouse.isOn( Input::Mouse::BUTTON_LEFT ) && mouse.isOn( Input::Mouse::BUTTON_RIGHT ) ){ //両ボタンでZ回転
				gAngleZ -= 0.2f * x;
				gAngleZ -= 0.2f * y;
			}else if ( mouse.isOn( Input::Mouse::BUTTON_LEFT ) ){ //左ボタン回転
				gAngleX -= 0.2f * y;
				if ( gAngleX > 89.9f ){
					gAngleX = 89.9f;
				}else if ( gAngleX < -89.9f ){
					gAngleX = -89.9f;
				}
				gAngleY -= 0.5f * x;
			}else if ( mouse.isOn( Input::Mouse::BUTTON_RIGHT ) ){ //右ボタン、注視点移動
				Vector3 xv( vm.m00, vm.m01, vm.m02 );
				xv *= x;
				Vector3 yv( vm.m10, vm.m11, vm.m12 );
				yv *= y;
				gEyeTarget.madd( xv, -0.003f * gEyeDistance );
				gEyeTarget.madd( yv, 0.003f * gEyeDistance );
			}
			int w = mouse.wheel();
			if ( w < 0 ){
				gEyeDistance *= 0.9f;
			}else if ( w > 0 ){
				gEyeDistance *= 1.1f;
			}
		}
		//透視変換行列
		Matrix44 pm;
		pm.setPerspectiveTransform( 
			60.f, 
			static_cast< float >( width() ),
			static_cast< float >( height() ),
			gEyeDistance * 0.01f, gEyeDistance * 10.f );
		//次にPVを作る
		pm *= vm;
	
		if ( keyboard.isOn( 'G' ) ){
			gAngleX = gAngleY = gAngleZ = 0.f;
			gEyeTarget = 0.f;
		}

		//ライトでもうごかそか
		Graphics::Manager gm = Graphics::Manager::instance(); 
		gm.setProjectionViewMatrix( pm );
		gm.setLightingMode( LIGHTING_PER_PIXEL );
		gm.enableDepthTest( true );
		gm.enableDepthWrite( true );
		gm.setLightColor( 0, Vector3( 1.f, 1.f, 1.f ) ); //白
		gm.setLightColor( 1, Vector3( 1.f, 0.7f, 0.7f ) ); //赤
		gm.setLightColor( 2, Vector3( 0.7f, 1.f, 0.7f ) ); //緑
		gm.setLightColor( 3, Vector3( 0.7f, 0.7f, 1.f ) ); //青
		gm.setAmbientColor( Vector3( 0.2f, 0.2f, 0.2f ) );
		gm.setEyePosition( eyePosition );
		float t = gEyeDistance * 0.4f;
		float lightIntensity[ 4 ];
		for ( int i = 0; i < 4; ++i ){
			lightIntensity[ i ] = t;
		}
		Vector3 lightPositions[ 4 ];
		for ( int i = 0; i < 4; ++i ){
			float t = static_cast< float >( gCount * ( i + 1 ) ) / 5.f;
			float d = gEyeDistance * 2.f;
			lightPositions[ i ].set( sin( t )*cos( t ) * d,  sin( t )*sin( t ) * d, cos( t ) * d );
			lightPositions[ i ] += gEyeTarget;
		}
		for ( int i = 0; i < 4; ++i ){
			gm.setLightPosition( i, lightPositions[ i ] );
			gm.setLightIntensity( i, lightIntensity[ i ] );
		}
		for ( int i = 0; i < gModels.size(); ++i ){
			gModels[ i ].draw();
		}
		//アニメ切り替え
		if ( keyboard.isTriggered( ' ' ) ){
			if ( gContainer.animationNumber() > 0 ){
				++gAnimationIndex;
				if ( gAnimationIndex >= gContainer.animationNumber() ){
					gAnimationIndex = 0;
				}
				for ( int i = 0; i < gTrees.size(); ++i ){
					gTrees[ i ].setAnimation( gContainer.animation( gAnimationIndex ) );
				}
			}
		}
		for ( int i = 0; i < gTrees.size(); ++i ){
			gTrees[ i ].updateAnimation();
			gTrees[ i ].draw();
		}
		if ( isEndRequested() ){
			gModels.clear();
			gTrees.clear();
			gContainer.release();
		}


		++gCount;
	}
Example #13
0
	void Framework::update(){
		if ( !gDatabase ){
			setFrameRate( 60 );
			gDatabase = new GraphicsDatabase( "cube.txt" );
			gModel = gDatabase->createModel( "cube" );
			/*補間の方程式を解く。

			p0 = a*t0^2 + b*t0 + c ...(0)
			p1 = a*t1^2 + b*t1 + c ...(1)
			2a*t0 + b = v           ...(2)

			まず一番式の形が単純な(2)を使ってb=の形にする。

			b = v - 2a*t0 ...(3)

			次に(1)-(0)でcを消す。

			p1 - p0 = a(t1^2- t0^2) + b(t1 - t0) ...(4)

			(4)に(3)を代入してやる。

			p1 - p0 = a(t1^2- t0^2) + (v-2a*t0)(t1 - t0) 

			がんばって展開する。

			p1 - p0 = a( t1^2 - t0^2 - 2*t0*t1 + 2*t0^2 ) + v(t1-t0)

			aで整理する

			a( t0^2 - 2*t0*t1 + t1^2 ) = (p1-p0) - v(t1-t0)
			
			ここでaの係数は(t0-t1)^2に因数分解できる。

			aについて解けて、

			a = ((p1-p0) - v(t1-t0)) / ( t0-t1 )^2 ...(5)

			後は(3)を使ってbが出るし、(0)を使ってcも出る。
			*/
			Vector3 v( 0.0, 0.0, 0.0 ); //第一区間の始点の傾きが0としようか。3つ計算するのでベクタ。
			//以下XYZで別々の計算をするが、見やすいようにベクタクラスの計算関数は使わない。要素毎計算で行く。
			for ( int i = 0; i < N-1; ++i ){ //点の数がNなんだから区間の数はN-1
				//見やすいように定数を作る。
				Vector3 p0 = gPoints[ i ];
				Vector3 p1 = gPoints[ i + 1 ];
				double t0 = gTimes[ i ];
				double t02 = t0 * t0;
				double t1 = gTimes[ i + 1 ];
				double t10 = t1 - t0;
				double t102 = t10 * t10;

				Vector3 a,b,c; //xyzで計算するから全部ベクタ
				//まずaを求める。
				a.x = ( ( p1.x - p0.x ) - v.x*t10 ) / t102;
				a.y = ( ( p1.y - p0.y ) - v.y*t10 ) / t102;
				a.z = ( ( p1.z - p0.z ) - v.z*t10 ) / t102;
				//次がb
				b.x = v.x - 2.0 * a.x * t0;
				b.y = v.y - 2.0 * a.y * t0;
				b.z = v.z - 2.0 * a.z * t0;
				//最後にc
				c.x = p0.x - a.x*t02 - b.x*t0;
				c.y = p0.y - a.y*t02 - b.y*t0;
				c.z = p0.z - a.z*t02 - b.z*t0;

				//式を保存
				gEquations[ i ][ 0 ] = a;
				gEquations[ i ][ 1 ] = b;
				gEquations[ i ][ 2 ] = c;

				//終点の傾きを計算
				v.x = 2.0 * a.x * t1 + b.x;
				v.y = 2.0 * a.y * t1 + b.y;
				v.z = 2.0 * a.z * t1 + b.z;
			}
		}

		//ループ処理する。
		double period = gTimes[ N - 1 ];
		double quot = gT / period;
		int quotInt = static_cast< int >( quot ); 
		gT -= static_cast< double >( quotInt ) * period;

		//区間を検索
		int last = 0;
		for ( int i = 0; i < N; ++i ){
			if ( gTimes[ i ] > gT ){
				break;
			}
			last = i;
		}

		//式にぶちこんで値を出す
		Vector3 p;
		Vector3 a = gEquations[ last ][ 0 ];
		Vector3 b = gEquations[ last ][ 1 ];
		Vector3 c = gEquations[ last ][ 2 ];
		Vector3 p0 = gPoints[ last ];
		Vector3 p1 = gPoints[ last + 1 ];
		p.x = ( ( a.x * gT ) + b.x ) * gT + c.x;
		p.y = ( ( a.y * gT ) + b.y ) * gT + c.y;
		p.z = ( ( a.z * gT ) + b.z ) * gT + c.z;
		//値が決まった。モデルにセット
		gModel->setPosition( p );

		Matrix44 pm;
		pm.setPerspectiveTransform( 45.0, width(), height(), 1.0, 10000.0 );
		Matrix34 vm;
		vm.setViewTransform( Vector3( 0.0, 30.0, 30.0 ), Vector3( 0.0, 0.0, 0.0 ) );
		pm *= vm;
		gModel->draw( pm, Vector3( 0.0, 1.0, 0.0 ), Vector3( 1.0, 1.0, 1.0 ), Vector3( 0.2, 0.2, 0.2 ) );

		gT += 1.0;
		if ( isEndRequested() ){
			SAFE_DELETE( gModel );
			SAFE_DELETE( gDatabase );
		}
	}
Example #14
0
	void Framework::update(){
		sleep( 16 );
		//SEロード
		if ( !gWaveSE ){
			gWaveSE = Sound::Wave::create( "dokaan.wav" );
		}
		//BGMロード
		if ( !gWaveBGM ){
			gWaveBGM = Sound::Wave::create( "charara.wav" );
		}
		//SEプレイヤー作成
		if ( !gPlayerSE0 && !gPlayerSE1 && gWaveSE.isReady() ){ //プレイヤーが空でロードが終わっているなら
			if ( !gWaveSE.isError() ){ //エラーかチェックしようね。ファイルを読み損ねても止まらないので。
				//1Waveから2個プレイヤー作成
				gPlayerSE0 = Sound::Player::create( gWaveSE );
				gPlayerSE1 = Sound::Player::create( gWaveSE );
			}
		}
		//BGMプレイヤー作成
		if ( !gPlayerBGM && gWaveBGM.isReady() ){ //プレイヤーが空でロードが終わっているなら
			if ( !gWaveBGM.isError() ){ //エラーかチェックしようね。ファイルを読み損ねても止まらないので。
				gPlayerBGM = Sound::Player::create( gWaveBGM );
				gPlayerBGM.play( true ); //ループ再生。無限に鳴る。
			}
		}
		//SEは80*16ミリ秒ごとに交互に鳴らす。片方は小さく。
		if ( gPlayerSE0 && gPlayerSE1 ){
			static int a;
			if ( a % 80 == 0 ){
				gPlayerSE0.setVolume( -10 );
				gPlayerSE0.play(); 
			}
			if ( a % 80 == 40 ){
				gPlayerSE1.setVolume( -20 );
				gPlayerSE1.play(); 
			}
			++a;
		}

		static int v = 0;
		if ( Input::Manager::instance().keyboard().isTriggered( Input::Keyboard::KEY_DOWN ) ){
			--v;
			if ( v < -100 ){
				v = -100;
			}
		}
		if ( Input::Manager::instance().keyboard().isTriggered( Input::Keyboard::KEY_UP ) ){
			++v;
			if ( v > 0 ){
				v = 0;
			}
		}
		ostringstream oss;
		oss << "VOLUME: " << v;
		drawDebugString( 0, 0, oss.str().c_str() );
		if ( gPlayerBGM ){
			gPlayerBGM.setVolume( v );
		}
		if ( isEndRequested() ){
			gWaveSE.release();
			gWaveBGM.release();
			gPlayerSE0.release();
			gPlayerSE1.release();
			gPlayerBGM.release();
		}
	}
Example #15
0
	void Framework::update(){
		if ( gCount == 0 ){
			//描画クラスを1000頂点、100バッチで初期化
			gPrimitiveRenderer = PrimitiveRenderer::create( 1000, 100 );
			//テクスチャロード
			gTexture = Texture::create( "test.tga" );
			while ( !gTexture.isReady() ){
				; //ロード待ち
			}
		}

		//元の頂点配列
		Vector3 p[ 4 ];
		Vector2 t[ 4 ];
		unsigned c[ 4 ]; //わかりやすいように色
		p[ 0 ].set( -1.f, -1.f, 0.f );
		p[ 1 ].set( -1.f, 1.f, 0.f );
		p[ 2 ].set( 1.f, -1.f, 0.f );
		p[ 3 ].set( 1.f, 1.f, 0.f );
		t[ 0 ].set( 0.f, 0.f );
		t[ 1 ].set( 0.f, 1.f );
		t[ 2 ].set( 1.f, 0.f );
		t[ 3 ].set( 1.f, 1.f );

		c[ 0 ] = 0xffff0000; //赤
		c[ 1 ] = 0xff00ff00; //緑
		c[ 2 ] = 0xff0000ff; //青
		c[ 3 ] = 0xffffffff; //白

		//ワールド変換(Z回転)
		Matrix34 wm;
		wm.setRotationZ( gCount * 2.f );
		//ビュー行列を作ろう
		Vector3 eyePosition;
		eyePosition.x = sin( gCount / 2.f ) * 4.f;
		eyePosition.z = cos( gCount / 2.f ) * 4.f;
		eyePosition.y = 1.f;
		Vector3 eyeTarget( 0.f, 0.f, 0.f );
		Matrix34 vm;
		vm.setViewTransform( eyePosition, eyeTarget, Vector3( 0.f, 1.f, 0.f ) );
		//透視変換行列
		Matrix44 pm;
		pm.setPerspectiveTransform( 
			60.f, 
			static_cast< float >( width() ),
			static_cast< float >( height() ),
			1.f, 100.f );
		//まずVWを作る
		vm *= wm;
		//次にPVWを作る
		pm *= vm;
		//行列セット
		gPrimitiveRenderer.setTransform( pm );
		//テクスチャセット
		gPrimitiveRenderer.setTexture( gTexture );

		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_LINEAR );

		//カウントで何を描くか変えてみよう
		if ( gCount % 300 > 200 ){ //三角形
			gPrimitiveRenderer.addTriangle( p[ 0 ], p[ 1 ], p[ 2 ], t[ 0 ], t[ 1 ], t[ 2 ], c[ 0 ], c[ 1 ], c[ 2 ] );
			gPrimitiveRenderer.addTriangle( p[ 3 ], p[ 1 ], p[ 2 ], t[ 3 ], t[ 1 ], t[ 2 ], c[ 3 ], c[ 1 ], c[ 2 ] );
		}else if ( gCount % 300 > 100 ){ //線
			//線を足す
			for ( int i = 0; i < 4; ++i ){
				for ( int j = i + 1; j < 4; ++j ){
					gPrimitiveRenderer.addLine( p[ i ], p[ j ], t[ i ], t[ j ], c[ i ], c[ j ] );
				}
			}
		}else{ //点
			gPrimitiveRenderer.addPoint( p[ 0 ], t[ 0 ], c[ 0 ] );
			gPrimitiveRenderer.addPoint( p[ 1 ], t[ 1 ], c[ 1 ] );
			gPrimitiveRenderer.addPoint( p[ 2 ], t[ 2 ], c[ 2 ] );
			gPrimitiveRenderer.addPoint( p[ 3 ], t[ 3 ], c[ 3 ] );
		}
		//スプライトとか書いてみようか。
		//アルファブレンド有効化
		gPrimitiveRenderer.setBlendMode( Graphics::BLEND_LINEAR );
		Vector2 p2[ 2 ];
		p2[ 0 ].set( 0.f, 0.f ); //左上
		p2[ 1 ].set( 128.f, 256.f ); //右下
		gPrimitiveRenderer.addRectangle( p2[ 0 ], p2[ 1 ], t[ 0 ], t[ 3 ], ( ( gCount % 256 ) << 24 ) | 0xffffff );

		//足し終わったので描く
		gPrimitiveRenderer.draw();

		DebugScreen() << frameRate();
		++gCount;

		if ( isEndRequested() ){
			gPrimitiveRenderer.release(); //グローバルなので開放処理が必要
			gTexture.release();
		}
	}