void Ship::move() { if (comeBack) comeBackControl(); else moveControl(); if (muteki) { mutekiCnt++; if (mutekiCnt > 200) muteki = false; } //fire if ((Input::KeyZ.pressed || gm->getController()->buttonX.pressed) && cnt % 3 == 0) { auto shots = gm->getShots(); shots->create(pos + Vec2(-10.0, 0.0), { 0.0, -30.0 }); shots->create(pos + Vec2(10.0, 0.0), { 0.0, -30.0 }); if (slowMove) { shots->create(pos + Vec2(-15.0, 0.0), { 0.0, -30.0 }); shots->create(pos + Vec2(15.0, 0.0), { 0.0, -30.0 }); } else { shots->create(pos + Vec2(-10.0, 0.0), { -5.0, -30.0 }); shots->create(pos + Vec2(10.0, 0.0), { 5.0, -30.0 }); } SoundAsset(L"shoot").playMulti(); } if (Input::KeySemicolon.clicked) life++; if (Input::KeyMinus.clicked) life--; cnt++; }
// 毎フレーム updateAndDraw() で呼ばれる void Rule::update() { Graphics::SetBackground(HSV(System::FrameCount(),0.6,0.9)); for (int i = 0; i < 40; i++){ switch (i % 4){ case 0: cir[i].rightmove(); break; case 1: cir[i].leftmove(); break; case 2: cir[i].sinmove(); break; case 3: cir[i].sinmove2(); break; default: break; } cir[i].update(); if (cir[i].getE())click.drawCenter(L"click", { cir[i].getX(), cir[i].getY() }, Palette::White); } button_m.update(); if (button_m.isClicked()){ SoundAsset(bgm_m).stop(); changeScene(L"Start"); } static int frameCounter = 0; if(frameCounter >= 60 * 90) { frameCounter = 0; SoundAsset(bgm_m).pause(1000); changeScene(L"Start", 1000); return; } else { ++frameCounter; } }
void Ship::destory() { if (muteki) return; pos = { Window::Width() / 2, Window::Height() + rad }; life--; SoundAsset(L"damage").playMulti(); gm->getBullets()->clear(); comeBack = true; comeBackCnt = 0; muteki = true; mutekiCnt = 0; if (life < 0) gm->startGameOver(); }
// クラスの初期化時に一度だけ呼ばれる(省略可) void Rule::init() { button_m.show(); title = Font(70); subtitle = Font(40); text = Font(20); mainimage = Texture(L"Asset/Image/ruletext.png"); game1_m = Texture(L"Asset/Image/ScreenShot_Game1.png"); game2_m = Texture(L"Asset/Image/ScreenShot_Game2.png"); game3_m = Texture(L"Asset/Image/Game3Scene.png"); for (int i = 0; i < 40; i++){ cir[i] = Cir(Random(0,Window::Width()),Random(0,Window::Height()), 30, (2 * (i+1))%5+1); } font = Font(20); click = Font(10); SoundAsset(bgm_m).play(); }
void Main() { ResourceLoader resources; auto sampler = SamplerState(SamplerState::Default2D); sampler.filter = TextureFilter::MinMagMipPoint; Graphics2D::SetSamplerState(sampler); Window::Resize(320 * 2, 240 * 2); Window::SetTitle(L"まちへかえろう(仮)"); Array<HurdleObject> hurdles; Array<BuildingLayer> buildingLayers; Array<BuildingLayer2> buildingLayers2; Map::instance().init(40, 15); for (int i = 0; i < 40; i++) { Map::instance().set(i, 14, 5); Map::instance().set(i, 13, 5); Map::instance().set(i, 12, 4); Map::instance().set(i, 11, 3); Map::instance().set(i, 10, 3); Map::instance().set(i, 9, 2); Map::instance().set(i, 8, 1); } auto viewLeft = 0.0; auto mycharDead = false; ScreenState currentState = ScreenState::InTitle, prevState = currentState; bool prevSpacePressed = false; auto TitleTimer = TimerMillisec(); ScriptEngine asEngine; asEngine.RegisterMethod(L"int getAt(double x, double y)", &Map::getAt, Map::instance()); asEngine.RegisterProperty(L"double _viewX", &viewLeft); asEngine.RegisterProperty(L"bool _isGameOvered", &mycharDead); asEngine.RegisterFunction(L"void playJumpSound()", PlayJumpSound); auto context_mychar = asEngine.CreateContextFromScript(L"res/scripts/Mychar.as"); Record::instance().init(); int fc = 0; while (System::Update()) { bool spacePressedInFrame = !prevSpacePressed && Input::KeySpace.pressed; prevSpacePressed = Input::KeySpace.pressed; asEngine.setFrameCount(fc); switch (currentState) { case ScreenState::InTitle: if (!TitleTimer.isActive) TitleTimer.start(); renderBackgrounds(viewLeft, resources); renderBuildingLayers(buildingLayers, buildingLayers2, resources); renderMap(viewLeft, resources); renderTitle(TitleTimer.elapsed(), resources); renderCurrentMax(); if (spacePressedInFrame) { // GameInit SoundAsset(SoundResourceLoader::decide).play(); viewLeft = 0.0; mycharDead = false; context_mychar.Reenter(); buildingLayers.clear(); buildingLayers2.clear(); hurdles.clear(); currentState = ScreenState::Gaming; } break; case ScreenState::Gaming: // appear hurdles at random if (RandomBool(0.02)) { if (hurdles.empty() || hurdles.back().getPos().x - (viewLeft + 320.0f) < -48.0f) { // allocate space least 48 logical-pixels hurdles.emplace_back(HurdleObject(Vec2(viewLeft + 320.0f, 8.0f * 16.0f + 8.0f))); } } // appear building at random if (RandomBool(0.02 / 30.0)) { if (buildingLayers.empty() || buildingLayers.back().getPos().x < 0.0f) { buildingLayers.emplace_back(BuildingLayer(Vec2(320.0f, -60.0f))); } } if (RandomBool(0.01 / 30.0)) { if (buildingLayers2.empty() || buildingLayers2.back().getPos().x < 0.0f) { buildingLayers2.emplace_back(BuildingLayer2(Vec2(320.0f, -60.0f))); } } asEngine.setFrameCount(fc); context_mychar.Execute(); renderBackgrounds(viewLeft, resources); renderBuildingLayers(buildingLayers, buildingLayers2, resources); renderMap(viewLeft, resources); if (renderHurdlesAndHitTest(viewLeft, context_mychar.GetGlobalDoubleVec2(L"x", L"y"), hurdles, resources)) { if (!mycharDead) SoundAsset(SoundResourceLoader::died).play(); mycharDead = true; } renderPlayer(viewLeft, context_mychar.GetGlobalDouble(L"angle"), context_mychar.GetGlobalDoubleVec2(L"x", L"y"), resources); renderInfo(toScore(context_mychar.GetGlobalDouble(L"x"))); // Host Processes if (mycharDead && context_mychar.GetGlobalDouble(L"x") < viewLeft - 120.0f) { // update record Record::instance().recordScore(toScore(context_mychar.GetGlobalDouble(L"x"))); currentState = ScreenState::Result; } break; case ScreenState::Result: renderBackgrounds(viewLeft, resources); renderBuildingLayers(buildingLayers, buildingLayers2, resources); renderMap(viewLeft, resources); renderHurdlesAndHitTest(viewLeft, context_mychar.GetGlobalDoubleVec2(L"x", L"y"), hurdles, resources); renderResult(toScore(context_mychar.GetGlobalDouble(L"x")), Record::instance().isUpdated(), fc); if (spacePressedInFrame) { // GameInit SoundAsset(SoundResourceLoader::decide).play(); TitleTimer.reset(); currentState = ScreenState::InTitle; } break; } if (prevState != currentState) { fc = 0; } prevState = currentState; // Common Postprocesses fc++; viewLeft += 2.5f; } Map::instance().clean(); }
void PlayJumpSound() { SoundAsset(L"jump").playMulti(); }
bool AwakePlayerAttack(GameBase* gb, const T& collision, const Optional<ShimiColors>& col, int value) { const bool enemyHit = AnyOf(gb->m_EM.m_enemies, [gb, &collision](const std::shared_ptr<Enemy>& e) { const bool f = collision.intersects(Circle(e->m_pos, 30)); if (f) { if (!e->m_isDead) { EffectManager::I()->effect.add<VanishingEnemy>(e->m_pos.asPoint(), 25.0, 0.5, e->m_shimiColor); SoundAsset(L"EnemyVanish").playMulti(); } e->m_isDead = true; if (e->m_itemID && !gb->m_idb.isgot(e->m_itemID.value())) { const int index = e->m_itemID.value(); const int itemVal = gb->m_idb.m_list[index].m_value; const ShimiColors itemCol = gb->m_idb.m_list[index].m_color; gb->m_mv.addShotExp(gb->m_idb.m_list[index]); EffectManager::I()->effect.add<ItemGet>(gb, e->m_pos, itemCol, itemVal); gb->m_idb.got(index); } } return f; }); const bool bossHit = AnyOf(gb->m_bosses, [gb, &collision, &col, &value](const std::shared_ptr<Boss>& b) { const HitState hit = b->damage(collision, col, value);// collision.intersects(Circle(e.m_enemy->m_pos, 30)); switch (hit) { case HitState::Damage: SoundAsset(L"BossDamage").playMulti(); break; case HitState::NoDamage: SoundAsset(L"BossNoDamage").play(); break; default: break; } return hit != HitState::Avoid; }); const bool obsHit = AnyOf(gb->m_obstacles, [&collision, &col](const std::shared_ptr<ObstacleBase>& obs) { const bool isColled = obs->m_pols.intersects(collision); const bool isCrashed = obs->shotByColor(col) && isColled; if (isCrashed && !obs->m_isDead) { SoundAsset(L"BreakObstacle").playMulti(); obs->m_isDead = true; EffectManager::I()->effect.add<Vanishing>(obs->m_pols.boundingRect.center, 100, ToColor(col.value())); } return isCrashed; }); return enemyHit || bossHit || obsHit; }