📄 mapcanvas.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 + -