⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wargame.java

📁 一个用Java开发的射击类游戏
💻 JAVA
字号:
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.GameCanvas;
import java.io.IOException;

public class WarGame extends GameCanvas implements Runnable
{
	private MainSelect	mainSelect = null;
	//循环控制器
	private boolean		stop = false;
	//主角生死标志
	private boolean		actorDead = false;
	
	//主角
	private Sprite		actorSprite = null;
	//主角方向状态——上(0)下(1)左(2)右(3)
	private int	currentDirectStatus = 0;
	private int	lastDirectStatus = 0;
	//主角现在坐标
	private int	currentX = 0, currentY = 0;
	//主角现在的帧
	private int	currentFrame = 0;
	//按下的方向键
	private boolean	isClicked = false;
	
	//wall管理
	private WallManager	wallManager = null;

	//敌人管理
	private EnemyManager	enemyManager = null;

	//子弹管理
	private BulletManager	bulletManager = null;
	
	//动画管理器
	private FlashManager	flashManager = null;
	

	public WarGame(MainSelect ms, WallManager tempWallManager)
	{
		super(true);
		mainSelect		= ms;
		setFullScreenMode(true);
		//精灵管理器
		wallManager = tempWallManager;
		
		//System.out.println("FlashManager:");
		flashManager = new FlashManager();
		//System.out.println("FlashManager……");
		
		enemyManager = new EnemyManager(tempWallManager, flashManager);
		//System.out.println("EnemyManager……");
		
		bulletManager = new BulletManager(tempWallManager, enemyManager);
		//System.out.println("BulletManager……");
		
		initActorSprite();		
		new Thread(this).start();
		//System.out.println("WarGame初始化完毕");
	}
	private void initActorSprite()
	{
		try
		{
			Image	actorImage = Image.createImage("/actor.png");
			actorSprite = new Sprite(actorImage, War.ACTOR_WIDTH, War.ACTOR_HEIGHT);
			//以下两种坐标的转换要求ACTOR_WIDTH是STEP_WIDTH的整数倍,ACTOR_HEIGHT是STEP_HEIGHT的整数倍
			int tempActorX = wallManager.getActorX();
			int tempActorY = wallManager.getActorY();
			currentX = tempActorX * War.ACTOR_WIDTH / War.STEP_WIDTH;
			currentY = tempActorY * War.ACTOR_HEIGHT / War.STEP_HEIGHT;;
			//System.out.println("主角的默认坐标是:" + tempActorX + ":" + tempActorY);
			actorSprite.setPosition(War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
			actorSprite.setFrame(War.DEFAULT_FRAME);
			//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
		}
		catch (IOException ie)
		{
		}
	}
	public void run()
	{
		Graphics	g = getGraphics();
		while(!stop && !actorDead)
		{
			input();
			drawScreen(g);
			try
			{
				Thread.sleep(War.DISPLAY_TIME);
			}
			catch (InterruptedException ie)
			{
			}
			flushGraphics();
		}
		//战争结束,开始绘制结束动画
		int R = 255, G = 255, B = 255;
		while (actorDead && !stop)
		{
			g.setColor(0, 0, 0);
			g.fillRect(0, 0, War.WIDTH, War.HEIGHT);
			g.setColor(R, G, B);
			g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.WAR_FIELD_WIDTH, War.WAR_FIELD_HEIGHT);
			G -= War.ACTOR_DEAD_COLOR;
			B -= War.ACTOR_DEAD_COLOR;
			actorSprite.move(0, War.ACTOR_DEAD_RATE);
			actorSprite.paint(g);
			try
			{
				Thread.sleep(War.DISPLAY_TIME);
			}
			catch (InterruptedException ie)
			{
			}
			flushGraphics();
			if (G < 0 || B < 0 || actorSprite.getY() > War.WAR_FIELD_HEIGHT + War.WAR_FIELD_TOP)
			{
				stop = true;
			}
		}
		WarMidlet.dis.setCurrent(mainSelect);
	}
	private void input()
	{
		int keyState=getKeyStates();
		lastDirectStatus = currentDirectStatus;
		//UP
		if((keyState&GameCanvas.UP_PRESSED)!=0)
		{
			currentDirectStatus = 0;
			isClicked = true;
		}
		//DOWN
		if((keyState&GameCanvas.DOWN_PRESSED)!=0)
		{		
			currentDirectStatus = 1;
			isClicked = true;
		}
		//LEFT
		if((keyState&GameCanvas.LEFT_PRESSED)!=0)
		{		
			currentDirectStatus = 2;
			isClicked = true;
		}
		//RIGHT
		if((keyState&GameCanvas.RIGHT_PRESSED)!=0)
		{	
			currentDirectStatus = 3;
			isClicked = true;
		}
		if((keyState&GameCanvas.FIRE_PRESSED)!=0)
		{
			//System.out.println("主角的坐标原点是" + actorSprite.getRefPixelX() + ":" + actorSprite.getRefPixelY());
			bulletManager.addBullet(currentDirectStatus, War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
			//enemyManager.addEnemy();
			//可以单独开一个线程用来控制产生敌人
		}
	}
	private void drawScreen(Graphics g)
	{
		//绘制背景
		g.setColor(0,0,0);
		g.fillRect(0,0,War.WIDTH,War.HEIGHT);
		//绘制战争区域
		g.setColor(0,255,0);
		g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.WAR_FIELD_WIDTH, War.WAR_FIELD_HEIGHT);
		//绘制墙
		wallManager.updateWall(g);
		//绘制敌人产生地
		g.setColor(255,0,0);
		g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.ENEMY_WIDTH, War.ENEMY_HEIGHT);
		//绘制主角
		drawActor(g);
		//绘制子弹
		bulletManager.updateBullet(g);
		//绘制敌人
		enemyManager.updateEnemy(g);
		//绘制动画
		flashManager.updateFlash(g);
	}
	private void drawActor(Graphics g)
	{
		//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
		if (isClicked)
		{
			//System.out.println("有击键事件出现");
			if (currentDirectStatus == 0)
			{//上
				if (currentDirectStatus != lastDirectStatus)
				{
					currentFrame = 1;
				}
				else
				{
					currentFrame = (currentFrame+1)%3;
					if (currentY != 0)
					{
						currentY--;
						actorSprite.move(0, -War.STEP_HEIGHT);
						if (isLimited())
						{
							currentY++;
						}
					}
				}
			}
			else if (currentDirectStatus == 1)
			{//下
				if (currentDirectStatus != lastDirectStatus)
				{
					currentFrame = 7;
				}
				else
				{
					currentFrame = 6 + (currentFrame - 6 + 1)%3;
					if (currentY != (War.V_NUMBER - 1) * War.ACTOR_HEIGHT)
					{
						currentY++;
						actorSprite.move(0, War.STEP_HEIGHT);
						if (isLimited())
						{
							currentY--;
						}
					}
				}
			}
			else if (currentDirectStatus == 2)
			{//左
				if (currentDirectStatus != lastDirectStatus)
				{
					currentFrame = 10;
				}
				else
				{
					currentFrame = 9 + (currentFrame - 9 + 1)%3;
					if (currentX != 0)
					{
						currentX--;
						actorSprite.move(-War.STEP_WIDTH, 0);
						if (isLimited())
						{
							currentX++;
						}
					}
				}
			}
			else
			{//右
				if (currentDirectStatus != lastDirectStatus)
				{
					currentFrame = 4;
				}
				else
				{
					currentFrame = 3 + (currentFrame - 3 + 1)%3;
					if (currentX != (War.H_NUMBER - 1) * War.ACTOR_WIDTH)
					{
						currentX++;
						actorSprite.move(War.STEP_WIDTH, 0);
						if (isLimited())
						{
							currentX--;
						}
					}
				}
			}
			actorSprite.setPosition(War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
			actorSprite.setFrame(currentFrame);
			isClicked = false;
		}
		//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
		if (enemyManager.collidesWith(actorSprite))
		{
			actorDead = true;
			return;
		}
		actorSprite.paint(g);
	}
	private boolean isLimited()
	{
		//墙阻挡
		if (wallManager.collidesWith(actorSprite))
		{
			return true;
		}
		//边界阻挡
		if (actorSprite.getX() < War.WAR_FIELD_LEFT || actorSprite.getX() > War.WAR_FIELD_LEFT + War.WAR_FIELD_WIDTH - War.ACTOR_WIDTH || actorSprite.getY() < War.WAR_FIELD_TOP || actorSprite.getY() > War.WAR_FIELD_TOP + War.WAR_FIELD_HEIGHT - War.ACTOR_HEIGHT)
		{
			return true;
		}
		return false;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -