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 ); } }
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; }
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; }