Building *Building::CreateBuilding( char *_name ) { for( int i = 0; i < NumBuildingTypes; ++i ) { if( stricmp( _name, GetTypeName(i) ) == 0 ) { return CreateBuilding(i); } } //DarwiniaDebugAssert(false); return NULL; }
Building *Building::CreateBuilding( char *_name ) { for( int i = 0; i < NumBuildingTypes; ++i ) { if( BuildingIsBlocked(i) ) continue; if( stricmp( _name, GetTypeName(i) ) == 0 ) { return CreateBuilding(i); } } //AppDebugAssert(false); return NULL; }
VOID Init(HWND hWnd, WPARAM wParam, LPARAM lParam) { //加载背景位图 m_hBackgroundBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BACKGROUND)); //加载Building位图 m_hBuildingBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BUILDING)); //加载Building位图 m_hHeroBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_HERO)); //加载游戏状态位图 m_hGameStatusBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_GAME_STATUS)); //加载Block位图 int k; for (k = 0; k < BLOCK_COLOR_NUM; ++k) { m_hBlockBmp[k] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(m_blockBmpNames[k])); } //加载屋顶位图 for (k = 0; k < ROOF_COLOR_NUM; ++k) { m_hRoofkBmp[k] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(m_roofBmpNames[k])); } //创建英雄、建筑 m_hero = CreateHero(100, 100, 30, 50, m_hHeroBmp, 0, 3); m_building = CreateBuilding(0, 70, 500, 250, m_hBuildingBmp); //创建地形 for (k = 0; k < MAX_TERRIAN_NUM; ++k) { if (k % 4 == 0) { continue; } m_terrian[k] = CreateTerrian(k * 65, 100 + 50 * (k % 2), 65, 300, m_hBlockBmp[k % 4], m_hRoofkBmp[k % 2], 33, 65); } //创建游戏状态 m_gameStatus = CreateGameStatus(0, 0, 40, 30, m_hGameStatusBmp); //启动计时器 SetTimer(hWnd, TIMER, 30, NULL); }
bool CTaskBuild::EventProcess(const Event &event) { Math::Matrix* mat; Math::Vector pos, dir, speed; Math::Point dim; float a, g, cirSpeed, dist, linSpeed; if ( m_engine->GetPause() ) return true; if ( event.type != EVENT_FRAME ) return true; if ( m_bError ) return false; m_time += event.rTime; m_progress += event.rTime*m_speed; // other advance if ( m_phase == TBP_TURN ) // preliminary rotation? { a = m_object->GetAngleY(0); g = m_angleY; cirSpeed = Math::Direction(a, g)*1.0f; if ( cirSpeed > 1.0f ) cirSpeed = 1.0f; if ( cirSpeed < -1.0f ) cirSpeed = -1.0f; m_physics->SetMotorSpeedZ(cirSpeed); // turns left/right return true; } if ( m_phase == TBP_MOVE ) // preliminary forward/backward? { dist = Math::Distance(m_object->GetPosition(0), m_metal->GetPosition(0)); linSpeed = 0.0f; if ( dist > 30.0f ) linSpeed = 1.0f; if ( dist < 30.0f ) linSpeed = -1.0f; m_physics->SetMotorSpeedX(linSpeed); // forward/backward return true; } if ( m_phase == TBP_RECEDE ) // terminal back? { m_physics->SetMotorSpeedX(-1.0f); // back return true; } if ( m_phase == TBP_TAKE ) // takes gun? { return true; } if ( m_phase == TBP_PREP ) // prepares? { return true; } if ( m_phase == TBP_TERM ) // ends? { return true; } if ( !m_bBuild ) // building to build? { m_bBuild = true; pos = m_metal->GetPosition(0); a = m_object->GetAngleY(0); if ( !CreateBuilding(pos, a+Math::PI) ) { m_metal->SetLock(false); // usable again m_motion->SetAction(-1); m_object->SetObjectParent(14, 0); m_object->SetPosition(14, Math::Vector(-1.5f, 0.3f, -1.35f)); m_object->SetAngleZ(14, Math::PI); m_camera->FlushEffect(); Abort(); m_bError = true; m_displayText->DisplayError(ERR_TOOMANY, m_object->GetPosition(0)); return false; } CreateLight(); } pos = m_buildingPos; pos.y += m_buildingHeight*m_progress; m_building->SetPosition(0, pos); // the building rises m_building->SetZoom(0, m_progress*0.75f+0.25f); m_metal->SetZoom(0, 1.0f-m_progress); a = (2.0f-2.0f*m_progress); if ( a > 1.0f ) a = 1.0f; dir.x = (Math::Rand()-0.5f)*a*0.1f; dir.z = (Math::Rand()-0.5f)*a*0.1f; dir.y = (Math::Rand()-0.5f)*a*0.1f; m_building->SetCirVibration(dir); if ( !m_bBlack && m_progress >= 0.25f ) { BlackLight(); } if ( m_lastParticle+m_engine->ParticleAdapt(0.05f) <= m_time ) { m_lastParticle = m_time; pos = m_metal->GetPosition(0); speed.x = (Math::Rand()-0.5f)*20.0f; speed.z = (Math::Rand()-0.5f)*20.0f; speed.y = Math::Rand()*10.0f; dim.x = Math::Rand()*6.0f+4.0f; dim.y = dim.x; m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFIRE); pos = Math::Vector(0.0f, 0.5f, 0.0f); mat = m_object->GetWorldMatrix(14); pos = Transform(*mat, pos); speed = m_metal->GetPosition(0); speed.x += (Math::Rand()-0.5f)*5.0f; speed.z += (Math::Rand()-0.5f)*5.0f; speed -= pos; dim.x = 2.0f; dim.y = dim.x; m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIFIREZ); if ( Math::Rand() < 0.3f ) { m_sound->Play(SOUND_BUILD, m_object->GetPosition(0), 0.5f, 1.0f*Math::Rand()*1.5f); } } return true; }