void Enemy::Movement() { b2Vec2 position = body->GetPosition(); orientation = GetRotationAngle(); m_pos = Vector2f(position.x * SCALE, position.y * SCALE); body->SetTransform(position, orientation + DEGTORAD); }
void ArcSegment::Append (moon_path *path) { Size *size = GetSize (); double width = size ? size->width : 0.0; double height = size ? size->height : 0.0; Point *end_point = GetPoint (); double ex = end_point ? end_point->x : 0.0; double ey = end_point ? end_point->y : 0.0; moon_arc_to (path, width, height, GetRotationAngle (), GetIsLargeArc (), GetSweepDirection (), ex, ey); }
//============================================================================= // 更新処理 //============================================================================= void UpdateEnemy(float fTimeSpeed) { CAMERA *pCamera = GetCamera(); PLAYER *pPlayer = GetPlayer(); int nCountAlive = 0; //PrintDebugProc("enemy mark %d\n", g_enemy[0].nSeePFrame); for(int nCntEnemy = 0; nCntEnemy < MAX_ENEMY; nCntEnemy++) { if(g_enemy[nCntEnemy].bUse) { nCountAlive++; {//プレイヤーに気づく判断処理 if( !HitCheckMeshWall( g_enemy[nCntEnemy].pos, pCamera->posV, NULL, NULL) && pPlayer->bAlive && //壁に遮られたか //HitCheckBall( g_enemy[nCntEnemy].pos, 1000.0f, pCamera->posV, 20.0f) && //一定の距離以内 HitCheckViewArea( g_enemy[nCntEnemy].pos, pCamera->posV, g_enemy[nCntEnemy].rot, D3DXToRadian( 90.0f) ) && //後ろには見えない !IsDebugMode()) //デバッグモードのときに、当たり判定はなし { if( g_enemy[nCntEnemy].nSeePFrame <= 1000) g_enemy[nCntEnemy].nSeePFrame++; if( g_enemy[nCntEnemy].nSeePFrame >= 50) { g_enemy[nCntEnemy].bSeePlayer = true; //プレイヤーを見た時の情報を保存 if( g_enemy[nCntEnemy].bPatrol) { //びっくりマークを設定 SetFlashMessage(MSG_EXCLAMATION); g_enemy[nCntEnemy].bPatrol = false; g_enemy[nCntEnemy].posPatrol = g_enemy[nCntEnemy].pos; g_enemy[nCntEnemy].rotPatrol = g_enemy[nCntEnemy].rotTarget; } } } else if( HitCheckBall( g_enemy[nCntEnemy].pos, 120.0f, pCamera->posV, 20.0f) ) //一定の距離以内 { if( g_enemy[nCntEnemy].nSeePFrame <= 65535) g_enemy[nCntEnemy].nSeePFrame++; if( g_enemy[nCntEnemy].nSeePFrame >= 50) { g_enemy[nCntEnemy].bSeePlayer = true; //プレイヤーを見た時の情報を保存 if( g_enemy[nCntEnemy].bPatrol) { g_enemy[nCntEnemy].bPatrol = false; g_enemy[nCntEnemy].posPatrol = g_enemy[nCntEnemy].pos; g_enemy[nCntEnemy].rotPatrol = g_enemy[nCntEnemy].rotTarget; } } } else { if( g_enemy[nCntEnemy].nSeePFrame > 0) { g_enemy[nCntEnemy].nSeePFrame--; } g_enemy[nCntEnemy].bSeePlayer = false; } } //CoolDown if( g_enemy[nCntEnemy].nCoolDown > 0) { g_enemy[nCntEnemy].nCoolDown -= 1 * fTimeSpeed; if(g_enemy[nCntEnemy].nCoolDown <= 0) { g_enemy[nCntEnemy].nCoolDown = -1; g_enemy[nCntEnemy].bShot = false; } } //プレイヤーに気づいたら、行動処理 if( g_enemy[nCntEnemy].bSeePlayer || g_enemy[nCntEnemy].nSeePFrame >= 50) { if( !g_enemy[nCntEnemy].bEscaping) { //向き g_enemy[nCntEnemy].rotTarget = GetRotationAngle( g_enemy[nCntEnemy].pos, pCamera->posV, g_enemy[nCntEnemy].rot); } //弾を発射 if(!g_enemy[nCntEnemy].bShot) { //向き g_enemy[nCntEnemy].rot = GetRotationAngle( g_enemy[nCntEnemy].pos, pCamera->posV, g_enemy[nCntEnemy].rot); if(g_enemy[nCntEnemy].type == ENEMY_RED) { for(int cnt = 0; cnt < 3; cnt++) { SetEnemyBullet( g_enemy[nCntEnemy].pos, pCamera->posV + D3DXVECTOR3( rand() % 60 - 30, rand() % 40 - 20, rand() % 60 - 30)); } g_enemy[nCntEnemy].bShot = true; g_enemy[nCntEnemy].nCoolDown = COOLDOWN + rand() % 60; PlaySound(SOUND_LABEL_SE_ESHOT); } else if(g_enemy[nCntEnemy].type == ENEMY_BLUE) { SetEnemyBullet( g_enemy[nCntEnemy].pos, pCamera->posV); g_enemy[nCntEnemy].bShot = true; g_enemy[nCntEnemy].nCoolDown = COOLDOWN/2 + rand() % 60; PlaySound(SOUND_LABEL_SE_ESHOT); } else { SetEnemyBullet( g_enemy[nCntEnemy].pos, pCamera->posV); g_enemy[nCntEnemy].bShot = true; g_enemy[nCntEnemy].nCoolDown = COOLDOWN + rand() % 60; PlaySound(SOUND_LABEL_SE_ESHOT); } } } else { if( g_enemy[nCntEnemy].bPatrol) { //nothing } else { //パトロールに戻る g_enemy[nCntEnemy].rotTarget = GetRotationAngle( g_enemy[nCntEnemy].pos, g_enemy[nCntEnemy].posPatrol, g_enemy[nCntEnemy].rot); D3DXVECTOR3 vec = g_enemy[nCntEnemy].pos - g_enemy[nCntEnemy].posPatrol; if( D3DXVec3Length( &vec) < VALUE_MOVE) { g_enemy[nCntEnemy].bPatrol = true; g_enemy[nCntEnemy].pos = g_enemy[nCntEnemy].posPatrol; g_enemy[nCntEnemy].rotTarget = g_enemy[nCntEnemy].rotPatrol; } } } //弾キレ、逃げる処理 //if( g_enemy[nCntEnemy].bShot && !g_enemy[nCntEnemy].bEscaping) //{ // float movRot = rand() % 180 - 90; // g_enemy[nCntEnemy].rotTarget.y = g_enemy[nCntEnemy].rot.y + D3DXToRadian(movRot); // if( g_enemy[nCntEnemy].rotTarget.y > D3DX_PI) // { // g_enemy[nCntEnemy].rotTarget.y -= D3DX_PI * 2.0f; // } // g_enemy[nCntEnemy].bEscaping = true; //} bool bMove = true; //プレイヤーに近づき過ぎないように D3DXVECTOR3 vec = g_enemy[nCntEnemy].pos - pPlayer->pos; if( (D3DXVec3Length(&vec) < 200.0f) && g_enemy[nCntEnemy].bSeePlayer) { bMove = false; } {//移動処理 if( bMove) { //移動慣性の初期化 g_enemy[nCntEnemy].move.x = VALUE_MOVE; g_enemy[nCntEnemy].move.z = VALUE_MOVE; if(g_enemy[nCntEnemy].type == ENEMY_BLUE) { g_enemy[nCntEnemy].move.x = 0; g_enemy[nCntEnemy].move.z = 0; } } //時計回り、または逆時計回りを決める g_enemy[nCntEnemy].rotAngle = Get2VecRotAngle( g_enemy[nCntEnemy].rot, g_enemy[nCntEnemy].rotTarget, DIVIDE_ROTATE, -1); //回転慣性 g_enemy[nCntEnemy].rotAngle += (-g_enemy[nCntEnemy].rotAngle) * 0.001f; //モデルY軸角度修正 if(g_enemy[nCntEnemy].rot.y > D3DX_PI) { g_enemy[nCntEnemy].rot.y = g_enemy[nCntEnemy].rot.y - D3DX_PI*2; } else if(g_enemy[nCntEnemy].rot.y < 0.0f - D3DX_PI) { g_enemy[nCntEnemy].rot.y = g_enemy[nCntEnemy].rot.y + D3DX_PI*2; } //次の回転位置に到着したら if( fabs(g_enemy[nCntEnemy].rot.y - g_enemy[nCntEnemy].rotTarget.y) < VALUE_ROTATE && fabs(g_enemy[nCntEnemy].rot.x - g_enemy[nCntEnemy].rotTarget.x) < VALUE_ROTATE && fabs(g_enemy[nCntEnemy].rot.z - g_enemy[nCntEnemy].rotTarget.z) < VALUE_ROTATE ) { g_enemy[nCntEnemy].rot = g_enemy[nCntEnemy].rotTarget; g_enemy[nCntEnemy].rotAngle = D3DXVECTOR3( 0, 0, 0); } else //次の回転位置にまだ到着してない { g_enemy[nCntEnemy].rot += g_enemy[nCntEnemy].rotAngle * fTimeSpeed; } //回転していない時 if(g_enemy[nCntEnemy].rotAngle == D3DXVECTOR3( 0, 0, 0)) { //慣性処理 g_enemy[nCntEnemy].move.x -= g_enemy[nCntEnemy].move.x * 0.05f; g_enemy[nCntEnemy].move.z -= g_enemy[nCntEnemy].move.z * 0.05f; D3DXVECTOR3 tNextPos = g_enemy[nCntEnemy].pos; tNextPos.x += g_enemy[nCntEnemy].move.x * sinf(g_enemy[nCntEnemy].rot.y); tNextPos.z += g_enemy[nCntEnemy].move.z * cosf(g_enemy[nCntEnemy].rot.y); D3DXVECTOR3 tSphere = D3DXVECTOR3( 0, 0, 0); D3DXVECTOR3 front = tNextPos - g_enemy[nCntEnemy].pos; D3DXVec3Normalize( &tSphere, &front); tSphere *= MODEL_SPHERE; //壁の法線ベクトルを取得変数の初期化 D3DXVECTOR3 wall_nor = D3DXVECTOR3(0,0,0); //Side g_enemy[nCntEnemy].posLSide.x = g_enemy[nCntEnemy].pos.x + 15.0f * sinf(g_enemy[nCntEnemy].rotTarget.y + D3DXToRadian(-90.0f)); g_enemy[nCntEnemy].posLSide.z = g_enemy[nCntEnemy].pos.z + 15.0f * cosf(g_enemy[nCntEnemy].rotTarget.y + D3DXToRadian(-90.0f)); g_enemy[nCntEnemy].posRSide.x = g_enemy[nCntEnemy].pos.x + 15.0f * sinf(g_enemy[nCntEnemy].rotTarget.y + D3DXToRadian(90.0f)); g_enemy[nCntEnemy].posRSide.z = g_enemy[nCntEnemy].pos.z + 15.0f * cosf(g_enemy[nCntEnemy].rotTarget.y + D3DXToRadian(90.0f)); //壁に当たったら if( HitCheckMeshWall( g_enemy[nCntEnemy].posLSide, g_enemy[nCntEnemy].posLSide + tSphere, &wall_nor, NULL) || HitCheckMeshWall( g_enemy[nCntEnemy].posRSide, g_enemy[nCntEnemy].posRSide + tSphere, &wall_nor, NULL) ) { if( g_enemy[nCntEnemy].bSeePlayer || !g_enemy[nCntEnemy].bPatrol) { //壁ずり処理:移動ベクトルを修正 GetWallScratchVector( &front, front, wall_nor); D3DXVec3Normalize( &tSphere, &front); tSphere *= MODEL_SPHERE; if( !HitCheckMeshWall( g_enemy[nCntEnemy].pos, g_enemy[nCntEnemy].pos + tSphere, &wall_nor, NULL) ) { //移動処理 g_enemy[nCntEnemy].pos += front; } } if( g_enemy[nCntEnemy].bPatrol) { //180反転 g_enemy[nCntEnemy].rotTarget.y = g_enemy[nCntEnemy].rot.y + D3DXToRadian(180.0f); if( g_enemy[nCntEnemy].rotTarget.y > D3DX_PI) { g_enemy[nCntEnemy].rotTarget.y -= D3DX_PI * 2.0f; } } } else { //移動処理 g_enemy[nCntEnemy].pos += front * fTimeSpeed; } } } //shadow SetPositionShadow( g_enemy[nCntEnemy].nIdxShadow, g_enemy[nCntEnemy].pos); } } if( nCountAlive == 0) { PlaySound( SOUND_LABEL_SE_CLEAR); SetGameStep(STEP_CLEAR); } //PrintDebugProc("\n敵の位置:(X:%f, Y:%f, Z:%f)\n", g_enemy[0].pos.x, g_enemy[0].pos.y, g_enemy[0].pos.z); //PrintDebugProc("敵の向き :(X:%f, Y:%f, Z:%f)\n", g_enemy[0].rot.x, D3DXToDegree(g_enemy[0].rot.y), g_enemy[0].rot.z); //if( g_enemy[0].bSeePlayer) PrintDebugProc("see Player\n"); //if( g_enemy[0].bPatrol)PrintDebugProc("patral\n"); }
void BombProjectile::Update(float delta) { float targetDelta = Timing::Instance()->GetTargetDelta(); float percentDelta = delta / targetDelta; // apply gravity to the if (!mIsOnSolidLine) { if (!mIsInWater) { m_velocity.Y -= 0.3f * percentDelta; } else { m_velocity.Y -= 0.06f * percentDelta; } } // nice simple update if (mIsInWater) { m_velocity.X *= 0.92f; // slow down significantly //m_velocity.Y *= 0.9f; // slow down significantly } m_direction = m_velocity; m_direction.Normalise(); m_position += m_velocity * percentDelta; // we dont need complicated movement so we'll ignore the MovingSprite class Sprite::Update(delta); if (IsOnSolidSurface()) { // StopYAccelerating(); if (!mIsInWater) { SetRotationAngle(GetRotationAngle() + ((m_velocity.X * -0.04) *percentDelta)); } else { SetRotationAngle(GetRotationAngle() + ((m_velocity.X * -0.009) *percentDelta)); } } else { if (!mIsInWater) { SetRotationAngle(GetRotationAngle() + ((m_velocity.X * -0.01) * percentDelta)); } else { SetRotationAngle(GetRotationAngle() + ((m_velocity.X * -0.005) * percentDelta)); } } if (!m_isActive) { float currentTime = Timing::Instance()->GetTotalTimeSeconds(); float timeToDie = m_timeBecameInactive + m_maxTimeInActive; if(currentTime > timeToDie) { // time to kill ourselves GameObjectManager::Instance()->RemoveGameObject(this); } } if (mTimeUntilNextParticleSpray > 0.0f) { mTimeUntilNextParticleSpray -= delta; if (mTimeUntilNextParticleSpray < 0.0f) { mTimeUntilNextParticleSpray = 0.0f; } } }