📄 gamecanvas.java
字号:
package qian;
import javax.microedition.lcdui.*;
import java.util.*;
import javax.microedition.rms.*;
import java.io.*;
/**
*/
public class GameCanvas
extends Canvas {
Graphics g;
public Graphics bg = null; //双缓存画布
private Qianmain mainScreen; //主屏幕
private int width, height; //屏幕宽高
String[] mu = {
"开始游戏", "退出游戏", "玩家战绩", "游戏说明", "开发小组"};
int curMenu;
QianTing temp;
Image back, img, mjl, mjr;
int score;
int status = 1; //菜单状态
private Image bufferImg = null; //双缓存图片
private Ship sp = null; //船
Vector qts = new Vector();
private Timer timer;
RecordStore rs;
Vector playerList = new Vector();
public GameCanvas(Qianmain mainScreen) {
this.mainScreen = mainScreen;
width = this.getWidth();
height = this.getHeight();
System.out.println(""+width);
System.out.println(""+height);
bufferImg = Image.createImage(width, height);
try {
bg = bufferImg.getGraphics();
back = Image.createImage("/res/bac.png");
img = Image.createImage("/res/cover.png");
mjl = Image.createImage("/res/jl.png");
mjr = Image.createImage("/res/jr.png");
}
catch (Exception e) {
e.printStackTrace();
}
sp = new Ship(this, width, height);
openDb("qianting");
getPlayerList();
}
public void startGame() {
timer = new Timer();
score = 0;
sp.booms.removeAllElements();
qts.removeAllElements();
timer.schedule(new QianTingCreator(), 300, 105 * 30);
timer.schedule(new QianTingSetter(), 5, 50);
}
public void stopGame() {
timer.cancel();
timer = null;
}
public void gameOver() {
stopGame();
status = 3;
repaint();
}
protected void paint(Graphics g) {
switch (status) {
case 1: //菜单
g.drawImage(img, 0, 0, Graphics.TOP | Graphics.LEFT);
g.drawImage(mjl, 30, 120, Graphics.TOP | Graphics.LEFT);
g.drawImage(mjr, 110, 120, Graphics.TOP | Graphics.LEFT);
g.setColor(255, 0, 0);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.drawString(mu[curMenu], 65, 140, Graphics.TOP | Graphics.LEFT);
break;
case 2: //游戏
showGameCanvas(g);
break;
case 3: //game over
bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
bg.setColor(255, 0, 0);
bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE));
bg.drawString("Game Over", width / 2, 25,
Graphics.HCENTER | Graphics.TOP);
bg.drawString("得分:" + score, width / 2, 45,
Graphics.HCENTER | Graphics.TOP);
g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);
break;
case 4: //说明
g.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE ));
g.setColor(255, 0, 0);
g.drawString("军舰以左右键控制方向", 5, 50, Graphics.LEFT | Graphics.TOP);
g.drawString("当军舰被击中游戏结束", 5, 65, Graphics.LEFT | Graphics.TOP);
break;
case 5: //玩家战绩
bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE ));
int yw = 10;
bg.setColor(255, 0, 0);
for (int i = 0; i < playerList.size(); i++) {
String s = (String) playerList.elementAt(i);
bg.drawString(s, width / 2, yw + i * 15,
Graphics.TOP | Graphics.HCENTER);
}
g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);
break;
case 6: //开发小组
g.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE ));
g.setColor(255, 0, 0);
g.drawString("监制:陈万飞", 5, 50, Graphics.LEFT | Graphics.TOP);
g.drawString("主程序:王昉铭", 5, 65, Graphics.LEFT | Graphics.TOP);
g.drawString("主美工 :张晓磊", 5, 80, Graphics.LEFT | Graphics.TOP);
g.drawString("程序:王宇 李国栋", 5, 100, Graphics.LEFT | Graphics.TOP);
break;
}
}
public void showGameCanvas(Graphics g) {
g.setColor(255,255,255) ;
g.fillRect(0,0,this.width ,this.height ) ;
bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
sp.reShip();
for (int i = 0; i < qts.size(); i++) {
QianTing temp = (QianTing) qts.elementAt(i);
temp.paint(bg);
}
bg.drawString("得分:" + score, 0, 0, Graphics.LEFT | Graphics.TOP);
g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);
}
public void closeDb() {
try {
rs.closeRecordStore();
}
catch (Exception ex) {
}
}
public void openDb(String rsname) {
try {
rs = RecordStore.openRecordStore(rsname, true);
}
catch (Exception e) {
return;
}
}
public void getPlayerList() {
try {
for (int i = 1; i <= rs.getNumRecords(); i++) {
byte[] data = rs.getRecord(i);
DataInputStream doSteam = new DataInputStream(new ByteArrayInputStream(
data));
String name = doSteam.readUTF();
int record = doSteam.readInt();
playerList.addElement(name + ":" + record);
doSteam.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public void addPlayer(String name, int sc) {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
DataOutputStream doSteam = new DataOutputStream(bo);
try {
doSteam.writeUTF(name);
doSteam.writeInt(sc);
byte data[] = bo.toByteArray();
rs.addRecord(data, 0, data.length);
doSteam.close();
}
catch (Exception e) {
e.printStackTrace();
}
if (playerList.size() < 5) {
playerList.addElement(name + ":" + score);
}
else {
playerList.setElementAt(name + ":" + score, 4);
}
}
/**
* keyPressed
*
* @param keyCode int
* @todo Implement this javax.microedition.lcdui.Canvas method
*/
protected void keyPressed(int keyCode) {
int k = this.getGameAction(keyCode);
switch (status) {
case 1: //主菜单
switch (k) {
case Canvas.LEFT:
curMenu--;
if (curMenu < 0) {
curMenu = 4;
}
break;
case Canvas.RIGHT:
curMenu++;
if (curMenu > 4) {
curMenu = 0;
}
break;
case Canvas.FIRE:
switch (curMenu) {
case 0: //新游戏
startGame();
status = 2;
break;
case 1: //退出游戏
Qianmain.quitApp();
break;
case 2: //玩家战绩
status = 5;
break;
case 3: //说明
status = 4;
break;
case 4: //开发小组
status = 6;
break;
}
}
repaint();
break;
case 2: //控制船
switch (k) {
case Canvas.LEFT:
sp.MoveShip(0);
break;
case Canvas.RIGHT:
sp.MoveShip(1);
break;
case Canvas.FIRE:
sp.fire();
break;
}
break;
case 3: //game over
InputForm iform = new InputForm(this);
Qianmain.instance.setScreen(iform);
if (k == Canvas.FIRE) {
status = 1;
}
break;
case 4:
case 6:
case 5:
if (k == Canvas.FIRE) {
status = 1;
}
repaint();
}
}
/**
* keyReleased
*
* @param keyCode int
* @todo Implement this javax.microedition.lcdui.Canvas method
*/
protected void keyReleased(int keyCode) {
sp.StopShip();
}
class QianTingCreator
extends TimerTask {
public void run() {
qts.addElement(new QianTing(GameCanvas.this));
}
}
class QianTingSetter
extends TimerTask {
public void run() {
for (int i = 0; i < qts.size(); i++) {
QianTing temp = (QianTing) qts.elementAt(i);
if (temp.direct == 0) {
temp.x += 2;
}
else {
temp.x -= 2;
}
if(temp.isBoomed){
temp.fireCount++;
if(temp.fireCount>2){
temp.type=-100;
}
}
//发射boom
if (GameCanvas.this.sp.x < temp.x && temp.x < GameCanvas.this.sp.x + 50) {
if (temp.isBoomed == false&&temp.type==1) {
temp.addBoom(temp);
}
}
//移动发射的boom
for (int j = 0; j < temp.booms.size(); j++) {
Boom2 b2 = (Boom2) temp.booms.elementAt(j);
b2.y -= 2;
if (b2.y < GameCanvas.this.sp.y + 10) {
temp.booms.removeElement(b2);
}
if (b2.crash(GameCanvas.this.sp)) {
gameOver();
}
}
if (temp.x > GameCanvas.this.getWidth() || temp.x < -temp.pic1.getWidth()) {
qts.removeElement(temp);
}
}
GameCanvas.this.repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -