//—————————————————————— // 機能:描画処理 // 引数:なし // 戻値:成功/失敗 //—————————————————————— HRESULT Player::Render() { //プレイヤー画像のサイズ調整 SpriteData playerData; playerData.pos = position + g_stageScrollPos; //表示位置はスクロールした分ずらす playerData.size = D3DXVECTOR2(32,32); //サイズ playerData.cut.y = dir * 32; //切抜き位置 playerData.cut.x = ((anim / 9) % 4) * 32; switch (status) { //通常状態のとき case STATUS_NORMAL: //プレイヤーの描画 player->Draw(&playerData); break; //死んだとき case STATUS_DEAD: Dead(); break; } return S_OK; }
void CUser::SetDamage(int damage, int tid) { if (damage <= 0 || m_bLive == USER_DEAD) return; m_sHP -= (short)damage; if (m_sHP <= 0) { m_sHP = 0; Dead(tid, damage); } }
//Update life bool PhysicsActor::Update() { //Regenerate life and energy while alive if (!Dead()) { life += SIMULATION_DELTA*lifeRegenRate; if (life > maxLife) life = maxLife; energyPool += SIMULATION_DELTA*energyRegenRate; if (energyPool > energyPoolMax) energyPool = energyPoolMax; } if ((life <= 0) && vulnerable) { //This unit died vulnerable = false; //call on death onDeath(); } return Actor::Update(); }
// Damage 계산, 만약 m_sHP 가 0 이하이면 사망처리 void CUser::SetDamage(int damage, int tid) { if(damage <= 0) return; if(m_bLive == USER_DEAD) return; short sHP = m_sHP; m_sHP -= (short)damage; //TRACE("User - SetDamage() : old=%d, damage=%d, curHP = %d, id=%s, uid=%d\n", sHP, damage, m_sHP, m_strUserID, m_iUserId); if( m_sHP <= 0 ) { m_sHP = 0; Dead(tid, damage); } //SendHP(); // 버디중이면 다른 버디원에게 날린다. }
void TeamMember::AdjustMental(int i) { mental += i; if (i>0) { std::cout << name << " get " << i << " mental\n"; if (mental > maxMental) mental = maxMental; } else if (i<0) { std::cout << name << " lose " << i << " mental\n"; if (mental <= 0) { mental = 0; std::cout << name << " killed himself.\n"; Dead(); } } }
void TeamMember::AdjustStamina(int i) { stamina += i; if (i>0) { std::cout << name << " heal " << i << " stamina\n"; if (stamina > maxStamina) stamina = maxStamina; } else if (i<0) { std::cout << name << " lose " << i << " stamina\n"; if (stamina <= 0) { stamina = 0; std::cout << name << " starved to death.\n"; Dead(); } } }
//—————————————————————— // 機能:更新処理 // 引数:なし // 戻値:成功/失敗 //—————————————————————— HRESULT Player::Update() { //状態ごとに処理を分ける switch (status) { //通常状態 case STATUS_NORMAL: Move(); //プレイヤーの移動 //Attack(); //攻撃 break; //下へスクロール中 case DOWN_SCROLL: g_stageScrollPos.y -= 20; //画面をスクロール position.y += 3; //プレイヤーも移動 //キリの良いところまでいったら通常状態に戻す if ((int)g_stageScrollPos.y % WINDOW_HEIGHT == 0) { status = STATUS_NORMAL; } break; //上へスクロール中 case UP_SCROLL: g_stageScrollPos.y += 20; position.y -= 3; if ((int)g_stageScrollPos.y % WINDOW_HEIGHT == 0) { status = STATUS_NORMAL; } break; //死んだ状態 case STATUS_DEAD: Dead(); //一定時間経ったら通常状態に戻す break; } return S_OK; }
static void removeParent( a_state *child, a_state *parent ) { a_parent **prev; a_parent *curr; if( child->parents == NULL ) { return; } prev = &(child->parents); for( curr = *prev; curr != NULL; curr = curr->next ) { if( curr->state == parent ) { *prev = curr->next; FREE( curr ); break; } prev = &(curr->next); } if( child->parents == NULL ) { ++deadStates; Dead( child ); } }
void GreenKoopa::MoveGreenKoopas(const char* id) { CommitDestructions(id); // to destroy the lost koopas for (std::list<MovingAnimator*>::iterator it=running[id].begin(); it != running[id].end(); ++it) { MovingAnimator* g = *it; Dim currPosX = g->GetSprite()->GetX(); Dim currPosY = g->GetSprite()->GetY(); Dim TileX = g->GetSprite()->GetTileX(); Dim TileY = g->GetSprite()->GetTileY(); if(Enemies::IsMarioAbove(TileX, TileY + 1)){ char toCreate[20]; const std::string id = g->GetSprite()->GetCurrFilm()->GetID(); if(!strcmp(id.c_str(), "greenkoopaleft")) strcpy(toCreate, "greenkoopahit"); else strcpy(toCreate, "redkoopahit"); MovingAnimator* d; Dim x, y; if(suspendingdead[toCreate].size() == 0) Dead(toCreate); d = suspendingdead[toCreate].back(); d->GetMovingAnimation()->SetDx(0); d->GetMovingAnimation()->SetDelay(10000); d->GetMovingAnimation()->SetContinuous(false); d->SetLastTime(currTime); suspendingdead[toCreate].pop_back(); assert(d); d->GetSprite()->SetX(x = g->GetSprite()->GetX()); d->GetSprite()->SetY(y = g->GetSprite()->GetY() + 16); d->SetLastTime(CurrTime()); AnimatorHolder::MarkAsRunning(d); walkingdead[toCreate].push_back(d); suspending[id].push_back(*it); AnimatorHolder::MarkAsSuspended(*it); running[id].erase(it); Sounds::Play("stomp"); //jump mario: Dim mx = Mario::GetMarioCurrentSprite()->GetX(); Dim my = Mario::GetMarioCurrentSprite()->GetY(); Mario::SetDimensions(mx, my); AnimatorHolder::MarkAsSuspended( Mario::GetAnimator()); Mario::SetDimensions(mx, my); Mario::ChangeState(Jumping); MovingPathAnimator* g = Mario::GetStandJump(); g->SetCurrIndex(0); g->SetLastTime(currTime); AnimatorHolder::MarkAsRunning(g); return ; } if(Enemies::CanGoLeft(TileX, TileY) && g->GetMovingAnimation()->GetDx() < 0) g->GetMovingAnimation()->SetDx(-2); else if(!Enemies::CanGoLeft(TileX, TileY) && g->GetMovingAnimation()->GetDx() < 0) g->GetMovingAnimation()->SetDx(2); else if( Enemies::CanGoRight(TileX, TileY) && g->GetMovingAnimation()->GetDx() > 0) g->GetMovingAnimation()->SetDx(2); else if( !Enemies::CanGoRight(TileX, TileY) && g->GetMovingAnimation()->GetDx() > 0) g->GetMovingAnimation()->SetDx(-2); else g->GetMovingAnimation()->SetDx(0); Rect r = g->GetSprite()->GetCurrFilm()->GetFrameBox(g->GetSprite()->GetFrame()); Dim f = r.GetHeight(); if( Enemies::IsOnAir(TileX, TileY, f-1) && !Enemies::IsOnBrick(currPosX, currPosY)) g->GetMovingAnimation()->SetDy(3); else g->GetMovingAnimation()->SetDy(0); } }
bool hnStatus::Alive() { return !Dead(); }