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

📄 mapcanvas.java

📁 It is a MMORPG multithreading server. It can connect many clients using Java Connection socket.
💻 JAVA
字号:
package MMORPG;

import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.util.*;
import java.io.*;

public class MapCanvas extends Canvas implements CommandListener ,Runnable
{
  private Command inputCommand = new Command("Msg", Command.SCREEN, 1);
  private Command exitCommand = new Command("Exit", Command.SCREEN, 2);
  private Client m_client;
  private Image map;
  private Image bg;
  private Image m_char;
  private String m_msg;
  private Graphics bgGraphics;
  private int mapHeight = 16;
  private int mapWidth = 16;
  private int status = 0;
  private int effectstatus = 0; // 0 normal , 1 effect
  private Character player;
  private Vector playerlist = new Vector();

  private int [][] mapArr={{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,2,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,1,0,0,0,1,1,1,1,1},
							{1,1,1,1,1,0,1,1,1,1,1,1},
							{1,1,1,1,1,0,0,0,0,0,0,0},
							{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,1,1,1,1,1,1,1,1,1}
  };

  private int [][] mapInfoArr={{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,-1,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,0,0,0,0,0,1,1,1,1},
							{1,1,1,1,0,0,0,1,1,1,1,1},
							{1,1,1,1,1,0,1,1,1,1,1,1},
							{1,1,1,1,1,0,0,0,0,0,0,-2},
							{1,1,1,1,1,1,1,1,1,1,1,1},
							{1,1,1,1,1,1,1,1,1,1,1,1}
  };

  private int row = 12;
  private int col = 12;
  private boolean keydown[];
  private long systemTime;
  private SocketConnection conn;
  private InputStream is;
  private OutputStream os;
  private SendData sendData;
  private RecvData recvData;


  public MapCanvas(Client c ,String tname) {
    systemTime = System.currentTimeMillis();
    keydown = new boolean[4];
    for (int i=0;i<4;i++)
      keydown[i]=false;

    try {
		player = new Character();
		player.SetName(tname);
		map = Image.createImage("/map1.png");
        bg = Image.createImage(getWidth(),getHeight());
		m_char = Image.createImage("/char2.png");
        bgGraphics = bg.getGraphics();
		m_msg = "";
//		conn = (SocketConnection)Connector.open("socket://localhost:4444");
//		is = conn.openInputStream();
//		os = conn.openOutputStream();
//		Character p = new Character();
//		p.SetName("chris");
//		playerlist.addElement(p);
    }
    catch (IOException ex) {
      System.out.println(ex);
    }

	m_client = c;
	this.addCommand(inputCommand);
	this.addCommand(exitCommand);
	this.setCommandListener(this); 
  }

  protected void paint(Graphics g){
	  bgGraphics.setColor(255,255,255);
	  bgGraphics.fillRect(0,0,getWidth(),getHeight());
	  DrawMap(bgGraphics);
	  DrawChar(bgGraphics);
	  DrawMsgBox(bgGraphics);
	  DrawEffect(bgGraphics);
//	  bgGraphics.drawImage(m_char,0,0,(Graphics.TOP | Graphics.LEFT));
	  g.drawImage(bg,0,0,(Graphics.TOP | Graphics.LEFT));
  }

  protected void DrawMsgBox(Graphics g)
  {
	  g.setColor(0,0,0);
	  g.fillRect(0,getHeight()-20,getWidth(),20);
	  g.setColor(255,255,255);
	  g.drawString(m_msg,0,getHeight()-20,(Graphics.TOP | Graphics.LEFT));
  }

  protected void DrawFrame(Graphics g, Image img, int frame, int tilewidth, int tileheight, int x, int y)
  {
    g.setClip(x, y, tilewidth, tileheight);
    g.drawImage(img, x-(tilewidth*frame), y,(Graphics.TOP | Graphics.LEFT));
    g.setClip(0,0,getWidth(), getHeight());
  }

  protected void DrawMap(Graphics g)
  {
	for (int i=0;i<row; i++)
	{
		for (int j=0;j<col; j++)
		{
			DrawFrame(g, map, mapArr[i][j], mapWidth, mapHeight, j*mapWidth, i*mapHeight);
		}
	}
  }

  protected void DrawChar(Graphics g)
  {
		int posx=player.GetPosX()*mapWidth+(mapWidth/2)-12;
		int posy=player.GetPosY()*mapHeight+(mapHeight/2)-24;
		DrawFrame(g, m_char, player.GetFrameNo(), 24, 30, posx, posy);
	    g.setColor(0,0,0);
  	    g.drawString(player.GetName(),posx+12,posy+30,(Graphics.TOP | Graphics.HCENTER));
		for (int i=0;i<playerlist.size();i++)
		{
			Character p = (Character)playerlist.elementAt(i);
			posx=p.GetPosX()*mapWidth+(mapWidth/2)-12;
			posy=p.GetPosY()*mapHeight+(mapHeight/2)-24;

			DrawFrame(g, m_char, p.GetFrameNo(), 24, 30, posx, posy);
			g.setColor(0,0,0);
			g.drawString(p.GetName(),posx+12,posy+30,(Graphics.TOP | Graphics.HCENTER));
		}
  }

  protected void DrawEffect(Graphics g)
  {
	  if (status == 1)
	  {
//		  effectstatus++;
		  for (int i=0; i<40 ; i++)
		  {
			  g.setColor(0,0,0);
			  g.fillRect(0, i*5 ,getWidth(),effectstatus);
		  }
	  }
  }

   public void commandAction(Command c, Displayable s) {
		if (c == exitCommand) {
            m_client.quit();
        }
		else if (c == inputCommand)
		{
			m_client.InputMsg();
		}
  }

  public void SetMessage(String msg)
  {
//	  m_msg = player.GetName()+": "+msg;
	  sendData.DataAccess(Protocol.SEND_CHAT+msg);
  }
  
  public void SendPos()
  {
  	String msg = "";
  	if (player.GetPosX()<10)
  	{
  		msg = "0"+player.GetPosX();
  	}
  	else 
  	{
  		msg = ""+player.GetPosX();
  	}

  	if (player.GetPosY()<10)
  	{
  		msg = msg+ "0"+player.GetPosY();
  	}
  	else 
  	{
  		msg = msg+ player.GetPosY();
  	}

	msg = msg+ player.GetDir();

	  sendData.DataAccess(Protocol.SEND_POSITION+msg);
  }

  protected boolean IsBlock(int x, int y, int dir)
  {
		if (dir == 0)
			y++;
		else if (dir == 1)
				x--;
		else if (dir == 2)
				y--;
		else if (dir == 3)
				x++;

		if (mapInfoArr[y][x]==-2)
		{
			status=1;
		}

		if (mapInfoArr[y][x]>0)
			return true;
		else 
			return false;
  }


  protected void GameUpdate()
  {
      long now = System.currentTimeMillis();

	  if (now - systemTime > 100)
	  {
		    systemTime = now;
			if (status == 0)
			{
				for (int i=0; i<4;i++ )
				{
					if (keydown[i])
					{
					  player.ChangeDir(i);
					  if (!IsBlock(player.GetPosX(),player.GetPosY(),i))
					  {
						  player.MoveForward();
						  SendPos();
					  }
					}
				}
				player.Animated();
				for (int i=0;i<playerlist.size();i++)
				{
					Character p = (Character)playerlist.elementAt(i);
					p.Animated();
				}
			}
			if (status ==1)
			{
				effectstatus++;
				if (effectstatus > 5)
				{
					effectstatus = 5;
				}
			}

			if (recvData.DataAccess(null))
			{
				NetworkUpdate(recvData.data);
			}
	  }
  }

  private void NetworkUpdate(String s)
  {
	  if (s.substring(0,1).equals(Protocol.RECV_CHAT))
	  {
		  m_msg = s.substring(1,s.length());
	  }
	  else if (s.substring(0,1).equals(Protocol.RECV_USERNAME))
	  {
		Character p = new Character();
		p.SetName(s.substring(1,s.length()-1));
		playerlist.addElement(p);
	  }
	  else if (s.substring(0,1).equals(Protocol.RECV_POSITION))
	  {
	  	System.out.println("walker"+s.substring(6,s.length()-1));
		for (int i=0;i<playerlist.size();i++)
		{
			Character p = (Character)playerlist.elementAt(i);
			String name = p.GetName();
			if (name.equals(s.substring(6,s.length()-1)))
			{
				int x = Integer.parseInt(s.substring(1,3));
				int y = Integer.parseInt(s.substring(3,5));
				int dir = Integer.parseInt(s.substring(5,6));
				System.out.println("Recv x"+x+"y"+y+"dir"+dir);
				p.MoveTo(x,y);
				p.ChangeDir(dir);
			}
		}
	  	
	  }
  }

  protected void keyPressed(int keyCode)
  {
        int gameAction = getGameAction(keyCode);
        switch (gameAction) {
          case RIGHT:
            keydown[3] = true;
            break;
          case LEFT:
            keydown[1] = true;
            break;
          case UP:
            keydown[2] = true;
            break;
          case DOWN:
            keydown[0] = true;
            break;
          case FIRE:
/*            if (gamestate == 8)
               gamestate =1;
            else
            if (gamestate == 1)
              gamestate =8;
*/            break;
        }
  }

  protected void keyReleased(int keyCode)
  {
        int gameAction = getGameAction(keyCode);
        switch (gameAction) {
          case RIGHT:
            keydown[3] = false;
            break;
          case LEFT:
            keydown[1] = false;
            break;
          case UP:
            keydown[2] = false;
            break;
          case DOWN:
            keydown[0] = false;
            break;
        }
  }


  public void run() {
	OpenConnection();
    while(true)
    {
		try {
		Thread.sleep(50);
		} catch (Exception ex) {
		}
	  GameUpdate();
      repaint();
    }
  }

  protected void OpenConnection()
  {
        try {
		conn = (SocketConnection)Connector.open("socket://localhost:4444");
		is = conn.openInputStream();
		os = conn.openOutputStream();
		sendData = new SendData(os);
		SendLogin();
		recvData = new RecvData(is);
		}catch (ConnectionNotFoundException cnfe) {
			System.out.println("connection fail");
        } catch (IOException ioe) {
                ioe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
  }

  protected void SendLogin()
  {
      StringBuffer sb = new StringBuffer();
	  sb.append(Protocol.SEND_USERNAME);
	  sb.append(player.GetName());
	  System.out.println("send"+sb.toString());
	  sendData.DataAccess(sb.toString());
  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -