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

📄 webwar.java

📁 空战游戏,来自java2 编程第五版源码
💻 JAVA
字号:
import java.applet.*;
import java.awt.*;

public class WebWar extends Applet implements Runnable
{
	Thread MyThread = null;

	static final int FPS = 60;
	static final int DELAY = 1000/FPS;
	
	static final int GAME_ACTIVE  = 0;
	static final int INTRO_ACTIVE = 1;

	static final int MAX_OBJECTS = 32;

	static final int DISTANCE = 96;

	static int GameFlag;

	static int KeyDownCode;
	static int KeyUpCode;
	static boolean Key_L;
	static boolean Key_R;
	static boolean Key_U;
	static boolean Key_D;

	static int GameCounter;
	static int WaveCounter;
	static int OverCounter;

	static boolean GameOver;

	static int Score = 0;
	static int HiScore = 0;
	static int Stage = 0;
	static int Lives = 3;
	
	static AudioClip LaserSfx;
	static AudioClip ExploSfx;
	static AudioClip BulletSfx;
	static AudioClip ReadySfx;
	static AudioClip OverSfx;

	static Image Title;
	static Image Burki;

	static private Image BackBuffer;
	static private Graphics MyGfx;
	static private Dimension dimBackBuffer;

	static Object3D MyObjects[] = new Object3D[MAX_OBJECTS];

	static Stars3D Stars = new Stars3D();

	static int AttackWave[];
	static Waves3D Waves = new Waves3D();

	static Camera3D Camera = new Camera3D();

	MediaTracker m_mediaTracker = new MediaTracker(this);

	int TextLength = 0;
	Text3D MyText[];

	public WebWar()
	{
	}
	
	public String getAppletInfo()
	{
		return  "Name: LaserWheel\r\n" +
				"Author: Burkhard Ratheiser\r\n" +
				"(c)1997 Just for fun...";
	}
	
	public void paint(Graphics g)
	{
		if (m_mediaTracker.checkAll())
		{
			if (m_mediaTracker.isErrorAny())
			{
				g.drawString("Error loading images",10,30);
				return;
			}

			if (BackBuffer != null)
			{
				g.drawImage(BackBuffer,0,0,null);
			}
		}
		else
		{
			g.drawString("Loading data, please wait...",10,20);
		}
	}

	public void update(Graphics g)
	{
		switch (GameFlag)
		{
			case GAME_ACTIVE:
				{
					PaintGame(MyGfx);
					paint(g);
					break;
				}
			case INTRO_ACTIVE:
				{
					PaintIntro(MyGfx);
					paint(g);
					break;
				}
		}
	}

	private void PaintIntro(Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,dimBackBuffer.width,dimBackBuffer.height);

		Stars.Draw(g);
		Stars.Move();

		g.drawImage(Burki,158,80,null);

		g.setColor(Color.yellow);
		for (int i=0; i<TextLength; i++)
		{
			MyText[i].Draw(g,0,-120);
		}

		g.setColor(Color.white);
		g.drawString("written by Burkhard Ratheiser",140,228);
		g.setColor(Color.red);
		g.drawString("press Space to start",160,280);
	}
	
	private void PaintGame(Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,dimBackBuffer.width,dimBackBuffer.height);

		//Stars.Draw(g);
		//Stars.Move();
		
		PaintFrame(g);

		if (Score > HiScore)
			HiScore = Score;

		g.setColor(Color.white);
		g.drawString("Score: " + Score,32,20);
		g.drawString("Hi: " + HiScore,140,20);
		g.drawString("Stage: " + Stage,230,20);
		g.drawString("Lives: " + Lives,320,20);
		
		g.setColor(Color.red);
		if (GameCounter < 192)
			if ((GameCounter & 16) == 0)
				g.drawString("Get Ready",dimBackBuffer.width/2-24,dimBackBuffer.height/2-16);
		
		if (OverCounter > 0)
			g.drawString("Game Over",dimBackBuffer.width/2-24,dimBackBuffer.height/2-16);
		if (--OverCounter == 0) InitIntro();
	}

	private void PaintFrame(Graphics g)
	{
		Camera.Transform();
		
		for (int i=0; i<MAX_OBJECTS; i++)
		{
			if (MyObjects[i] != null)
				MyObjects[i].Draw(g,Camera.CameraMatrix);
		}
	}

	public void init()
	{
		//resize(320,200);
		requestFocus();

		dimBackBuffer = size();

		Point2D.ScreenWidth = dimBackBuffer.width;
		Point2D.ScreenHeight = dimBackBuffer.height;

		for (int i=0; i<360+90; i++)
			Matrix3D.SinusList[i] = Math.sin(i * 2 * Math.PI / 360);

		BackBuffer = createImage(dimBackBuffer.width,dimBackBuffer.height);
		MyGfx = BackBuffer.getGraphics();

		LaserSfx = LoadAudioClip("Laser.au");
		ExploSfx = LoadAudioClip("Explo.au");
		BulletSfx = LoadAudioClip("Bullet.au");
		ReadySfx = LoadAudioClip("Ready.au");
		OverSfx = LoadAudioClip("Over.au");
		
		Burki = LoadImage("Burki.gif");

		HiScore = 0;

		InitText("WEBWAR",1.5,1.5,1,3,0,0);
		InitIntro();
	}

	public void InitText(String text, double xscale, double yscale, double zscale, int xrot, int yrot, int zrot)
	{
		for (int i=0; i<text.length(); i++)
		{
			if (!Character.isSpace(text.charAt(i)))
				TextLength++;
		}

		MyText = new Text3D[TextLength];
		
		double xpos = -((text.length()-1)*DISTANCE/2);
		double ypos = 0;

		int j = 0;
		for (int i=0; i<text.length(); i++)
		{
			if (!Character.isSpace(text.charAt(i)))
			{
				Character character = new Character(Character.toLowerCase(text.charAt(i)));
				MyText[j++] = new Text3D(character.toString(),xpos,ypos,xscale,yscale,zscale,xrot,yrot,zrot);
			}
			xpos += DISTANCE;
		}
	}
		
	public void InitIntro()
	{
		KeyDownCode = 0;
		KeyUpCode = 0;

		//InitText("WEBWAR",1.5,1.5,1,3,0,0);

		GameFlag = INTRO_ACTIVE;
	}

	public void InitGame()
	{
		for (int i=0; i<MAX_OBJECTS; i++)
		{
			MyObjects[i] = null;
		}
		
		GameCounter = 0;
		WaveCounter = 0;
		OverCounter = 0;

		GameOver = false;

		Score = 0;
		Lives = 3;
		Stage = 1;
		
		AttackWave = (int[])Waves.AttackWaves.elementAt((int)Stage-1);

		GetNewObject(new Web3D(0,200,200,0,0,0));
		GetNewObject(new Ship3D());

		Camera.Reset();
		
		KeyDownCode = 0;
		KeyUpCode = 0;
		Key_L = false;
		Key_R = false;
		Key_U = false;
		Key_D = false;

		GameFlag = GAME_ACTIVE;
	}

	static public boolean GetNewObject(Object3D NewObject)
	{
		for (int i=0; i<MAX_OBJECTS; i++)
		{
			if (MyObjects[i] == null)
			{
				MyObjects[i] = NewObject;
				return true;
			}
		}
		return false;
	}

	public void destroy()
	{
 	}

	public void start()
	{
		if (MyThread == null)
		{
			MyThread = new Thread(this);
			MyThread.start();
		}
	}

	public void stop()
	{
		if (MyThread != null)
		{
			MyThread.stop();
			MyThread = null;
		}
 	}

	public void run()
	{
		try
		{
			repaint();
				
			m_mediaTracker.waitForAll();
				
			while (true)
			{
				switch (GameFlag)
				{
					case GAME_ACTIVE:
					{
						GameHandler();
						for (int i=0; i<MAX_OBJECTS; i++)
						{
							if (MyObjects[i] != null)
								if (MyObjects[i].Handler() == false) MyObjects[i] = null;
						}
						repaint();
						Thread.sleep(DELAY);
						break;
					}
					case INTRO_ACTIVE:
					{
						repaint();
						for (int i=0; i<TextLength; i++)
						{
							MyText[i].Handler();
						}
						if (KeyDownCode == 32) InitGame();
						Thread.sleep(DELAY);
						break;
					}
			
				}
			}
		}
		catch (InterruptedException e)
		{
			stop();
		}
	}
	
	private AudioClip LoadAudioClip(String AudioClipFile)
	{
		AudioClip Temp;
		
		Temp = getAudioClip(getDocumentBase(),AudioClipFile);
		Temp.play();
		Temp.stop();

		return Temp;
	}

	private Image LoadImage(String ImageFile)
	{
		Image Temp;
		
		Temp = getImage(getDocumentBase(),ImageFile);
		m_mediaTracker.addImage(Temp,0);

		return Temp;
	}

	private Image[] LoadFrames(String SpriteFile, int MaxFrames)
	{
		Image Frames[] = new Image[MaxFrames];
		String FileName;
		int ImageNr;
		for (int i=0; i<MaxFrames; i++)
		{
			ImageNr = i+1;
			FileName = SpriteFile + ((ImageNr < 10)?"0":"") + ImageNr + ".gif";
			Frames[i] = getImage(getDocumentBase(),FileName);
			m_mediaTracker.addImage(Frames[i],0);
		}
		return Frames;
	}

	public boolean keyDown(Event  evt, int  key)
	{
		KeyDownCode = key;
		
		switch (key)
		{
			case Event.LEFT:
				Key_L = true;
				break;
			case Event.RIGHT:
				Key_R = true;
				break;
			case Event.UP:
				Key_U = true;
				break;
			case Event.DOWN:
				Key_D = true;
				break;
		}
		return true;
	}

	public boolean keyUp(Event  evt, int  key)
	{
		KeyUpCode = key;
		
		switch (key)
		{
			case Event.LEFT:
				Key_L = false;
				break;
			case Event.RIGHT:
				Key_R = false;
				break;
			case Event.UP:
				Key_U = false;
				break;
			case Event.DOWN:
				Key_D = false;
				break;
		}
		return true;
	}

	static public boolean Collision(Object3D object)
	{
		for (int i=0; i<MAX_OBJECTS; i++)
		{
			if (MyObjects[i] != null)
				if (MyObjects[i].Name.equals("Shot3D"))
				{
					if (object.XPos <= (MyObjects[i].XPos + 24))
						if ((object.XPos + 24) >= MyObjects[i].XPos)
							if (object.YPos <= (MyObjects[i].YPos + 24))
								if ((object.YPos + 24) >= MyObjects[i].YPos)
									if (object.ZPos <= (MyObjects[i].ZPos + 24))
										if ((object.ZPos + 24) >= MyObjects[i].ZPos)
										{	
											Ship3D.LaserCount--;
											MyObjects[i] = null;
											return true;
										}
				}
		}
		return false;
	}

	static public boolean Player_Collision(Object3D object)
	{
		for (int i=0; i<MAX_OBJECTS; i++)
		{
			if (MyObjects[i] != null)
				if (MyObjects[i].Name.equals("Ship3D"))
					if (Ship3D.Destroyed == 0)
					{
						if (object.XPos <= (MyObjects[i].XPos + 24))
							if ((object.XPos + 24) >= MyObjects[i].XPos)
								if (object.YPos <= (MyObjects[i].YPos + 24))
									if ((object.YPos + 24) >= MyObjects[i].YPos)
										if (object.ZPos <= (MyObjects[i].ZPos + 24))
											if ((object.ZPos + 24) >= MyObjects[i].ZPos)
											{	
												GetNewObject(new Explo3D(MyObjects[i].XPos,MyObjects[i].YPos,MyObjects[i].ZPos));
												if (Lives-- > 1)
												{	
													MyObjects[i].Visible = false;
													Ship3D.Destroyed = 100;
													return true;
												}
												else
												{
													MyObjects[i] = null;
													OverCounter = 200;
													GameOver = true;
													OverSfx.play();
													return true;
												}
											}
					}
		}
		return false;
	}

	private void GameHandler()
	{
		if (GameCounter == AttackWave[WaveCounter*7+Waves.Wave_Counter])
		{
			if (AttackWave[WaveCounter*7+Waves.Wave_EnemyFlag] == Waves.NULL)
			{
				if (!GameOver)
				{
					GameCounter = 0;
					WaveCounter = 0;
					if (Stage++ == Waves.AttackWaves.size())
					{
						Stage = 1;
					}
					AttackWave = (int[])Waves.AttackWaves.elementAt((int)Stage-1);
				}
				return;
			}
			else
			{
				GetNewObject(new Enemy3D(AttackWave[WaveCounter*7+Waves.Wave_EnemyFlag],AttackWave[WaveCounter*7+Waves.Wave_XWinkel],AttackWave[WaveCounter*7+Waves.Wave_YWinkel],AttackWave[WaveCounter*7+Waves.Wave_XAdd],AttackWave[WaveCounter*7+Waves.Wave_YAdd],AttackWave[WaveCounter*7+Waves.Wave_ShootFlag]));
				WaveCounter++;
			}
		}
		if (GameCounter++ == 0) ReadySfx.play();;
		GameCounter++;
	}

}

⌨️ 快捷键说明

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