const bool Collision::rect_Circle(const MyRectangle* rect, const Circle* circle)const { GSvector2 vertex[4]= { rect->getPosition(),//0 rect->getPosition() + GSvector2(rect->getWidth(), 0),//1 rect->getPosition() + GSvector2(0, rect->getHeight()),//2 rect->getPosition() + rect->getSize()//3 }; for (int i = 0; i <4; i++) { //矩形の各点と円同士の当たり判定 if (circle->isCollision(&Circle(vertex[i], 0))) { return true; } } int n[4]= { 2,-1,1,-2 }; for (int i = 0; i <4; i++) { if (cricle_Segment(circle, &Segment(vertex[i], vertex[i + n[i]]))) { return true; } } return isRectInCircle(rect,circle); }
/******************************************************************* * * 描画 * *******************************************************************/ void Elevator::draw() { //ランダムモード時のみ表示 if(m_isRandomMode){ //エレベーターレーン描画 Sprite[TEXTRUE::LANE].setPosition(GSvector2(m_Position.x-26,-20)); Sprite[TEXTRUE::LANE].draw(); //エレベーターチェーン描画 Sprite[TEXTRUE::CHAIN].setPosition(GSvector2(m_Position.x+16.0f,m_Position.y-736.0f)); Sprite[TEXTRUE::CHAIN].draw(); //エレベーター(本体)描画 m_Sprite.setPosition(GSvector2(m_Position.x-10,m_Position.y-28)); m_Sprite.draw(); } //ゲート描画 for(int i = 0; i < StageHeight ;i++){ if(m_CGate[i] != NULL){ m_CGate[i]->draw(); } } //乗客からプレイヤーを探す for( int i = 0; i < MAX_CREW;i++ ){ //利用者がいなければ if( m_CUserData[i] == NULL ){continue;} //プレイヤーがフロア選択中でなければ if( !isChoosingPlayer(i) ){continue;} //選択ボタンを順番に描画 for( int j = 0; j < 4;j++ ){ //選択ボタンなら if( m_CUserData[i]->m_GoalFloor == j+1 ){ //切り取り座標指定 Sprite[TEXTRUE::NUMBER].setRect(GSrect(30.0f*j,30.0f,30.0f*(j+1),30.0f*2)); } else{ //別切り取り座標指定 Sprite[TEXTRUE::NUMBER].setRect(GSrect(30.0f*j,0.0f,30.0f*(j+1),30.0f)); } //描画 Sprite[TEXTRUE::NUMBER].setPosition(GSvector2(m_Position.x-30,m_Position.y-(j*20)+30)); Sprite[TEXTRUE::NUMBER].draw(); } } }
/******************************************************************* * * コンストラクタ * *******************************************************************/ ElevatorAlgorithm::ElevatorAlgorithm() :m_InitPosition(GSvector2(0,0)) ,m_NextArray(GSvector2(0,0)) ,m_SearchFloor(1) ,m_SearchCount(0) ,m_ReflectValue(1) ,m_FloorSearchCount(0) ,m_FloorReflectValue(1) ,CallState(ELEVATOR::FREE) ,m_isAllSearch(false) { }
/******************************************************************* * * 描画 * *******************************************************************/ void TitleScene::draw() { //下の背景 m_SpriteBG.draw(); //タイトル背景描画 for(int i= 0;i<3;i++){ m_SpriteBack[i].draw(); } if(m_NowProcess==1){return;} //バー描画 for(int i=0;i<5;++i){ m_Sprite[TEXTURE::BAR].setPosition(GSvector2(794.0f,400.0f+70.0f*i)); if( i > 2 ){ m_Sprite[TEXTURE::BAR].setRect(GSrect(0.0f,66.0f,111.0f,99.0f)); } else if( m_Select == i ){ m_Sprite[TEXTURE::BAR].setRect(GSrect(0.0f,0.0f,111.0f,33.0f)); } else{ m_Sprite[TEXTURE::BAR].setRect(GSrect(0.0f,33.0f,111.0f,66.0f)); } m_Sprite[TEXTURE::BAR].draw(); } //バーの文字 for(int i=0;i<3;++i){ m_Sprite[TEXTURE::Name].setPosition(GSvector2(804.0f,410.0f+70.0f*i)); m_Sprite[TEXTURE::Name].setRect(GSrect(0.0f,i*23.0f,112.0f,23.0f+i*23.0f)); m_Sprite[TEXTURE::Name].draw(); } //セレクト移行中なら if(m_isChangeSelect){return;} //背景を変えるか if( m_isChangeBack ){ if(m_Select==1)m_Sprite[TEXTURE::MANUAL].draw(); else if(m_Select==2)m_Sprite[TEXTURE::CREDIT].draw(); } //フォグを消すか if(m_isFog){ for(int i = 0;i<m_FogDepth;i++ ){ m_Sprite[TEXTURE::BLACKFOG].draw(); } } }
void Ending::Draw(const Renderer& renderer) { renderer.DrawTextrue("space0.bmp", &GSvector2(0, 0)); renderer.DrawTextrue("con_logo.bmp", &logoPosi,&GSvector2(2,2),&GScolor(1,1,1,1)); anim.draw(renderer, "kasasagi_end.bmp", &playerPosi); if (playerPosi.x < 0) { renderer.DrawString("スペースを押してね",&GSvector2(300,600),30); } fadeIn.draw(renderer); fadeOut.draw(renderer); starFade.draw(renderer); }
const bool Collision::isRectInCircle(const MyRectangle* rect, const Circle* circle)const { Segment seg1(rect->getPosition(), rect->getPosition() + GSvector2(rect->getWidth(), 0));//0,1 Segment seg2(rect->getPosition() + rect->getSize(),rect->getPosition() + GSvector2(0, rect->getHeight()));//3,2 float res1 = segment_Point_atan(&seg1,&circle->center); float res2 = segment_Point_atan(&seg2,&circle->center); if (0 <= res1 && res1 <= 90 && 0 <= res2&& res2 <= 90) { return true; } return false; }
/******************************************************************* * * ゲートを開け終えたか * *******************************************************************/ bool TitleScene::isOpenGate() { //扉の座標を動かす m_GatePosition.x += 2.0f; m_SpriteBack[TEXTURE::LDoor].setPosition(GSvector2(-m_GatePosition.x,m_GatePosition.y)); m_SpriteBack[TEXTURE::RDoor].setPosition(GSvector2(m_GatePosition.x,m_GatePosition.y)); //扉は開いたか if(m_GatePosition.x >= 700.0f){ return true; } return false; }
void Ending::Init() { fadeIn.initialize(); fadeOut.initialize(); isEnd = false; device.getSound().PlaySE("ending.wav"); playerPosi = GSvector2(1280, 200); logoPosi = playerPosi + GSvector2(190, 50); vel = GSvector2(0, 0); anim.addCell("A", 1, 3, 208, 204); animTimer.initialize(); animTimer.setStarTimer(30.f); fadeIn.start(GScolor(0, 0, 0, 1), GScolor(0, 0, 0, 0), 1.0f); }
void Item::update(float time) { position_ += velosity_; velosity_ += GSvector2(0, 0.02f); if (!world_.isInSide(position_)) { alive_ = false; } }
/******************************************************************* * * エレベーターを出たか * *******************************************************************/ bool TitleScene::isOutElevator() { //壁スライド m_BoardPosition.x += 3.0f; m_BoardPosition.y -= 5.0f; m_ScaleCount += 0.01f; //右扉を動かす m_SpriteBack[TEXTURE::RDoor].setPosition(m_GatePosition+m_BoardPosition); //操作盤背景 m_SpriteBack[TEXTURE::Board].setPosition(GSvector2(m_BoardPosition.x,m_BoardPosition.y)); m_SpriteBack[TEXTURE::Board].setScale(GSvector2(2.0f,2.0f+(m_ScaleCount*2))); //背景 m_SpriteBG.setPosition(GSvector2(0.0f,10.0f+m_BoardPosition.y*0.015f)); m_SpriteBG.setScale(GSvector2(1.8f+m_ScaleCount*0.16f,1.8f+m_ScaleCount*0.15f)); //エレベーターを出たか if( m_BoardPosition.x >= 400.0f ){ return true; } return false; }
void Operation::Draw(const Renderer& renderer) { const std::string Tex[3] = { "Control", "stage_commentary", "object" }; if (index == 3) { index -= 1; isEnd = true; fadeOut.start(GScolor(0, 0, 0, 0), GScolor(0, 0, 0, 1), 1.f); } renderer.DrawTextrue(Tex[index] + ".bmp", &GSvector2(0, 0)); fadeIn.draw(renderer); fadeOut.draw(renderer); }
/******************************************************************* * * ゲート生成 * *******************************************************************/ void Elevator::setup(StageData mStageData) { //仮の画像IDを初期値 int TextureID = 210; //ランダムモードなら if(mStageData.m_GameMode == GAMEMODE::Random ){ m_isRandomMode = true; TextureID = 223;//違う画像IDに変更 } //エレベーターに合わせてゲートを生成 for(int i = 0; i < StageHeight; i++){ for(int j = 0; j < MaxFloor; j++){ if( FloorHeight[j] == ( i * OBJECT_SIZE ) ){ m_CGate[i] = new BoardingGate(TextureID,GSvector2(m_Position.x,i*OBJECT_SIZE),j+1); } } } }
/******************************************************************* * * 生成 * *******************************************************************/ void ObjectManager::setup(StageData mStageData) { int Stage; //エレベーター数によってステージ変化 if( 0 < mStageData.m_ElevatorNumber && mStageData.m_ElevatorNumber <= 5 ){ Stage = 0; } if( mStageData.m_ElevatorNumber == 6 ){ Stage = 1; } if( mStageData.m_ElevatorNumber == 7 ){ Stage = 2; } //ゲームモードによってオブジェクトに使う画像ID調整 int addTextureID=0; if( mStageData.m_GameMode == GAMEMODE::Random ){ addTextureID = 19; } //基本的なオブジェクトの生成 for(int i = 0; i < StageHeight; i++){ for(int j = 0; j < StageWigth; j++){ if(BASIC_OBJECT[Stage][i][j] != 0){ if(BASIC_OBJECT[Stage][i][j] == 1){ m_CDefaultStage[j][i] = new Floor(OBJECT::i_Floor,OBJECT::i_Floor+addTextureID,GSvector2(j*OBJECT_SIZE,i*OBJECT_SIZE)); } if(BASIC_OBJECT[Stage][i][j] == 2){ m_CDefaultStage[j][i] = new Ladder(OBJECT::i_Ladder,OBJECT::i_Ladder+addTextureID,GSvector2(j*OBJECT_SIZE,i*OBJECT_SIZE)); } if(BASIC_OBJECT[Stage][i][j] == 3){ m_CDefaultStage[j][i] = new CrossFloor(OBJECT::i_CrossFloor,OBJECT::i_CrossFloor+addTextureID,GSvector2(j*OBJECT_SIZE,i*OBJECT_SIZE)); } } } } }
/******************************************************************* * * コンストラクタ * *******************************************************************/ Elevator::Elevator(GSvector2 Position) :ElevatorBase(OBJECT::i_Elevator,OBJECT::i_Elevator,GSrect(0.0f,0.0f,84.0f,120.0f),Position,false,1) ,m_Gate_Ypos(0) ,m_isUserRiding(false) ,m_UserInterval(0) ,m_isRidingTurn(false) ,m_ControlState(CONTROL::FREE) ,m_isRandomMode(false) { //エレベーターチェーン Sprite[TEXTRUE::CHAIN].setTextureID(205); Sprite[TEXTRUE::CHAIN].setRect(GSrect(0.0f,0.0f,33.0f,800.0f)); //エレベーターレーン Sprite[TEXTRUE::LANE].setTextureID(206); Sprite[TEXTRUE::LANE].setRect(GSrect(0.0f,0.0f,128.0f,800.0f)); //プレイヤー用のフロアセレクト数字 Sprite[TEXTRUE::NUMBER].setTextureID(112); Sprite[TEXTRUE::NUMBER].setRect(GSrect(0.0f,0.0f,120.0f,60.0f)); Sprite[TEXTRUE::NUMBER].setScale(GSvector2(0.6,0.6)); //乗客初期化 for(int i = 0; i < MAX_CREW;i++ ){ m_CUserData[i] = NULL; } //ゲート初期化 for(int i = 0; i <StageHeight;i++){ m_CGate[i] = NULL; } //エレベーターの初期位置指定 this->m_Position.y = OBJECT_SIZE*10; }
void Ending::Update() { starFade.update(); fadeIn.updata(); if (!fadeIn.getIsEnd())return; vel = GSvector2(-2.0f, 0); playerPosi += vel; if (playerPosi.x > 0) { logoPosi = playerPosi; } anim.updata("A"); animTimer.updata(); fadeOut.updata(); isEnd = fadeOut.getIsEnd(); if (fadeOut.getIsStart())return; if (device.getInput().getActionTrigger()) { fadeOut.start(GScolor(0, 0, 0, 0), GScolor(0, 0, 0, 1), 1.0f); } }
void EnemyBulletGenerator::fire(const GSvector2& position, const int bullet_type, const float speed) { GSvector2 v; float angle; switch (bullet_type) { case ばらまき: v = GSvector2(gsRandf(-1, 1), gsRandf(-1, 1)); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); break; case 自機狙い弾: angle = MathUtility::subtractAngle(position, 0, world_.getPlayer()->getPosition()); v = GSvector2( MathUtility::cos(angle), MathUtility::sin(angle) ); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); break; case 自機狙い24方位: angle = MathUtility::subtractAngle(position, 0, world_.getPlayer()->getPosition()); for (int i = 0; i < 360; i += 15) { v = GSvector2( MathUtility::cos(i + angle), MathUtility::sin(i + angle) ); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); } break; case 24方位: for (int i = 0; i < 360; i += 15) { v = GSvector2( MathUtility::cos(i), MathUtility::sin(i) ); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); } break; case 前方5方位: for (int i = 240; i <= 300; i += 15) { v = GSvector2( MathUtility::cos(i), MathUtility::sin(i) ); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); } break; case 自機狙い前方5方位: angle = MathUtility::subtractAngle(position, 0, world_.getPlayer()->getPosition()); for (int i = -30; i <= 30; i += 15) { v = GSvector2( MathUtility::cos(i + angle), MathUtility::sin(i + angle) ); v.normalize(); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * speed)); } break; case 垂直弾: for (int i = speed / 2; i <= speed * 2; i++) { v = GSvector2(0, 1); world_.add(CHARACTER_ENEMY_BULLET, std::make_shared<EnemyBullet>( world_, position, v * (i / 2.0f))); } default: break; } world_.playSE(SE_SHOT); count += 1; }
Item::Item(IWorld& world, const CharacterID characterId, const GSvector2& position, const int size) : Character(world, characterId, TEXTURE_ITEM, position, size) { velosity_ = GSvector2(0, 0); }
/******************************************************************* * * コンストラクタ * *******************************************************************/ TitleScene::TitleScene(SceneManager& m_manager,bool FogFlag) :SceneBase(m_manager) ,m_isFog(FogFlag) ,m_FogDepth(40) ,m_Select(0) ,m_isChangeSelect(false) ,m_NowProcess(0) ,m_GatePosition(GSvector2(0.0f,0.0f)) ,m_BoardPosition(GSvector2(0.0f,0.0f)) ,m_ScaleCount(0.0f) ,m_isChangeBack(false) { TextureLoader m_Loader; m_Loader.Load("res/CSV/Title.csv"); //下の背景(セレクトシーンの背景) m_SpriteBG.setTextureID(9); m_SpriteBG.setPosition(GSvector2(0.0f,10.0f)); m_SpriteBG.setScale(GSvector2(1.8f,1.8f)); //背景全般 for(int i= 0;i<3;i++){ m_SpriteBack[i].setTextureID(i+1); m_SpriteBack[i].setPosition(GSvector2(0.0f,0.0f)); m_SpriteBack[i].setScale(GSvector2(2.0f,2.0f)); } m_SpriteBack[TEXTURE::Board].setRect(GSrect(0.0f,0.0f,512.0f,384.0f)); //バー m_Sprite[TEXTURE::BAR].setTextureID(7); m_Sprite[TEXTURE::BAR].setScale(GSvector2(2.0f,2.0f)); //バーの文字 m_Sprite[TEXTURE::Name].setTextureID(4); m_Sprite[TEXTURE::Name].setScale(GSvector2(2.0f,2.0f)); //マニュアル m_Sprite[TEXTURE::MANUAL].setTextureID(5); m_Sprite[TEXTURE::MANUAL].setScale(GSvector2(2.0f,2.0f)); //クレジット m_Sprite[TEXTURE::CREDIT].setTextureID(6); m_Sprite[TEXTURE::CREDIT].setScale(GSvector2(2.0f,2.0f)); m_Sprite[TEXTURE::BLACKFOG].setTextureID(8); m_Sprite[TEXTURE::BLACKFOG].setPosition(GSvector2(0.0f,0.0f)); m_Sprite[TEXTURE::BLACKFOG].setScale(GSvector2(2.0f,2.0f)); }
void GameObjectFactory::addContainer() { GSvector2 zero(0, 0); const int length = 17; GSvector2 navSize(45,100); GameObject* objs[length] = { /* 画像名, 位置(原型),見た目のサイズ(基本画像サイズ), 位置からの当たり判定位置と横縦幅 */ new Respawn("respawn.bmp", zero, GSvector2(94, 88), MyRectangle(GSvector2(11, 11), GSvector2(85, 0))), new Player("orihime.bmp", zero, GSvector2(64, 64), MyRectangle(GSvector2(20, 50), GSvector2(30, 14)), &scroll, device, effectMediator), new ImMovable("meteo.bmp", zero, GSvector2(44, 44), MyRectangle(zero, GSvector2(44, 44)), GAMEOBJ_TYPE::PLANET), new ImMovable("start.bmp", zero, GSvector2(200, 100), MyRectangle(GSvector2(30, 15), GSvector2(180, 30)), GAMEOBJ_TYPE::START), new ImMovable("goal.bmp", zero, GSvector2(200, 100), MyRectangle(GSvector2(30, 15), GSvector2(180, 30)), GAMEOBJ_TYPE::GOAL), new Magpie("magpie.bmp", zero, GSvector2(128, 128), MyRectangle(GSvector2(0, 0), GSvector2(128, 128)), objMediator,device), new ImMovable("magpieEnd.bmp", zero, GSvector2(94, 88), MyRectangle(GSvector2(11, 11), GSvector2(85, 23)), GAMEOBJ_TYPE::MAGPIE_ENDSPOT), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_R), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_L), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_U), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_D), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_RU), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_RD), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_LD), new Signboard("nav.bmp", zero, navSize, GAMEOBJ_TYPE::SIGNBOARD_LU), new ImMovable("sasa.bmp", zero, GSvector2(96, 128), MyRectangle(zero, zero), GAMEOBJ_TYPE::SASA), new Hikoboshi("hikobosi.bmp",zero,GSvector2(64,64),MyRectangle(zero,GSvector2(64,64))) }; GAMEOBJ_TYPE types[length] = { GAMEOBJ_TYPE::RESPAWN, GAMEOBJ_TYPE::PLAYER, GAMEOBJ_TYPE::PLANET, GAMEOBJ_TYPE::START, GAMEOBJ_TYPE::GOAL, GAMEOBJ_TYPE::MAGPIE, GAMEOBJ_TYPE::MAGPIE_ENDSPOT, GAMEOBJ_TYPE::SIGNBOARD_R, GAMEOBJ_TYPE::SIGNBOARD_L, GAMEOBJ_TYPE::SIGNBOARD_U, GAMEOBJ_TYPE::SIGNBOARD_D, GAMEOBJ_TYPE::SIGNBOARD_RU, GAMEOBJ_TYPE::SIGNBOARD_RD, GAMEOBJ_TYPE::SIGNBOARD_LD, GAMEOBJ_TYPE::SIGNBOARD_LU, GAMEOBJ_TYPE::SASA, GAMEOBJ_TYPE::HIKOBOSHI }; for (int i = 0; i < length; i++) { GameObj_Ptr obj = GameObj_Ptr(objs[i]); container.insert(std::pair<GAMEOBJ_TYPE, GameObj_Ptr>(types[i], obj)); } }