📄 fps.java
字号:
package Item;
import java.io.IOException;
import java.util.Random;
import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
public class FPS extends GameCanvas implements Runnable {
FPS_MIDlet fps;
static final int W = 176;
static final int H = 208;
Player player;// 玩家类
Ball ball;// 子弹类
Graphics g;// 画笔
Vector VBALL;// 子弹队列
boolean on;// 子弹开关
Vector VNPC;// npc队列
Image logo, logo1, logo2, menu, jiantou, loading, player1, haiyang;// 图片
final int PHOTO = 0, MENU = 1, LOADING = 2, PLAY = 3, EXIT = 4;// 游戏状态
int state, count, num, y1, y2, speed;// 状态, 计数器, LOGO界面图片索引, 地图Y轴, 玩家移动速度
Random rand;
protected FPS(FPS_MIDlet fps) {
super(true);// 是否屏蔽游戏键之外的按键
this.fps = fps;
g = getGraphics();// 获得一个画笔
setFullScreenMode(true);// 是否进行全屏设置
VBALL = new Vector();
VNPC = new Vector();
rand = new Random();
try {
logo = Image.createImage("/Image/logo.png");
logo1 = Image.createImage("/Image/logo1.png");
logo2 = Image.createImage("/Image/logo2.png");
// 菜单------------------------
menu = Image.createImage("/Image/menu.png");
jiantou = Image.createImage("/Image/jiantou.png");
// LOADING---------------------
loading = Image.createImage("/Image/loading.png");// Loading
// PLAY------------------------
haiyang = Image.createImage("/Image/haiyang.png");// 海洋
player1 = Image.createImage("/Image/chuan01.png");// 玩家1
} catch (IOException e) {
e.printStackTrace();
}
player = new Player(player1);
player.setPosition(W / 2, H - 40);// 设置player初始化位置
ball = new Ball(player.getX(), player.getY());
new Thread(this).start();
}
// 显示层----------------------------------
void paint() {
g.setColor(0xffffff);
g.fillRect(0, 0, W, H);
switch (state) {
case PHOTO:
if (num == 0) {
g.drawImage(logo, 0, 0, 0);
} else if (num == 1) {
g.drawImage(logo1, 0, 0, Graphics.TOP | Graphics.LEFT);
} else if (num == 2) {
g.drawImage(logo2, 0, 0, Graphics.TOP | Graphics.LEFT);
}
break;
case MENU:
g.drawImage(menu, 0, 0, Graphics.TOP | Graphics.LEFT);
g.drawImage(jiantou, 20, num, Graphics.TOP | Graphics.LEFT);
break;
case LOADING:
g.drawImage(loading, 0, H / 2 - 30, 0);
break;
case PLAY:
g.drawImage(haiyang, 0, y1, 0);
g.drawImage(haiyang, 0, y2 - H, 0);
player.paint(g); // 画player
drawBall(g); // 画子弹
drawNPC(); // 画NPC
break;
}
flushGraphics();// 把缓冲图像画到前台
}
// 逻辑层--------------------------------------
void logic() {
count++;
switch (state) {
case PHOTO:
if (count % 40 == 0) {
num++;
}
if (num > 2) {
state = MENU;
num = 108;
}
break;
case MENU:
break;
case LOADING:
if (count % 70 == 0) {
state = PLAY;
}
break;
case PLAY:
// 地图循环转动
y1 = y1 + 1 >= H ? -H : y1 + 1;
y2 = y2 + 1 >= H * 2 ? 0 : y2 + 1;
// 射击子弹
addBall();
moveBall();
// 刷怪
addNPC();
moveNPC();
break;
}
}
// 控制层------------------------------------
public void keyPressed() {
int keystate = getKeyStates();
switch (state) {
case PHOTO:
if (keystate != 0) {
num++;
paint();
}
break;
case MENU:
switch (keystate) {
case UP_PRESSED:
num = num - 22 <= 108 ? 108 : num - 22;
break;
case DOWN_PRESSED:
num = num + 22 >= 174 ? 174 : num + 22;
break;
case FIRE_PRESSED:
if (num == 108) {
state = LOADING;
} else if (num == 174) {
fps.exit();
}
break;
}
break;
case PLAY:
playerMove();
// if (keystate == FIRE_PRESSED) {// 按中心键发子弹
// on=!on;
// addBall();
// }
// moveBall();
break;
}
}
// ------------------------------------------
/**
* 玩家移动
*/
void playerMove() {
int speed = 3; // 移动速度
int state = getKeyStates();
switch (state) {
case UP_PRESSED:
if (player.getY() - speed >= 0) {
player.setPosition(player.getX(), player.getY() - speed);
}
break;
case DOWN_PRESSED:
if (player.getY() + speed <= H - Player.H) {
player.setPosition(player.getX(), player.getY() + speed);
}
break;
case LEFT_PRESSED:
if (player.getX() - speed >= 0) {
player.setPosition(player.getX() - speed, player.getY());
}
break;
case RIGHT_PRESSED:
if (player.getX() + speed <= W - Player.W) {
player.setPosition(player.getX() + speed, player.getY());
}
break;
}
if (count % 4 == 0) {
player.nextFrame();
}
}
/**
* 移动子弹
*/
void moveBall() {
for (int i = 0; i < VBALL.size(); i++) {
Ball temp = (Ball) VBALL.elementAt(i);
temp.move();
if (temp.isRemove()) {
VBALL.removeElementAt(i);
}
}
}
/**
* 添加子弹01
*/
void addBall() {
count++;
if (count % 10 == 0) {
Ball ball01 = new Ball(player.getX(), player.getY());
VBALL.addElement(ball01);
}
}
/**
* 画子弹
*/
void drawBall(Graphics g) {
for (int i = 0; i < VBALL.size(); i++) {
Ball temp = (Ball) VBALL.elementAt(i);
temp.drawBall01(g);
}
}
/**
* 画NPC
*/
void drawNPC() {
for (int i = 0; i < VNPC.size(); i++) {
NPC temp = (NPC) VNPC.elementAt(i);
temp.drawNpc(g);
}
}
/**
* 添加NPC
*/
void addNPC() {
count++;
if (count % 40 == 0) {
NPC temp = null;
int num = (rand.nextInt() >>> 1) % 3;// 随机出不同种类怪
int xnum = (rand.nextInt() >>> 1) % 176;
System.out.println(num);
switch (num) {
case 0:
temp = new NPC01(xnum, -20);
break;
case 1:
temp = new NPC02(50, -20);
break;
case 2:
temp = new NPC01(20, -20);
break;
case 3:
break;
}
VNPC.addElement(temp);
}
}
/**
* 移动NPC
*/
void moveNPC() {
for (int i = 0; i < VNPC.size(); i++) {
NPC temp = (NPC) VNPC.elementAt(i);
temp.move();
if (temp.isRemove()) {
VNPC.removeElementAt(i);
}
}
}
// ------------------------------------------
public void run() {
while (true) {
logic();
keyPressed();
paint();
try {
Thread.sleep(33);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -