Chủ Nhật, 27 tháng 1, 2013

nhận thông tin từ những người chơi khác

Bài này sẽ là kết thúc của hướng dẫn về sự kết hợp giữa php và j2me, những ứng dụng trực tuyến ngày càng cho thấy hiệu quả của nó trong thời đại công nghệ thông tin. Bạn không thể nào thiếu internet trong một ngày và chiếc di động là thứ hỗ trợ đắc lực nhất, ứng dụng web luôn không làm cho người sử dụng phải nhàm chán vì tính mới mỗi ngày của nó. Tôi cũng kì vọng vào sức mạnh của di động như về j2me thì không còn nhiều nữa, ngày nay android và ios ngày càng chiếm lĩnh trên thị trường di động nhất là android. Có thể một ngày nào đó những bài viết này chỉ là vô ích, nhưng ít nhất là tôi đã viết nó, bằng những kiến thức của mình và hy vọng điều gì đó. Do form get.html và server.php mà tôi đã viết có sự lựa chọn để chỉ hiện thị thông tin về những người chơi khác chứ không cho phép lấy về thông tin của nhân vật của ta. Do đó, ít nhất bạn phải có thêm một ai đó nữa cùng đăng nhập vào một id khác thì các bạn mới nhìn thấy kết quả của việc nhận dữ liệu. Ta thêm một biến dt (String) nữa và sẽ nhận dữ liệu vào đây, đồng thời vẽ ra màn hình. Class canvas sẽ thành thế này: mog.java
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
    String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[] acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
    String[] info=tach(acommand[i],",");
    robot nrb=new robot(w/2,h/2);
    for(int j=0;j<rb.size();j++){
    if(info[0].equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
    System.out.println("dectect");}}
    nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}

public String[] tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[] rt=new String[v.size()];
v.copyInto((String[])rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i]+rt[i].length());}
return rt;}
}

class robot{
int x,y,nx,ny;
String say;
long lm=0;
public robot(int x,int y){
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[] s){
say=s[0];
nx=Integer.parseInt(s[1]);
ny=Integer.parseInt(s[2]);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
}

void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
Đồng thời mog.java cũng thay đổi như sau đây: mog.java
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
public class mog extends MIDlet implements Runnable{
    //tạo biến nhận giá trị của user và pass
    String user,pass;
    
    //id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
    int id,mode=0;
    canvas cv=new canvas();
public void startApp(){
    //chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok 
public void cv(String user,String pass){
    this.user=user;
    this.pass=pass;
    //hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
   String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
   //nếu như trả về dữ liệu khác null thì cho hiện canvas.
   id=Integer.parseInt(st.substring(3));
   if(id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
   new Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
    while(true){
        try{
            //cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
            Thread.sleep(500);
switch(mode){
    case 1:
break;
    case 2:
break;
    case 3:
        //thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
        send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
//cùng lúc gửi thông tin lên server, ta cho nhận dữ liệu về luôn một thể, submit=4 cùng với id
        cv.dt=send("http://holyeyed.99k.org/game/server.php","submit=4&id="+id);
        break;}}catch(Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type", 
           "application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
Kết quả ta được như sau:
Bây giờ ta sẽ chuyển dt (String) trong cv (canvas) thì mã lệnh dùng cho điều khiển các biến robot như ta đã làm lúc trước, dữ liệu nhận về như bạn thấy trên hình trên bao gồm: Mã BOM | id | user name | chuỗi | x | y # id | username | chuỗi | x |y #.... Class robot.java của ta sẽ thay đổi để nhận thêm nhiều giá trị hơn như sau: mog.java
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
class robot{
int x,y,nx,ny,id;
String say,user;
long lm=0;
//class robot bây giờ có 4 tham số khởi tạo: id, user, x ,y
public robot(int id,String user,int x,int y){
    this.id=id;
    this.user=user;
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[] s){
say=s[2];
nx=Integer.parseInt(s[3]);
ny=Integer.parseInt(s[4]);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
//vẽ thêm username cho dễ phân biệt
g.drawString(user,x,y-16,Graphics.TOP|Graphics.LEFT);
}

void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}

}
Trong canvas.java cũng có những thay đổi, cụ thể là ta tách việc [phân tích dữ liệu gửi về vào hàm khac(), và cho vào trong vòng lặp paint(g), như vậy sẽ làm cho mọi thứ trở nên liên tục hơn. Ta cũng cần chú ý, bây giờ khởi tạo biến robot phải cần tới 4 tham số, cho nhân vật của ta có id=0, user=”me”, x=0, y=0: mog.java
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
    String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,"me",0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
    //sử dụng hàm khác để phân tích thông tin gửi về.
    khac();
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;

//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}

public String[] tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[] rt=new String[v.size()];
v.copyInto((String[])rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i]+rt[i].length());}
return rt;}
//hàm này dùng chuyển nhanh chuỗi thành số nguyên.
int toint(String s){return Integer.parseInt(s);}
//ta thêm một hàm khac với việc phân tích dữ liệu nhận về và vẽ những thông tin đó ra
void khac(){
    //nếu như thông tin nhận về khác null, và dài hơn 3
    if(dt!=null&&dt.length()>3){
 //bỏ mã BOM, lấy từ kí tự thứ 3
command=dt.substring(3);
//tách ra thành những nhân vật khác nhau, cách nhau bằng dấu #
String[] acommand=tach(command,"#");
//tạo một Vector mới để nhận giá trị
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
    //tách thông tin cho mỗi nhân vật, cách nhau bằng dấu |
    String[] info=tach(acommand[i],"|");
    if(info!=null){
        //biến robot bây giờ có tới 4 tham số khởi tạo: id, user , x, y
    robot nrb=new robot(toint(info[0]),info[1],toint(info[3]),toint(info[4]));
    //kiểm tra nếu như mà có id nào trong Vector cũ thì dùng lại thông tin đó.
    for(int j=0;j<rb.size();j++){
        //ta so sánh id để chắc là duy nhất id đó đại diện cho người chơi đó
    if(Integer.parseInt(info[0])==(((robot)rb.elementAt(j)).id)){nrb=(robot)rb.elementAt(j);
    System.out.println("dectect");}}
    nrb.getcommand(info);
    //thêm vào Vector mới
trb.addElement((robot)nrb);}}
//cho Vector mới bằng Vector rb
rb=trb;}}
Như vậy là xong, rủ ai đó cùng test ứng dụng, bạn sẽ thấy mọi thứ hoạt động khá tốt. source project jar test

Không có nhận xét nào: