void CAIVehicle::Think( void ) {
	if( !( thinkFlags & TH_THINK ) ) {
		goto Quit;
	}
	if( m_Controller.GetEntity() ) {
		// Exit the combat state if we somehow got in it.
		// Later we can fight as directed by player, but right now it's too independent
		ClearEnemy();
		// Update controls and movement dir
		UpdateSteering();
		// Speed controls, for now just AI_MOVE
		bool bMovementReq = UpdateSpeed();
		// Request move at direction
		if( bMovementReq ) {
			MoveAlongVector( m_CurAngle );
		} else {
			StopMove( MOVE_STATUS_DONE );
			// just turn if no forward/back movement is requested
			TurnToward( m_CurAngle );
		}
	}
	idAI::Think();
Quit:
	return;
}
void CAIVehicle::SetController( idPlayer *player ) {
	// no change
	if( player == m_Controller.GetEntity() ) {
		return;
	}
	if( player != NULL ) {
		// new controller added
		m_Controller = player;
		// Initialize angle to current yaw angle
		idAngles FaceAngles = viewAxis.ToAngles();
		m_CurAngle = FaceAngles.yaw;
		ClearEnemy();
		m_bIgnoreAlerts = true;
		AI_CONTROLLED = true;
		AI_RUN = false; // want to let custom vehicle "walk" script pick the legs animation
	} else {
		// controller removed, stop and return control to AI mind
		m_Controller = NULL;
		m_SpeedFrac = 0.0f;
		m_bIgnoreAlerts = false;
		AI_CONTROLLED = false;
		StopMove( MOVE_STATUS_DONE );
	}
}
Ejemplo n.º 3
0
int GAMEMAP::IsWin()
{
    int i;

    //检测角色和敌人的碰撞
    for(i=0; i<iMapEnemyNum; i++)
    {
        if(MapEnemyArray[i].show)
        {
            if(HLINE_ON_RECT(rmain.xpos, rmain.ypos+32,32,
                             MapEnemyArray[i].x,
                             MapEnemyArray[i].y,
                             MapEnemyArray[i].w*32,
                             MapEnemyArray[i].h*32))
            {
                if(0 == rmain.movey)
                {
                    Fail();
                }
                else
                {
                    //踩到敌人上
                    ClearEnemy(i);
                }
                return 0;
            }
        }
    }

    if(rmain.ypos > GAMEH*32)
    {

        Fail();
        return 0;
    }

    //到达目的地后,自动走到屏幕右侧
    if(rmain.xpos > X_WIN*32 )
    {
        iGameState=GAME_WIN;

        //到达目的地
        rmain.MoveStepTo(MAX_PAGE*GAMEW*32, Y_WIN*32);
    }

    if(rmain.xpos >= MAX_PAGE*GAMEW*32 )
    {
        iGameState=GAME_WIN_WAIT;
        c1.ReStart(TIME_GAME_WIN_WAIT);

        InitMatch();

        rmain.SetPos(BM_USER,3*32,8*32);
        rmain.InitRole(0,GAMEW*32*MAX_PAGE-32);

        iMatch++;
        if(iMatch>=MAX_MATCH)
        {
            //全部通过
            Init();
            iGameState=GAME_PASS;
        }
        LoadMap();

        return 1;
    }

    return 1;
}
Ejemplo n.º 4
0
int GAMEMAP::CheckAni(int itimeclip)
{
    int i,j;
    int tempx,tempy;

    //发子弹
    if(iBeginFire)
    {
        if(0 == iTimeFire )
        {
            FireArray[iFireNum].show=1;
            FireArray[iFireNum].x=rmain.xpos;
            FireArray[iFireNum].y=rmain.ypos;
            FireArray[iFireNum].id=ID_ANI_FIRE;
            if(0==rmain.idirec)
            {
                FireArray[iFireNum].movex=FIRE_SPEED;
            }
            else
            {
                FireArray[iFireNum].movex=-FIRE_SPEED;
            }
            iFireNum=(iFireNum+1)%MAX_MAP_OBJECT;
            iTimeFire=1;
        }
        iTimeFire=(iTimeFire+1)%TIME_FIRE_BETWEEN;
    }


    //检查敌人,动画元件
    for(i=0; i<iMapEnemyNum; i++)
    {
        if ( IN_AREA(MapEnemyArray[i].x, viewx, VIEWW) )
        {
            MapEnemyArray[i].show=1;
        }
        else
        {
            MapEnemyArray[i].show=0;
        }
    }

    //子弹移动
    for(i=0; i<MAX_MAP_OBJECT; i++)
    {
        if (FireArray[i].show)
        {
            FireArray[i].x+=FireArray[i].movex;
            if( FireArray[i].x > viewx+VIEWW || FireArray[i].x<viewx)
            {
                FireArray[i].show = 0;
            }
        }
    }

    //检测子弹和敌人的碰撞
    for(i=0; i<iMapEnemyNum; i++)
    {
        if(MapEnemyArray[i].show)
        {
            for(j=0; j<MAX_MAP_OBJECT; j++)
            {
                if (FireArray[j].show)
                {
                    if(RECT_HIT_RECT(FireArray[j].x,
                                     FireArray[j].y+FIRE_XOFF,
                                     FIREW,
                                     FIREH,
                                     MapEnemyArray[i].x,
                                     MapEnemyArray[i].y,
                                     MapEnemyArray[i].w*32,
                                     MapEnemyArray[i].h*32)
                      )
                    {
                        ClearEnemy(i);
                        FireArray[j].show=0;
                        return 0;
                    }
                }
            }
        }
    }

    //检测角色和金币的碰撞
    for(i=0; i<iCoinNum; i++)
    {
        tempx=MapCoinArray[i].x*32;
        tempy=MapCoinArray[i].y*32;

        if ( IN_AREA(tempx, viewx, VIEWW) )
        {
            if(	RECT_HIT_RECT(rmain.xpos,
                              rmain.ypos,
                              32,32,
                              tempx,
                              tempy,
                              32,32)
              )
            {
                iMoney+=10;
                ClearCoin(i);
                return 0;
            }
        }
    }


    ///////////// 帧控制 ////////////////
    if(0 == itimeclip% ENEMY_SPEED)
    {
        //帧控制
        ienemyframe=1-ienemyframe;
        //敌人移动
        for(i=0; i<iMapEnemyNum; i++)
        {
            if(MapEnemyArray[i].show)
            {
                MapEnemyArray[i].x+=MapEnemyArray[i].movex;

                //控制敌人移动
                if(MapEnemyArray[i].movex<0)
                {
                    if(MapEnemyArray[i].x<=MapEnemyArray[i].xleft)
                    {
                        MapEnemyArray[i].movex=ENEMY_STEP_X;
                    }
                }
                else
                {
                    if(MapEnemyArray[i].x>=MapEnemyArray[i].xright)
                    {
                        MapEnemyArray[i].movex=-ENEMY_STEP_X;
                    }
                }
            }
        }

    }

    if(0 == itimeclip% WATER_SPEED)
    {
        ibkobjframe=1-ibkobjframe;
        iCoinFrame=(iCoinFrame+1)%4;
    }

    //子弹
    ifireframe=1-ifireframe;

    //bomb frame control
    for(i=0; i<MAX_MAP_OBJECT; i++)
    {
        if(BombArray[i].show)
        {
            BombArray[i].iframe++;
            if(BombArray[i].iframe>3)
            {
                BombArray[i].show=0;
            }
        }
    }
    return 0;
}