?? 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 + -