⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerscreen.java

📁 资源类别:Delphi控件所属子类:数据库相关 开发语言:Java 相关标签:网络 Java 格斗游戏 源码 详细描述: 一款JAVA网络格斗游戏
💻 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 + -