📄 playerscreen.java
字号:
/**
游戏玩家显示类
Download by http://www.codefans.net
**/
package game.multiplayer;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
public class PlayerScreen
extends Canvas
implements CommandListener {
//UDP服务器连接串
String url = "datagram://bji18nln1:5188";
//加入游戏命令对象
Command attendGame = null;
//当前玩家命令信息变量
String playerCmd = null;
String playerInfo = null;
String currentPlayer = null;
//游戏图片对象
Image boxBody = null;
Image enemy = null;
Image effect = null;
Image backGround = null;
Image winImage = null;
Image titleImage = null;
SoundPlayer soundPlayer = new SoundPlayer();
//游戏图片长度与宽度变量
int width = 24, height = 41;
//游戏图片显示区域的索引值
int widthIndex = 1, heightIndex = 1;
//判断是否为搏击状态
boolean isPressedHitKey = false;
// 构造器
public PlayerScreen(PlayerMIDlet playerMIDlet) {
this.playerMIDlet = playerMIDlet;
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
//组件初始化
private void jbInit() throws Exception {
setCommandListener(this);
//添加命令对象
addCommand(new Command("退出游戏", Command.EXIT, 1));
attendGame = new Command("加入游戏", Command.OK, 1);
addCommand(attendGame);
//创建装载图片
try {
boxBody = Image.createImage("/imgs/charac.png");
enemy = Image.createImage("/imgs/enemy.png");
effect = Image.createImage("/imgs/effect.png");
backGround = Image.createImage("/imgs/bg.png");
winImage = Image.createImage("/imgs/win.png");
titleImage = Image.createImage("/imgs/title.png");
}
catch (IOException ex) {
ex.printStackTrace();
}
//启动查询线程
start();
}
//启动查询线程方法
public void start() {
new java.lang.Thread(new UDPListener()).start();
}
//绘图方法
public void paint(Graphics g) {
//清除屏幕
ScreenDrawer.clearScreen(g, getWidth(), getHeight());
//是否击中标志
boolean hitedFlag = false;
//是否出击标志
boolean isHit = false;
//是否为当前用户出击标志
boolean isCurrentUserHit = false;
if (playerInfo != null) {
//绘制背景图片
drawBackGround(g);
//获取积分信息串
int scopeIndex = playerInfo.indexOf("?");
String scopeString = playerInfo.substring(scopeIndex + 1);
int scope = scopeString.indexOf(",");
String player1Scope = scopeString.substring(0, scope);
String player2Scope = scopeString.substring(scope + 1);
//获取命令信息串
String playerInfoandCmd = playerInfo.substring(0, scopeIndex);
int cmdIndex = playerInfoandCmd.indexOf(":");
String playerMsg = playerInfoandCmd.substring(0, cmdIndex);
String cmdInfo = playerInfoandCmd.substring(cmdIndex + 1);
//获取player的当前坐标
int index1 = playerMsg.indexOf(",");
int index2 = cmdInfo.indexOf(",");
int player1X = Integer.parseInt(playerMsg.substring(0, index1));
int player2X = Integer.parseInt(playerMsg.substring(index1 + 1));
//绘制player1
if (cmdInfo.substring(0, index2).equals("go")) {
ScreenDrawer.drawImage(g, boxBody,
player1X,
97, width, height, widthIndex, heightIndex, true);
}
else if (cmdInfo.substring(0, index2).equals("hit")) {
ScreenDrawer.drawImage(g, boxBody,
player1X,
97, 39, 41, 4, 2, true);
isHit = true;
if ( (player1X + 34) >= player2X) {
hitedFlag = true;
//判断是当前用户击中对方
if (currentPlayer.equals("player1")) {
isCurrentUserHit = true;
}
}
}
//绘制player2
if (cmdInfo.substring(index2 + 1).equals("go")) {
ScreenDrawer.drawImage(g, enemy,
player2X,
97, width, height, widthIndex, heightIndex, true);
}
else if (cmdInfo.substring(index2 + 1).equals("hit")) {
ScreenDrawer.drawImage(g, enemy,
player2X-10,
97, 37, 41, 1,3, true);
isHit = true;
if ( (player1X + 34) >= player2X) {
//判断是当前用户击中对方
if (currentPlayer.equals("player2")) {
isCurrentUserHit = true;
}
hitedFlag = true;
}
}
//如果击中对方则绘制效果图片
if (hitedFlag) {
ScreenDrawer.drawImage(g, effect, (player2X - effect.getWidth() / 2),
102);
if (isCurrentUserHit) {
if (isPressedHitKey) {
sendCmd("info", "scope");
isPressedHitKey = false;
}
}
//播放击中音乐
soundPlayer.play("hited");
delay(50);
}
else if (isHit) {
delay(50);
sendCmd("info", "pause");
}
//显示玩家积分
drawScope(g,cmdInfo.substring(0, index2), cmdInfo.substring(index2 + 1),player1Scope, player2Scope);
if (player1Scope.equals("100") && currentPlayer.equals("player1")) {
showWinInfo(g, "你赢了!");
}
if (player1Scope.equals("100") && currentPlayer.equals("player2")) {
showFailureInfo(g, "你输了!");
}
if (player2Scope.equals("100") && currentPlayer.equals("player2")) {
showWinInfo(g, "你赢了!");
}
if (player2Scope.equals("100") && currentPlayer.equals("player1")) {
showFailureInfo(g, "你输了!");
}
//回收系统垃圾内存
System.gc();
}else {
//绘制标题
ScreenDrawer.drawImage(g, titleImage, (getWidth() - titleImage.getWidth()) / 2,
(getHeight()-titleImage.getHeight())/2);
}
}
//显示最终获胜信息
private void showWinInfo(Graphics g, String winString) {
ScreenDrawer.clearScreen(g, getWidth(), getHeight());
drawBackGround(g);
ScreenDrawer.drawString(g,
(getWidth() - winString.length() * Font.SIZE_LARGE) /
2, 80, winString);
ScreenDrawer.drawImage(g, winImage, (getWidth() - winImage.getWidth()) / 2,
100);
delay(3000);
reset();
}
//显示失败信息
private void showFailureInfo(Graphics g, String failureString) {
ScreenDrawer.clearScreen(g, getWidth(), getHeight());
drawBackGround(g);
ScreenDrawer.drawString(g,
(getWidth() - failureString.length() * Font.SIZE_LARGE) /
2, 80, failureString);
delay(3000);
reset();
}
//绘制积分
private void drawScope(Graphics g,String player1State,String player2State, String player1Scope, String player2Scope) {
if (!player1State.equals("null")) {
ScreenDrawer.drawString(g, 10, 80, "积分: " + player1Scope);
}
if (!player2State.equals("null")) {
ScreenDrawer.drawString(g, 140, 80, "积分: " + player2Scope);
}
}
//绘制背景
private void drawBackGround(Graphics g) {
if (backGround != null) {
ScreenDrawer.drawImage(g, backGround,
(getWidth() - backGround.getWidth()) / 2, 0);
ScreenDrawer.drawImage(g, backGround,
(getWidth() - backGround.getWidth()) / 2,
getHeight() - 12,
backGround.getWidth(), backGround.getHeight() - 12,
1, 2, true);
}
}
//延时方法
private void delay(int i) {
try {
Thread.sleep(i);
}
catch (InterruptedException ex) {
}
}
//UDP数据发送器
class UDPSender
implements java.lang.Runnable {
public UDPSender(String cmdType, String cmd) {
this.cmd = cmd;
this.cmdType = cmdType;
}
//UDP数据发送器线程主方法
public void run() {
if (cmdType.equals("info")) {
sendPlayerInfoToServer(currentPlayer + ":" + cmd);
}
else if (cmdType.equals("attend")) {
attend();
}
}
private String cmdType, cmd;
}
//处理按健事件
public void keyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);
//按下数字键1时我们认为是player前进命令,按下数字键3时我们认为是player搏击命令,
//按下数字键7时我们认为是player后退命令,按下数字键1时我们认为是player前进命令
if (gameAction == 9 && currentPlayer != null) {
go();
}
else if (gameAction == 10 && currentPlayer != null) {
//这里可以添加其它功能
hit();
}
else if (gameAction == 11) {
back();
}
}
//处理出击命令方法
private void hit() {
sendCmd("info", "hit");
isPressedHitKey = true;
//播放出击音乐
soundPlayer.play("hit");
}
//处理后退命令方法
private void back() {
sendCmd("info", "back");
}
//处理前进命令方法
private void go() {
sendCmd("info", "go");
}
//处理重置命令方法
private void reset() {
sendCmd("info", "reset");
}
private void logout () {
sendCmd("info", "logout");
}
//发送命令方法
private void sendCmd(String cmdType, String cmd) {
new java.lang.Thread(new UDPSender(cmdType, cmd)).start();
}
//加入游戏方法
private void attend() {
Datagram revData = null;
Datagram sendData = null;
String sendMsg = "attend";
try {
UDPDatagramConnection connection = (UDPDatagramConnection) Connector.open(
url);
sendData = connection.newDatagram(sendMsg.getBytes(), sendMsg.length());
connection.send(sendData);
revData = connection.newDatagram(connection.getMaximumLength());
connection.receive(revData);
currentPlayer = new String(revData.getData(), 0, revData.getLength());
connection.close();
repaint();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
//发送player信息给服务器
private void sendPlayerInfoToServer(String info) {
Datagram revData = null;
Datagram sendData = null;
try {
UDPDatagramConnection connection = (UDPDatagramConnection) Connector.open(
url);
sendData = connection.newDatagram(info.getBytes(), info.length());
connection.send(sendData);
connection.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
//处理命令事件方法
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
logout();
// 退出MIDlet
PlayerMIDlet.quitApp();
}//登录游戏
else if (command == attendGame) {
sendCmd("attend", "attend");
removeCommand(attendGame);
}
}
//UDP客户端监听器类,主要负责查询游戏服务器的当前状态信息
class UDPListener
implements java.lang.Runnable {
//UDP客户端监听器线程方法
public void run() {
while (true) {
try {
if (currentPlayer != null) {
listenGameServer();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
//监听游戏服务器方法
void listenGameServer() {
try {
Datagram revData = null;
Datagram sendData = null;
UDPDatagramConnection connection = (UDPDatagramConnection) Connector.
open(url);
String queryMsg = "query";
sendData = connection.newDatagram(queryMsg.getBytes(), queryMsg.length());
//发送查询命令给服务器端
connection.send(sendData);
revData = connection.newDatagram(connection.getMaximumLength());
//接受服务器端的状态信息
connection.receive(revData);
String revMsg = new String(revData.getData(), 0, revData.getLength());
playerInfo = revMsg;
connection.close();
repaint();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
//MIDlet实例对象
private PlayerMIDlet playerMIDlet = null;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -