📄 tanksprite.java
字号:
undo();
bCollided=true;
}
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return bCollided;
}
private void enemy_process() {
// 沿某个角度运行,碰撞后改变坦克运行方向
int iAngel = 0;
boolean bCollided = false;
switch (GameLogic.m_gameLevel) {
case GameLogic.GAME_LEVEL_EASY:
bCollided = enenmy_easy_process();
break;
case GameLogic.GAME_LEVEL_NORMAL:
bCollided = enemy_middle_process();
break;
case GameLogic.GAME_LEVEL_HARD:
break;
default:
break;
}
if (GameLogic.collidesWith(this, m_tankOwner) || true == bCollided) {
if (GameLogic.GAME_LEVEL_EASY == GameLogic.m_gameLevel) {
iAngel = getReverseAngel(m_currentAngel);
move(iAngel, 4);
}
if (GameLogic.GAME_LEVEL_NORMAL == GameLogic.m_gameLevel) {
/**
* if enemy tank collides with user tank,continue its original
* direction
*/
if (true == m_underAttack) {
m_underAttackFrame = 0;// adjust its tracking path the case
} else if (true == m_backToNormal) {
{
m_backFrame = 0;
}
}
else{
iAngel = getReverseAngel(m_currentAngel);
move(iAngel, 4);
}
}
} else {
if (GameLogic.GAME_LEVEL_EASY == GameLogic.m_gameLevel) {
move(m_currentAngel, 2);
}
if (GameLogic.GAME_LEVEL_NORMAL == GameLogic.m_gameLevel) {
if (true == m_underAttack || true == m_backToNormal) {
;
} else {
move(m_currentAngel, 2);
}
}
}
}
// FSM releated functions
/**
* (1)在主线程中循环调用。 (2)根据当前tank状态作处理. if(firing) 子弹继续运行。 else 不做处理。
*
* (3)处理子弹的返回状态。 if(bullet is not alive) 重新设置tank的状态。tank可以重新发射了。
*
*/
private void process() {
try {
if (false == isVisible()) {
setVisible(true);
}
//运行enemy tank的移动LOOP
if (m_tankOwner == GameLogic.ENEMY_TANK) {
enemy_process();
GameLogic.collidesWith(this, m_tankOwner);
}
int iBulletAvailable = m_bulletCount;
for (int i = 0; i < m_bulletCount; i++) {
//子弹已经停止运行
if (GameLogic.GAME_STATE_READY == m_bullet[i].getGameState() ||
m_bullet[i].getGameState() < 0) {
iBulletAvailable--;
}
m_bullet[i].run();
}
//该组子弹全部消失了
if (0 == iBulletAvailable) {
m_bulletLocked = false;
m_curretBullet = 0;
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
if (!m_threadAlive) {
return;
}
switch (m_currentState) {
case GameLogic.GAME_STATE_READY:
//准备下一组子弹;
m_curretBullet = 0;
m_bulletLocked = false; //允许发射子弹
m_timerTask = null;
setVisible(true);
break;
case GameLogic.GAME_STATE_LOOP:
process();
break;
case GameLogic.GAME_STATE_END:
stop();
break;
case GameLogic.GAME_STATE_PAUSE:
displayScene();
break;
default:
break;
}
}
private void releaseLighteningSprite() {
if (null != m_lighteningImageSprite) {
GameLogic.m_layerManager.remove(m_lighteningImageSprite);
}
m_lighteningImageSprite = null;
}
private void displayLighteningScene() {
int x = getRefPixelX();
int y = getRefPixelY();
try {
if (false == m_lighteningImageSprite.isVisible()) {
m_lighteningImageSprite.setVisible(true);
}
m_lighteningImageSprite.setRefPixelPosition(x, y);
m_tankLightFrame++;
if (NUM_OF_LIGHT_FRAMES >= m_tankLightFrame) {
m_lighteningImageSprite.nextFrame();
}
else {
m_tankLightFrame = 0;
m_lighteningImageSprite.setVisible(false);
m_bLighteningStarted=false;
if(0==m_tankBlood){
reset();//new life
}
else{
start();
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void createLighteningSprite() {
try {
final int LIGHTENING_IMAGE_WIDTH = 89;
final int LIGHTENING_IMAGE_HEIGHT = 278;
//lightening image
m_lighteningImageSprite = new Sprite(GameLogic.m_lighteningImage,
LIGHTENING_IMAGE_WIDTH,
LIGHTENING_IMAGE_HEIGHT);
m_lighteningImageSprite.defineReferencePixel(52, 278);
m_lighteningImageSprite.setVisible(false);
GameLogic.m_layerManager.insert(m_lighteningImageSprite, 0);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void startBombScene(){
if(true==m_bBombStarted){
return;
}
m_bBombStarted=true;
m_tankBombFrame=0;
/**
* bomb sound
*/
if(GameLogic.m_soundOn==true){
GameLogic.m_player.threadPlay();
}
pause();
}
public void startLighteningScene(){
//is lightening ,
if(true==m_bLighteningStarted){
return;
}
m_bLighteningStarted=true;
m_tankLightFrame=0;
pause();
}
private void displayBombScene(int x, int y) {
try {
if(null==m_bombSprite){
return ;
}
m_tankBombFrame++;
if (false == m_bombSprite.isVisible()) {
m_bombSprite.setVisible(true);
}
if(true==isVisible()){
setVisible(false);
}
m_bombSprite.setRefPixelPosition(x, y);
if (m_tankBombFrame <= NUM_OF_BOMB_FRAMES) {
m_bombSprite.nextFrame();
}
else {
reset();
m_bBombStarted=false;
m_tankBombFrame=0;
m_bombSprite.setVisible(false);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void displayScene(){
try {
if(true==m_bBombStarted){
displayBombScene(getRefPixelX(),getRefPixelY());
}
if(true==m_bLighteningStarted){
displayLighteningScene();
}
//when tanks are displaying scenes remains in the pause state
if(m_bBombStarted==true||true==m_bLighteningStarted){
pause();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
protected void reset() {
m_tankBombFrame = 0;
//reset user tank's status
m_tankBlood = GameLogic.tank_type[m_tankType][GameLogic.
TANK_PROPERTY_BASIC_BLOOD]; //current life's blood
m_bombCount = GameLogic.tank_type[m_tankType][GameLogic.
TANK_PROPERTY_BOMB_COUNT]; //the bomb count of current life
m_bulletCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_FREQUENCY];
m_bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_SPEED];
m_tankSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_MOVE_PIXEL];
m_currentState = GameLogic.GAME_STATE_READY;
if (m_tankOwner == GameLogic.ENEMY_TANK) {
m_currentDirection = GameLogic.TANK_DIRECTION_DOWN;
m_currentAngel = Sprite.TRANS_ROT180;
m_underAttack=false;
m_underAttackFrame=0;
m_destRow=0;
m_destCol=0;
m_bulletDelayFrame=0;
m_backToNormal=false;
m_backFrame=0;
int x_pos = 0, y_pos = 0;
x_pos = GameLogic.m_enemyStartPlace[m_tankIndex][GameLogic.
ENEMY_TANK_LOCATION_PROPERTY_COL] *
GameLogic.MAP_CELL_WIDTH
+ GameLogic.MAP_CELL_WIDTH / 2;
y_pos = GameLogic.m_enemyStartPlace[m_tankIndex][GameLogic.
ENEMY_TANK_LOCATION_PROPERTY_ROW] *
GameLogic.MAP_CELL_HEIGHT
+ GameLogic.MAP_CELL_HEIGHT / 2 + GameLogic.MAP_CELL_HEIGHT;
setRefPixelPosition(x_pos, y_pos);
}
else {
m_currentDirection = GameLogic.TANK_DIRECTION_UP;
m_currentAngel = Sprite.TRANS_NONE;
setRefPixelPosition(GameLogic.HEADQUARTERS_IMAGE_LOCATION_X -
GameLogic.TANK_WIDTH / 2,
(GameLogic.MAP_CELL_WIDTH + GameLogic.MAP_HEIGHT -
GameLogic.TANK_HEIGHT / 2)); //user tank start place
/**handle the enemy tanks that have been attacked;
* 1.if(the user tank is destroyed) all the attacked enemies stop tracking the user tank;
* 2.the enemy tank return to the restricted area;
*/
if(null!=m_enemiesAttacked){
for(int i=0;i<m_enemiesAttacked.size();i++){
int enemyIndex=((Integer)m_enemiesAttacked.elementAt(i)).intValue();
if(null!=GameLogic.m_enemySprite[enemyIndex]){
GameLogic.m_enemySprite[enemyIndex].setUnderAttackFlag(false);
//change the enemy tank state from under attack to normal
GameLogic.m_enemySprite[enemyIndex].setBackToNormalFlag(true);
}
}
}
}
/**
* make all the tank related property uneffective
* (1)missile
* (2)double points
* (3)strength bomb
*/
if(m_bulletType==GameLogic.BULLET_TYPE_MISSILE){
changeBullet(GameLogic.BULLET_TYPE_COMMON);
m_missileCount=0;
}
m_invicible = m_doublePoints = false;
m_init = false;
m_bulletDamage = GameLogic.tank_type[m_tankType][GameLogic.
TANK_PROPERTY_BASIC_ATTACT];
m_bulletDamageAddTimes = 0;
mLastWasTurn = false;
// setFrame(m_defaultDirectionImage);
getCurrentFrame();
nextFrame();
//reset user tank's bullets' status
m_curretBullet = 0;
//this tank's related bullet status reset to default
for (int i = 0; i < m_bulletCount; i++) {
m_bullet[i].reset();
}
setVisible(false);
}
private void releaseBombScene(){
try {
if(null!=m_bombSprite){
GameLogic.m_layerManager.remove(m_bombSprite);
m_bombSprite=null;
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void createBombScene() {
try {
m_bombSprite = new Sprite(GameLogic.m_bombImage, BOMB_IMAGE_WIDTH,
BOMB_IMAGE_HEIGHT);
m_bombSprite.defineReferencePixel(BOMB_IMAGE_WIDTH / 2,
BOMB_IMAGE_HEIGHT / 2);
m_bombSprite.setVisible(false);
GameLogic.m_layerManager.insert(m_bombSprite, 0);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
protected void init(){
defineReferencePixel(m_frameWidth / 2, m_frameHeight / 2);
m_bulletCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_FREQUENCY];
m_tankBlood = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_BLOOD];
m_bombCount = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BOMB_COUNT];;//the bomb count of current life
m_tankLife = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_TANK_LIFE];//life left;
m_bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_ATTACT_SPEED];//life left;
m_tankSpeed = GameLogic.tank_type[m_tankType][GameLogic.TANK_PROPERTY_BASIC_MOVE_PIXEL];//life left;
m_tankPoints = 0;
/**
* tank display scene
*/
m_tankBombFrame=0;
m_tankLightFrame=0;
mKX = mKY = mLastDelta = 0;
m_startPositionX = m_startPositionY = 0;
mLastWasTurn = m_bulletLocked = false;
m_currentState = GameLogic.GAME_STATE_READY;
m_currentDirection = GameLogic.TANK_DIRECTION_UP;
m_currentAngel = Sprite.TRANS_NONE;
m_curretBullet = 0;//第一颗子弹INDEX 为0
m_init = false;
m_invicible = false;
m_doublePoints = false;
m_bulletDamageAddTimes = 0;
if(GameLogic.TANK_RETIRED <= m_tankType&& GameLogic.TANK_BABY>=m_tankType){
m_defaultDirectionImage = GameLogic.RETIRED_TANK_IMAGE_UP_STILL;
m_bulletOwner = GameLogic.USER_TANK_BULLET;
m_tankOwner = GameLogic.USER_TANK;
//for test
m_invicible=true;
if(m_tankType==GameLogic.TANK_BABY){
createBabyBullet();
}else{
createCommonBullet();
}
}else if(GameLogic.TANK_ENEMY_TYPE1 == m_tankType ||
GameLogic.TANK_ENEMY_TYPE2 == m_tankType ||
GameLogic.TANK_ENEMY_TYPE3 == m_tankType ){
m_defaultDirectionImage = GameLogic.TANK_ENEMY_TYPE1_IMAGE_DOWN_STILL;
m_bulletOwner = GameLogic.ENEMY_TANK_BULLET;
m_tankOwner = GameLogic.ENEMY_TANK;
createCommonBullet();
m_bulletDelayFrame=0;
}
//determine default direction image according to enemy tank type
if (m_tankOwner == GameLogic.ENEMY_TANK) {
m_currentAngel = Sprite.TRANS_ROT180;////enemy tank move down at first
m_currentDirection = GameLogic.TANK_DIRECTION_DOWN;
m_bulletOwner = GameLogic.ENEMY_TANK_BULLET;
m_tankLife = 1;//enemy tank only have one life
}
m_missileCount=0;
setFrame(m_defaultDirectionImage);
getCurrentFrame();
}
//(1)发射的时候,跟踪器随机锁住敌方坦克
//(2)三发导弹逐一击中目标.
//(3)
private void createMissiles() {
m_bulletType = GameLogic.BULLET_TYPE_MISSILE;
try {
m_bullet = new BulletSprite[m_bulletCount];
int bulletSpeed = GameLogic.tank_type[m_tankType][GameLogic.
TANK_PROPERTY_ATTACT_SPEED];
m_bulletDamage = GameLogic.BULLET_MISSILE_DAMAGE;
for (int i = 0; i < m_bulletCount; i++) {
m_bullet[i] = new BulletSprite(GameLogic.m_bulletImage_missile, MISSILE_WIDTH,
MISSILE_HEIGHT,
bulletSpeed, m_bulletDamage,
m_bulletOwner, m_tankIndex, m_bulletType);
BattleCanvas.m_layerManager.insert(m_bullet[i], 0);
}
}
catch (Exception ex) {
ex.printStackTrace();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -