#include <GL/glut.h>
#include <stdlib.h>
#pragma warning(disable: 4786)
#include <algorithm>
#include "Bullet.h"
#include "Ship.h"
#include "Ast.h"
#include "Exp.h"
#include "Powerup.h"
#include "GameSession.h"
#include "utility.h"
#include "HumanControl.h"
#include "FSMAIControl.h"
#define INITIAL_WORLD_SIZE 512
//---------------------------------------------------------
GameSession::GameSession()
{
m_AIOn = false;
m_timeScale = 1;
m_humanControl = new HumanControl();
m_AIControl = new FSMAIControl();
}
//---------------------------------------------------------
void GameSession::Draw()
{
GameObjectList::iterator li;
switch(m_state)
{
case STATE_STEPWAIT:
case STATE_STEP:
case STATE_PLAY:
for(li=m_activeObj.begin();li!=m_activeObj.end();++li)
{
GameObj* temp = *li;
GameObj* temp2;
li++;
if(li != m_activeObj.end())
{
temp2 = *li;
}
li--;
if((*li)->m_active)
(*li)->Draw();
}
glPrintf(COLOR_GREEN,5,Game.m_screenH-20,20,"Score: %d\n",m_score);
DrawLives();
if(m_AIOn)//debug text drawing
{
glPrintf(COLOR_GREEN,5,20,20,"AI ON\n");
glPrintf(COLOR_GREEN,80,20,20,"%s\n",m_AIControl->m_debugTxt);
m_AIControl->m_debugTxt = "";
}
break;
case STATE_PAUSE:
glPrintf(COLOR_BLUE,30,Game.m_screenH-100,75,"Game Paused\n");
glPrintf(COLOR_BLUE,30,Game.m_screenH-200,75," Press p\n");
break;
case STATE_GAMEOVER:
glPrintf(COLOR_RED,30,Game.m_screenH-100,75,"Game Over\n");
glPrintf(COLOR_WHITE,30,Game.m_screenH-200,60,"Start Again(y/n)\n");
glPrintf(COLOR_GREEN,30,Game.m_screenH-300,40,"Final Score: %d\n",m_score);
break;
case STATE_NEXTWAVE:
glPrintf(COLOR_RED,30,Game.m_screenH-100,70,"Wave Completed\n");
glPrintf(COLOR_WHITE,30,Game.m_screenH-200,60,"Press Space Bar\n");
if(m_AIOn)
Game.StartNextWave();
break;
default:
break;
}
glFinish();
}
//---------------------------------------------------------
void GameSession::DrawLives()
{
glPushMatrix();
glDisable(GL_LIGHTING);
glRotatef(90.0f,0,0,1);
if(m_numLives <= 10)
{ //life triangles
Point3f location(m_screenW-15,-m_screenH + 10,0);
glTranslate(location);
glScalef(3,3,1);
for(int i = 1;i< m_numLives;i++)
{
glBegin(GL_LINE_LOOP);
glColor3f(.5,.5,.5);
glVertex3f(-3,-2+(10*i),0);
glVertex3f( 4, 0+(10*i),0);
glVertex3f(-3, 2+(10*i),0);
glEnd();
}
}
else//just put up a number for more then 10 extra lives
{
glPrintf(COLOR_GREEN,Game.m_screenW-30,Game.m_screenH-20,20,"%d\n",m_numLives-1);
Point3f location(m_screenW-15,-m_screenH +40,0);
glTranslate(location);
glScalef(3,3,1);
glBegin(GL_LINE_LOOP);
glColor3f(.5,.5,.5);
glVertex3f(-3,-2,0);
glVertex3f( 4, 0,0);
glVertex3f(-3, 2,0);
glEnd();
}
glEnable(GL_LIGHTING);
glPopMatrix();
}
//---------------------------------------------------------
void GameSession::Clip(Point3f &p)
{
if(p.x() > m_screenW) p.x() -=m_screenW;
if(p.y() > m_screenH) p.y() -=m_screenH;
if(p.x() < 0) p.x() +=m_screenW;
if(p.y() < 0) p.y() +=m_screenH;
}
//---------------------------------------------------------
void GameSession::PostGameObj(GameObj *obj)
{
m_activeObj.push_back(obj);
}
//---------------------------------------------------------
bool RemoveNotActive(GameObj* obj)
{
if(!obj->m_active)
{
delete obj;
return true;
}
return false;
}
//---------------------------------------------------------
void GameSession::Update(float dt)
{
GameObjectList::iterator list1;
for(list1=m_activeObj.begin();list1!=m_activeObj.end();++list1)
{
GameObj* temp = *list1;
//update logic and positions
if((*list1)->m_active)
{
(*list1)->Update(dt);
Clip((*list1)->m_position);
}
else continue;
//check for collisions
if((*list1)->m_collisionFlags != GameObj::OBJ_NONE)
{
GameObjectList::iterator list2;
for(list2=m_activeObj.begin();list2!=m_activeObj.end();++list2)
{
//the first obj may have already collided with something, making it inactive
if(!(*list1)->m_active)
continue;
//don't collide with yourself
if(list1 == list2)
continue;
if((*list2)->m_active &&
((*list1)->m_collisionFlags & (*list2)->m_type) &&
(*list1)->IsColliding(*list2))
{
(*list1)->Explode();
(*list1)->DoCollision((*list2));
}
}
}
if(list1==m_activeObj.end()) break;
}
//get rid of inactive objects
GameObjectList::iterator end = m_activeObj.end();
GameObjectList::iterator newEnd = remove_if(m_activeObj.begin(),m_activeObj.end(),RemoveNotActive);
if(newEnd != end)
m_activeObj.erase(newEnd,end);
//check for no main ship, respawn
if(m_mainShip == NULL || m_respawnTimer>=0.0f)
{
m_respawnTimer-=dt;
if(m_respawnTimer<0.0f)
{
m_mainShip = new Ship;
if(m_mainShip)
{
PostGameObj(m_mainShip);
m_humanControl->SetShip(m_mainShip);
m_AIControl->SetShip(m_mainShip);
}
}
}
//occasionally spawn a powerup
m_powerupTimer-=dt;
if(m_powerupTimer <0.0f)
{
m_powerupTimer = randflt()*6.0f + 4.0f;
Powerup* pow = new Powerup;
if(pow)
{
pow->m_position.x()= randflt()*m_screenW;
pow->m_position.y()= randflt()*m_screenH;
pow->m_position.z()= 0;
pow->m_velocity.x()= randflt()*40 - 20;
pow->m_velocity.y()= randflt()*40 - 20;
pow->m_velocity.z()= 0;
PostGameObj(pow);
}
}
//check for additional life bonus each 10K points
if(m_score >= m_bonusScore)
{
m_numLives++;
m_bonusScore += BONUS_LIFE_SCORE;
}
//check for finished wave
if(!m_numAsteroids)
{
m_waveNumber++;
WaveOver();
}
//check for finished game, and reset
if(!m_numLives)
GameOver();
m_humanControl->Update(dt);
//update AI control, if turned on
if(m_AIOn)
m_AIControl->Update(dt);
}
//---------------------------------------------------------
void GameSession::UseControl(int control)
{
if(!m_mainShip)// && !Game.m_AIOn)
return;
switch(control)
{
case CONTROL_THRUST_ON:
m_mainShip->ThrustOn();
break;
case CONTROL_THRUST_REVERSE:
m_mainShip->ThrustReverse();
break;
case CONTROL_THRUST_OFF:
m_mainShip->ThrustOff();
break;
case CONTROL_RIGHT_ON:
m_mainShip->TurnRight();
break;
case CONTROL_LEFT_ON:
m_mainShip->TurnLeft();
break;
case CONTROL_STOP_TURN:
m_mainShip->StopTurn();
break;
case CONTROL_STOP:
m_mainShip->Stop();
break;
case CONTROL_SHOOT:
m_mainShip->Shoot();
break;
case CONTROL_HYPERSPACE:
m_mainShip->Hyperspace();
break;
case CONTROL_PAUSE:
if(m_state == STATE_PLAY)
m_state = STATE_PAUSE;
else
m_state = STATE_PLAY;
break;
case CONTROL_STEP:
if(m_state == STATE_STEPWAIT || m_state == STATE_STEP)
m_state = STATE_PLAY;
else
m_state = STATE_STEP;
break;
case CONTROL_AI_ON:
m_AIOn = true;
break;
case CONTROL_AI_OFF:
m_AIOn = false;
break;
default:
break;
}
}
//---------------------------------------------------------
void GameSession::StartGame()
{
m_mainShip = NULL;
m_powerupTimer = 0.2f;
m_waveNumber = 1;
m_numLives = 3;
m_numAsteroids = 0;
m_respawnTimer = -1;
m_AIControl->Init();
ResetScore();
StartNextWave();
}
//---------------------------------------------------------
void GameSession::StartNextWave()
{
m_state = STATE_PLAY;
LaunchA
没有合适的资源?快使用搜索试试~ 我知道了~
一个有限状态机的例子
共60个文件
h:23个
cpp:19个
idb:2个
5星 · 超过95%的资源 需积分: 49 86 下载量 40 浏览量
2008-12-27
01:46:51
上传
评论 4
收藏 587KB RAR 举报
温馨提示
一个有限状态机的例子,代码不多,但挺有用的,各位有需要的可以看看
资源推荐
资源详情
资源评论
收起资源包目录
Chapter 15--FSM.rar (60个子文件)
Chapter 15--FSM
AISteroids.ncb 1.58MB
StateApproach.cpp 3KB
Powerup.h 542B
StateIdle.cpp 886B
AIControl.cpp 349B
Target.cpp 776B
GameSession.h 2KB
Point3.h 7KB
FSMAIControl.cpp 4KB
AISteroids.opt 58KB
GameObj.cpp 3KB
StateEvade.h 267B
HumanControl.cpp 3KB
asteroids.cpp 2KB
HumanControl.h 445B
StateGetPowerup.h 326B
GameSession.cpp 13KB
StateEvade.cpp 2KB
utility.cpp 2KB
Ast.cpp 2KB
utility.h 7KB
Ast.h 261B
Bullet.h 496B
Sphere3.h 3KB
AISteroids.suo 25KB
Ship.h 2KB
FSMMachine.cpp 2KB
StateAttack.h 312B
StateGetPowerup.cpp 3KB
Exp.cpp 2KB
Control.h 526B
Bullet.cpp 2KB
Target.h 185B
StateAttack.cpp 2KB
Ship.cpp 8KB
FSM.h 310B
StateApproach.h 316B
FSMState.h 525B
AIControl.h 381B
Powerup.cpp 1KB
FSMAIControl.h 750B
Exp.h 285B
AISteroids.dsw 556B
AISteroids
AISteroids.dsp 6KB
AISteroids.vcproj.xtsokpc.xtsok.user 1KB
Debug
AISteroids.exe.embed.manifest 2KB
vc60.pdb 108KB
vc80.pdb 92KB
AISteroids.exe 280KB
vc60.idb 153KB
BuildLog.htm 20KB
FSMMachine.obj 160KB
AISteroids.ilk 372KB
vc80.idb 131KB
AISteroids.vcproj 13KB
AISteroids.plg 1KB
FSMMachine.h 767B
GameObj.h 1KB
StateIdle.h 280B
AISteroids.sln 895B
共 60 条
- 1
xtsokxtsok
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页