Пример #1
0
/* TODO:今西
*/
void fireball_move(Object *dp){
	int i;

	dp->translation.X += dp->direction.X*BULLET_VELOCITY;
	dp->translation.Y += dp->direction.Y*BULLET_VELOCITY;
	dp->translation.Z += dp->direction.Z*BULLET_VELOCITY;

	for (i = 0; i < playerNum; i++){
		if (collision(dp, &Objects[i])){
			if (Objects[i].stat != BLINK&&Objects[i].stat != DYING&& Objects[i].stat != DEAD){
				Objects[i].life--;
				Objects[i].stat = BLINK;
				Objects[i].moveCount = 0;
				ageSndMgrPlayOneshot(AS_SND_HIT, 0, SOUND_VOLUME, AGE_SNDMGR_PANMODE_LR12, 128, 0);
			}


			if (Objects[i].life <= 0){
				Objects[i].stat = DYING;
				Objects[i].deadFrame = frameCount;
				Objects[i].moveCount = 0;

				ageSndMgrPlayOneshot(AS_SND_DIE, 0, SOUND_VOLUME, AGE_SNDMGR_PANMODE_LR12, 128, 0);
			}

			dp->stat = INVISIBLE;
		}
	}
	dp->moveCount++;
	if (dp->moveCount > RANGE_COUNT)
		dp->stat = INVISIBLE;
}
Пример #2
0
static s32 CalcCannon( struct TaskData* pTask , u32 Flag ) {
  switch( pTask->Data.cannon.mode ) {
    default :
    case 0 :		// 通常待機状態
      pTask->Data.cannon.count++;

      if ( pTask->Data.cannon.count == 30  &&((g_PlayerX<pTask->x&&pTask->Data.cannon.direction==0)
              ||(g_PlayerX>pTask->x&&pTask->Data.cannon.direction!=0))) {
        // 弾発射
        int x , y, dx;
        x = pTask->x;
        y = pTask->y;

        if( pTask->Data.cannon.direction == 0 ) {
          x -= 120;
          dx = -10;
        }
        else {
          x += 120;
          dx = 10;
        };

        {
          struct TaskData* pBTask;
          pBTask = AllocTask();
          if (pBTask != NULL) {
            InitTaskEBullet( pBTask , x, y - 30, AG_RP_OBJ_EBULLET, dx,0, 0,0 );
            AddlLink( pBTask , DISP_LEVEL_EBULLET );
            if( (g_PlayerX-pTask->x)*(g_PlayerX-pTask->x)<1920*1920){
              ageSndMgrPlayOneshot( AS_SND_CANNON , 0 , 0xff , AGE_SNDMGR_PANMODE_LR12 , 0x80 , 0 );
            };
          };
        };
      };

      if( pTask->Data.cannon.count > 60 ) {
        pTask->Data.cannon.count = 0;
        pTask->Data.cannon.mode = 1;		// ジャンプ状態
      };
      break;

		case 1 :		// ジャンプ状態
			if( pTask->Data.cannon.direction == 0 ) {		// 左向き
				pTask->x -= 1;
			}
			else {
				pTask->x += 1;
			};

			pTask->Data.cannon.count++;
			if( pTask->Data.cannon.count >= 20 ) {
				pTask->Data.cannon.count = 0;
				pTask->Data.cannon.mode = 2;
			};
			break;

		case 2 :		// 潰れ状態
			pTask->Data.cannon.count++;
			if( pTask->Data.cannon.count > 30 ) {
				pTask->Data.cannon.count = 0;
				pTask->Data.cannon.mode = 0;		// 通常状態

					// 三回飛んだら反対向き
				pTask->Data.cannon.sub_count++;
				if( pTask->Data.cannon.sub_count > 3 ) {
					pTask->Data.cannon.sub_count = 0;

					if( pTask->Data.cannon.direction == 0 ) {
						pTask->Data.cannon.direction = 1;
					}
					else {
						pTask->Data.cannon.direction = 0;
					};
				};
			};
			break;
	};


  // 自機の弾の判定
  {
    struct TaskData* pBTask;
    pBTask = GetDispLink( DISP_LEVEL_PBULLET );
    while ( pBTask != NULL ) {
      if (pBTask->type == TASK_PBULLET) {
        if ( (pTask->x - pBTask->x) * (pTask->x - pBTask->x) + (pTask->y - pBTask->y) * (pTask->y - pBTask->y) < 50*50) {
          struct TaskData* pATask;

          pATask = AllocTask();
          InitTaskAttack( pATask , pTask->x , pTask->y );
          AddlLink( pATask , DISP_LEVEL_ATTACK );


          AddScore( pTask->Data.cannon.score );

          pBTask->visible = 0;
          pBTask->flag = TASK_FLAG_DESTROY;
          break;
        }
      }

      pBTask = pBTask->Next;
    }
  }

	return( 0 );
}
Пример #3
0
static s32 CalcCrow( struct TaskData* pTask , u32 Flag ) {
	int dx = pTask->x - g_PlayerX;
	int dy = pTask->y - g_PlayerY -g_OffsetY + 275;



	if(dx*dx>512*512) return 0;	//遠すぎる場合はすぐ終了

	pTask->Data.crow.count += 1;
	if(pTask->Data.crow.count>=60){
        // 弾発射
          struct TaskData* pBTask;
          pBTask = AllocTask();
          if (pBTask != NULL) {
			  InitTaskEBullet( pBTask , pTask->x, pTask->y, AG_RP_OBJ_EBULLET,0, 5, 0,0 );
            AddlLink( pBTask , DISP_LEVEL_EBULLET );
        };
		pTask->Data.crow.count = 0;
		ageSndMgrPlayOneshot( AS_SND_CROW , 0 , 0x80 , AGE_SNDMGR_PANMODE_LR12 , 0x80 , 0 );

	};
	if(pTask->Data.crow.count % 20 == 0){
		pTask->Data.crow.mode += 1;
		pTask->Data.crow.mode %= 3;
	};
	//移動
	{
		int ax = (int)(-dx*0.01 - pTask->Data.crow.vx*0.04);
		int ay = (int)(-dy*0.01 - pTask->Data.crow.vy*0.04);
		if(ax==0){
			if(dx>0)ax = -1;
			else if(dx<0)ax = 1;
		}
		pTask->Data.crow.vx += ax;
		pTask->Data.crow.vy += ay;
	
	if(pTask->Data.crow.vx==0){
		if(dx>0)pTask->Data.crow.vx = -1;
		else if(dx<0)pTask->Data.crow.vx = 1;
	}
	pTask->x += pTask->Data.crow.vx;
	pTask->y += pTask->Data.crow.vy;
	}

  // 自機の弾の判定
  {
    struct TaskData* pBTask;
    pBTask = GetDispLink( DISP_LEVEL_PBULLET );
    while ( pBTask != NULL ) {
      if (pBTask->type == TASK_PBULLET) {
        if ( (pTask->x - pBTask->x) * (pTask->x - pBTask->x) + (pTask->y - pBTask->y) * (pTask->y - pBTask->y) < 50*50) {
          struct TaskData* pATask;

          pATask = AllocTask();
          InitTaskAttack( pATask , pTask->x , pTask->y );
          AddlLink( pATask , DISP_LEVEL_ATTACK );

          pTask->visible = 0;
          pTask->flag = TASK_FLAG_DESTROY;

          AddScore( pTask->Data.crow.score );

          pBTask->visible = 0;
          pBTask->flag = TASK_FLAG_DESTROY;
          break;
        }
      }

      pBTask = pBTask->Next;
    }
  }

  // 自機との判定
  if ( (pTask->x - g_PlayerX) * (pTask->x - g_PlayerX) + (pTask->y - 28 - g_PlayerY ) * (pTask->y - 28 - g_PlayerY ) < 60*60) {
  //if ( g_pPlayerRect != NULL && HitCrow(pTask, g_pPlayerRect) ) {
    KillPlayer( g_pPlayerTask );
  }

	return( 0 );
}