📄 control.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 + -