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

📄 control.java

📁 eclipse下完成的一个扔鸡蛋的小游戏:)
💻 JAVA
字号:
package jegg;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


import javax.swing.JOptionPane;

import mqqqvpppm.activeObject.AbstractActiveObject;

/**
 * @author mqqqvpppm
 * 
 * TODO control game, control game's model and game's view.
 * 
 * Create on Sep 13,2005
 */
public class Control extends MouseAdapter implements KeyListener, Runnable {
	public Control(Model model) {
		this.model = model;
		// timer = new Timer();
		bowl1 = model.getActiveObjectByName("bowl1");
		bowl2 = model.getActiveObjectByName("bowl2");
		bowl3 = model.getActiveObjectByName("bowl3");
		egg = model.getActiveObjectByName("egg");
		isGameStarted = false;
		isInBowl = false;
		isStop = false;
		// timer.scheduleAtFixedRate(new TimerTask() {
		// public void run() {
		// if(isStop)return;
		// Control.this.run();
		// }
		// }, 0, INTERVER);
		// timer.purge();
		Thread t = new Thread(this);
		t.start();

	}

	public void mousePressed(MouseEvent e) {
		if (isStop)
			return;
		if (isGameStarted) {
			if (!isInBowl)
				return;
			throwEgg();
			isInBowl = false;
		} else {
			startGame();
		}
	}

	public void keyPressed(KeyEvent e) {
		if (isStop)
			return;

		if (!isGameStarted && e.getKeyCode() == KeyEvent.VK_ENTER) {
			startGame();
		}

		if (isGameStarted && isInBowl && e.getKeyCode() == KeyEvent.VK_SPACE) {
			throwEgg();
			isInBowl = false;
		}
	}

	// initialize all bowls's initial value randomly
	private void initAllBowls() {
		// this need give a new good idea to compute y! not set by value
		// derictly
		// int yBase = model.getDeminsion().height -36 - * 7/20;
		bowl1.setY(356);
		bowl2.setY(216);
		bowl3.setY(76);
		initBowl(bowl1);
		initBowl(bowl2);
		initBowl(bowl3);
	}

	private void initBowl(AbstractActiveObject bowl) {
		// set initial x
		bowl.setRandomX(0.0, model.getDeminsion().getWidth() - bowl.getWidth());
		// set initial speed

		// set mess
		bowl.setMess(5);

		boolean out = false;
		while (!out) {
			bowl.setRandomVx(-15, 15);
			bowl.setVx(bowl.getVx() / 100);
			double tempV = bowl.getVx();
			//speed can not be too low
			if (tempV < 0.02 && tempV > -0.02) {
				bowl.setVx(bowl.getVx() * 2);
			}
			out = true;
			//test if speed is approximate to other bowl, we need get speed again
			if (  (Math.abs(tempV - bowl1.getVx()) < 0.04 && bowl != bowl1)
					|| (Math.abs(tempV - bowl2.getVx()) < 0.04 && bowl != bowl2)
					|| (Math.abs(tempV - bowl3.getVx()) < 0.04 && bowl != bowl3) ){
//System.out.println("need get another speed "+" bow1: " + bowl1.getVx()
//		+ " bowl2: " + bowl2.getVx()
//		+ " bowl3: " + bowl3.getVx()
//		+ " setbowl: " + bowl.getVx());				
				out = false;
			}
		}
	} // put egg to a bowl, set egg's value base on bowl that carry egg

	private void putEggTo(AbstractActiveObject bowl) {
		// set initial speed at x axis
		egg.setVx(bowl.getVx());
		// set gravitation
		egg.setFg(0);
		// set force put to egg at y axis
		egg.setX(bowl.getX() + bowl.getWidth() / 2 - egg.getWidth() / 2);
		egg.setY(bowl.getY() - egg.getHeight() / 2);
	}

	private void gameOver() {
		isGameStarted = false;
		JOptionPane.showMessageDialog(view, "game over");
	}

	// gave egg object a initial value of throw
	private void throwEgg() {
		// set initial speed at y axis
		egg.setVy(-0.5);
		// set gravitation
		egg.setFg(0.003);
	}

	private void startGame() {
		// initialize all active object's deminsion
		// initDeminsion();
		// initialize all bowls's initial value randomly
		initAllBowls();

		// put egg to a bowl, set egg's value base on bowl that carry egg
		putEggTo(bowl1);

		egg.setMess(4);

		isGameStarted = true;

		isInBowl = true;

		isStop = false;

		holderBowl = bowl1;

		lastHolderBowl = bowl1;

		model.setLevel(0);

		model.setStartTime(System.currentTimeMillis());
	}

	// change bowl's speed to -speed, if ti is in corner
	private void inCorner(AbstractActiveObject activeObject) {
		boolean needChange = false;
		/**
		 * Why I judge bowl.getVx() first, then see if it is out of range:
		 * because if Vx is too fast, maybe i have changed Vx to -Vx, but next
		 * time call this method, the bowl.getX() still out of range, so i must
		 * mark Vx's speed direction to the out of range direction to avoid
		 * change Vx to -Vx
		 */
		if (activeObject.getVx() > 0) {
			if (activeObject.getX() + activeObject.getWidth() >= model.getDeminsion().width)
				needChange = true;
		} else if (activeObject.getVx() < 0) {
			if (activeObject.getX() <= 0)
				needChange = true;
		}
		if (needChange) {
			activeObject.setVx(-activeObject.getVx());
		}
	}

	// run at every interval time
	public void run() {

		while (true) {
			try {
				Thread.sleep(INTERVER);
			} catch (InterruptedException e) {
				JOptionPane.showMessageDialog(view, e.getMessage()
						+ "! please restart this program");
				break;
			}

			if (!isGameStarted)
				continue;

			// set new location of bowls
			setNewLocation();

			if (isInBowl) {
				putEggTo(holderBowl);// set egg new location
				model.activateObservers();
				continue;
			}

			// check who is the holder bowl, and mark it
			setHolderBowl();
			if (isGotTarget()) {// egg throw smoothly

				// set level value and last holder bowl;
				if (holderBowl.getY() < lastHolderBowl.getY()) {
					model.setLevel(model.getLevel() + 1);
					lastHolderBowl = holderBowl;
				} else if (holderBowl.getY() > lastHolderBowl.getY()) {
					model.setLevel(model.getLevel() - 1);
					lastHolderBowl = holderBowl;
				}

				putEggTo(holderBowl);
				isInBowl = true;

				if (holderBowl == bowl3) {// the egg is in the toppest bowl,we
					// need a new page to game
					setNewPageObject();
				}

			} else if (isGameOver()) {// egg throw badly
				gameOver();
				continue;
			} else {
				// set new location of egg
				egg.setPoint(egg.getPointAfter(INTERVER));
				egg.setVy(egg.getVyAfter(INTERVER));
			}
			// notify model to notify model's observer: view
			model.activateObservers();
		}
	}

	private void setNewLocation() {
		bowl1.setPoint(bowl1.getPointAfter(INTERVER));
		bowl2.setPoint(bowl2.getPointAfter(INTERVER));
		bowl3.setPoint(bowl3.getPointAfter(INTERVER));
		inCorner(bowl1);
		inCorner(bowl2);
		inCorner(bowl3);
		inCorner(egg);
	}

	private void setNewPageObject() {
		isStop = true;// disable the key and mouse listener

		bowl1.setVx(bowl3.getVx());
		bowl1.setX(bowl3.getX());

		putEggTo(bowl1);

		holderBowl = bowl1;
		lastHolderBowl = bowl1;

		initBowl(bowl2);
		initBowl(bowl3);

		view.refreshPage();

		isStop = false;// start the key and mouse listener
	}

	public void setView(View view) {
		this.view = view;
	}

	private boolean isGameOver() {
		if (egg.getY() > bowl1.getY())
			return true;
		return false;
	}

	// judge if the egg get this target(bowl)
	private boolean isGotTarget() {
		if (Math.abs(egg.getY() + egg.getHeight() - holderBowl.getY()) <= 5
				&& (egg.getX() + egg.getWidth() / 2 - holderBowl.getX()) >= 0
				&& (egg.getX() + egg.getWidth() / 2 - holderBowl.getX()) <= holderBowl
						.getWidth() && (egg.getVy() > 0))
			return true;
		return false;
	}

	private AbstractActiveObject lastHolderBowl;

	private void setHolderBowl() {
		int y = egg.getY();
		if (y < bowl3.getY()) {
			holderBowl = bowl3;
		} else if (y < bowl2.getY()) {
			holderBowl = bowl2;
		} else {// if(y >bowl2.getY() && y < bowl1.getY()){
			holderBowl = bowl1;
		}
	}

	public final int INTERVER = 50;

	private AbstractActiveObject bowl1;

	private AbstractActiveObject bowl2;

	private AbstractActiveObject bowl3;

	private AbstractActiveObject holderBowl;

	private AbstractActiveObject egg;

	// private Timer timer;

	private Model model;

	private boolean isGameStarted;

	private boolean isInBowl;

	private boolean isStop;

	private View view;

	public void keyTyped(KeyEvent e) {
	}

	public void keyReleased(KeyEvent e) {
	}
}

⌨️ 快捷键说明

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