Thứ Hai, 28 tháng 1, 2013
Biết làm gì nữa bây giờ
Sắp tới tết rồi, chỉ còn có hơn mười ngày nữa. Năm nay tôi không có thời gian nghỉ tết dài nữa, tôi không có nhiều thời gian dành cho mình nữa, hay là tôi thấy thời gian là không đủ cho mình, tôi không biết.... Dù sao đi nữa thì sống và làm được những thứ mà mình muốn là tốt lắm rồi, sau này có nghĩ lại cũng chằng có gì phải hối tiếc. Điều mà tôi cảm thấy buồn nhất trong cuộc đời mình là tôi quá ích kỷ với chính bản thân mình, mọi người cũng nghĩ tôi như vậy. điều đó làm tôi thấy mình luôn cô đơn và không bao giờ thoát ra khỏi đó được.
Hãy nghĩ, có những thứ mình suy nghĩ như chẳng bao giờ lý giải được là vì lý do gì, giống như khi bạn nhìn vào bầu trời đêm và thấy đó là một thứ xa xôi vô tận vậy. Cảm nhận của con người cũng vậy thôi, đó là thứ không thể nào lý giải nỗi. tôi thật sự không muốn mình mãi đơn độc, nhưng vì một lý do gì đó tôi vẫn khép mình trong vòng tròn của mình. Sau này nếu có một thay đổi nào khác tôi cũng không nghĩ về thay đổi bản thân mình, và tôi thật sự không muốn đánh đổi cuộc sống hiện tại của mình chút nào, dù rằng tôi chỉ có một mình nhưng tôi không cảm thấy khó chịu nhiều.
Tôi thường hay tin tưởng vào những lời nói bâng quơ của những người xung quanh tôi, rồi cho đến khi tôi biết rằng những lời đó có thể chỉ là một lời trêu chọc không hơn không kém. Tôi cũng sợ khi có ai đó nói điều gì với mình và tôi không bao giờ còn trông mong chúng sẽ trở thành hiện thực nưa. Có bao giờ bạn nghĩ đến cảm giác chờ đợi về một điều gì mà không bao giờ tới. Tôi sợ mình sẽ làm điều tương tự, tôi không nói chắc những gì mà tôi sẽ làm, nếu như không làm được hay là tôi quên đi thì thật là một điều thất vọng.
Tôi chỉ nhớ tới mà có thể là ai cũng nhớ tới những thứ làm cho mình cảm thấy khó chịu, không hoặc ít khi nghĩ tới những việc mình làm cho người khác khó chịu. dù sao thì cuối cùng, sẽ có ngày ta cũng nhớ tới tất cả, mong là không quá muộn để làm điều đó cuối cùng.
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
mog.java
mog.java
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:
| 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:
| 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:
| 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
Thứ Bảy, 12 tháng 1, 2013
Gửi thông tin đến server theo từng đợt
Bài trước chúng ta đã có thể đăng nhập vào một hệ thống thành viên đơn giản, code trước tôi cũng đã post hết mã source của server. Chúng ta ở bài này sẽ sử dụng form send.html và gửi thông tin đến server thông qua form này.
Nhưng đầu tiên chúng ta cần tạo ra một nhân vật của mình, tôi cũng sử dụng class robot để tạo nhân vật, nhưng chúng ta sẽ trực tiếp điều khiển nó thông qua phím chứ không phải là mã lệnh nữa. class canvas của chúng ta sẽ thành như thế này:
mog.java
mog.java
http://holyeyed.99k.org/function/up/mog-57614.jar
| C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java |
class canvas extends Canvas{ 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); 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;} }Xong bây giờ thì chỉnh sửa một chút ở file mog.java để gửi thông tin lên server thông qua hàm send mà ta đã biết. địa chỉ vẫn là địa chỉ cũ, còn thông số thì có thay khác theo form send.html chúng ta đã biết (nghiên cứu html nhé).
| 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); 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;}}Vậy thôi, dù bạn có chạy chương trình thì chỉ có thể thấy là điều khiển được nhân vật hình vuông thôi, chứ không biết nó có gửi thông tin đúng lên server hay không. Nhưng đừng lo, theo lý thuyết là vậy và bạn sẽ biết được là nó có thật sự gửi được hay không thì chờ bài sau nhé. http://holyeyed.99k.org/function/up/mog-84566.zip
http://holyeyed.99k.org/function/up/mog-57614.jar
một form login đơn giản
có vẻ như bài này không có liên quan gì đến bài trước cả, và cũng đừng có nghĩ là tôi đang chuyển qua nói về lập trình web. Chỉ là có những thứ cần thiết cho quá trình lập trình mà chúng ta cần biết.
Chúng ta sẽ có một trang như thế này, code của nó tôi sẽ post cuối bài:
http://holyeyed.99k.org/game/reg.html
http://holyeyed.99k.org/game/login.html
http://holyeyed.99k.org/game/get.html
http://holyeyed.99k.org/game/send.html
trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé.
bây giờ chúng ta hãy chú ý tới midlet của chúng ta. trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé. File mog.java của chúng ta sẽ như thế này:
mog.java
login.java
http://holyeyed.99k.org/function/up/mog-38525.jar
source html
| C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java |
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; import java.io.*; import javax.microedition.io.*; 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; 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); if(st!=null) Display.getDisplay(this).setCurrent(new canvas());} public void run(){ switch(mode){ case 1: break; case 2: break;}} //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;}}Đó là trong mog.java, còn một file nữa đó là login.java, đây là class mở rộng từ Form và được tạo dựng sẵn có các field và command theo ý mình, khi sử dụng chỉ cần cho khởi tạo và hiện thị, như các bạn thấy ở trong class mog ở trên:
| C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\login.java |
import javax.microedition.lcdui.*; //class login là một Form được tạo dựng sẵn public class login extends Form implements CommandListener { //nó chứa 2 textfield và một command TextField user=new TextField("use","",15,0); TextField pass=new TextField("pass","",15,TextField.PASSWORD); Command ok=new Command("ok",Command.OK,2); mog m; public login(mog m){ //do mở rộng từ Form nên khi khởi tạo phải cho nó tiêu đề qua hàm super super("đăng nhập"); this.m=m; //thêm và các field và command append(user); append(pass); addCommand(ok); setCommandListener(this);} public void commandAction(Command c,Displayable d){ //khi nhấn phím ok thì nó sẽ chạy hàm cv trong class mog.java và nhận các giá trị từ các field if(c==ok){m.cv(user.getString(),pass.getString());}} }• Do càng về sau bài càng phức tạp nên tôi sẽ nói ít thôi, hãy đọc là chính và rồi sẽ hiểu. • Như trên là chúng ta đã tạo ra một ứng dụng login đơn giản với việc đăng kí trên server rồi. http://holyeyed.99k.org/function/up/mog-74430.zip
http://holyeyed.99k.org/function/up/mog-38525.jar
source html
Thứ Bảy, 29 tháng 12, 2012
Chúng ta không chỉ có một mình
Hôm trước đã nói tới chuyện thông qua command mà điểu khiển một biến robot rồi, hôm nay cũng với command và robot này nhưng chúng ta không chỉ điều khiển một mà là nhiều. tức là khi viết lệnh chúng ta viết cho nhiều robot và với phân cách là dấu chấm (.) có bao nhiêu lệnh thì có bấy nhiêu biến robot được vẽ trên màn hình. Hãy xét một lệnh tổng hợp ví dụ như sau:
1 robot: string,x,y
Nhiều robot: string1,x1,y1.srting,x2,y2.string3,x3,y3.(string_n,x_n,y_n)
Giả sử ta có lệnh tổng hợp sau:
Abc,10,50.bcd,30,100.def,120,5 vậy là ta có 3 biến robot được tạo ra và màn hình sẽ thực hiện việc vẽ 3 biến này lên màn hình.
Để làm như vậy, bây giờ ta sẽ sử dụng biến rb là một Vector của lớp robot
Ta đặt: Vector rb;
Chưa vội gán giá trị cho nó bao nhiêu đối tượng mà ta sẽ phân tích từ lệnh.
Lớp canvas.java sẽ như thế này:
mog.java
mog.java
| C:\Users\WIN7\Documents\NetBeansProjects\mog\src\mog.java |
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; public class mog extends MIDlet { public void startApp(){ Display.getDisplay(this).setCurrent(new canvas());} public void destroyApp(boolean t){} public void pauseApp(){}} class canvas extends Canvas{ textfield tf; Vector rb=new Vector(); Font f=Font.getFont(0,0,8); int w,h,k=0,fh; String command=""; 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); if(rb!=null) for(int i=0;i<rb.size();i++) ((robot)rb.elementAt(i)).paint(g); k=0; repaint(); } public void keyPressed(int k){ this.k=k; if(k==-5){ command=tf.getString(); String[] acommand=tach(command,"."); for(int i=0;i<acommand.length;i++){ robot nrb=new robot(w/2,h/2); nrb.getcommand(tach(acommand[i],",")); rb.addElement((robot)nrb);}}} 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);} }• Như chúng ta thấy đó, sau khi ta nhấn phím 5, lệnh sẽ được lấy ra từ textfield (tf) và phân tích thành mảng của các lệnh con qua String[] acommand=tach(command,"."); • Và sau đó lại được phân tích và gán vào biến robot bình thường. for(int i=0;i
| C:\Users\WIN7\Documents\NetBeansProjects\mog\src\mog.java |
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;}} }• Lúc này ta cần tạo thêm một biến trb dùng để tạo một vùng thêm các biến robot vào và so sánh với biến rb cũ, nếu không làm như vậy mà thêm trực tiếp vào biến cũ ta sẽ không thể nào kiểm soát được các đối tượng mà ta đã ra lệnh trước đó. • Bài này vậy là xong, nếu đến đây các bạn vẫn chưa hiểu được là ta đang làm cái gì thì bài sau các bạn sẽ rõ. Đây không phải chỉ là chuyện rèn kỹ năng giải thuật mà nó phải có sử dụng thực tế. http://holyeyed.99k.org/function/up/mog-72176.zip
Chủ Nhật, 16 tháng 12, 2012
Đi lệch quỹ đạo
một lập trình viên thường không thể nào kiểm soát hết mọi trường hợp có thể xảy ra trong thực tế, dù rằng đó là ứng dụng do chính họ tạo ra. một thế giới nhỏ bé cũng có những sự cố của chính nó, tôi cũng gặp nhiều những sự cố như vậy, tôi cố gắng sửa chữa chúng nhưng dường như cứ để như vậy thì lại hay hơn. mình có thề sửa cái này vì nó ngay trước mặt mình nhưng còn những thứ không bao giờ hiện ra ngay trước mắt. tôi không biết mình có đi lệch quỹ đạo hay không và thật sự đâu là quĩ đạo của chính tôi. dù sao thì tôi cũng sống cho chính bản thân mình và không chịu sự điều khiển của ai cả, nếu như tôi không còn là tôi của những ngày ban đầu thì tôi vẫn đi trong chính con đường của mình chứ không ai khác. trong những gì mà ta đầu tư cũng có thể bỏ đi hết, nếu tự nhiên có thứ gì đó thu hút ta hơn.
tôi thường xem việc lập trình hoặc là viết bài hướng dẫn như là một sự giải thoát khỏi sự chán nản của cuộc sống nhưng thỉnh thoảng cái cô độc vẫn ám ảnh tôi nhiều hơn. và bây giờ tôi muốn nói gì đó cho nó khuây khỏa, muốn quên đi những thứ mà tôi chưa kịp hoàn thành. bế tắc trong bất cứ chuyện gì cũng không có nghĩa lí gì hết nếu như có một cái gì đó cho ta nhìn ra ngoài.
hãy thử tưởng tượng khi bạn đang cố gắng suy nghĩ về cuộc đời mình rồi sẽ ra sao và có một người đến nói với bạn rằng hãy đi chơi với họ thì bạn sẽ nghĩ sao. tự nhiên ta sẽ quên hết mọi thứ đang dang dở và hào hứng đến với họ hơn là việc ta đang làm. tôi không biết, thường thì tôi sẽ làm vậy, và ngay cả trong việc viết hướng dẫn như thế này tôi cũng không muốn bó buộc vào điều gì hết, đừng phiền lòng nếu như bài biết này làm phí thời gian của bạn, vì nó là những gì mà tôi thấy là có ý nghĩa với một vài người và ít nhất là đối với tôi.
nhiều khi nằm trên giường và nhìn ra ngoài cửa sổ tôi lại thấy nó như hấp dẫn tôi rất nhiều, tôi thích nhìn chỉ một góc như vậy và suy nghĩ xem những phần còn lại của thế giới đang diễn ra như thế nào. hay chuyện vào một thời gian nào đó bạn nghĩ về một người bạn của mình hiện giờ đang làm gì và như thế nào, có những chuyện gì làm cho họ buồn hay vui và họ có nhớ tới bạn không. thật sự là ta có thể nghĩ đến hàng vô số những chuyện xảy ra trên thế giới này và mọi thứ điều tuyệt diệu.
"hãy thử nhìn xung quanh và nghĩ xem điều gì đang diễn ra ở đó"
điều khiển nhân vật thông qua lệnh
Bài trước đã hướng dẫn cách viết một class textfield hiển thị và nhập trên Canvas, bài này sẽ sử dụng đến textfield đó để làm vài thứ:
Đầu tiên chúng ta sẽ tạo một class nhận giá trị là một chuổi và sau đó là phân tích chuỗi đó để thực hiện những lệnh mà ta muốn, lệnh ở đây bao gồm (chuỗi,tọa độ x, tọa độ y) và sau khi nhận chuỗi này nó sẽ tự cập nhật thông tin vào trong các biến của nó, ta viết như sau:
NewClass.java
NewClass.java
| C:\Users\WIN7\Documents\NetBeansProjects\textfield\src\NewClass.java |
import javax.microedition.lcdui.*; import java.util.*; class canvas extends Canvas{ textfield tf; //robot là một đối tượng nhận lệnh và điều khiển bởi lệnh robot rb; Font f=Font.getFont(0,0,8); int w,h,k=0,fh; String command=""; public canvas(){ setFullScreenMode(true); w=getWidth(); h=getHeight(); fh=f.getHeight(); tf=new textfield("command",0,0,w); rb=new robot(w/2,h/2); } public void paint(Graphics g){ g.setFont(f); g.setColor(0); g.fillRect(0,0,w,h); //vẽ hộp nhập văn bản lên canvas tf.paint(g,k,true); g.setColor(0xf0f0); g.setClip(0,0,w,h); //vẽ chuỗi lệnh ra màn hình g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT); //vẽ đối tượng nhận lệnh ra màn hình rb.paint(g); k=0; repaint(); } public void keyPressed(int k){ this.k=k; //nếu nhấn mã -5 (phím ok) thì cho command nhận giá trị của textfield (tf), if(k==-5){ command=tf.getString(); //sau đó truyền tham số vào trong đối tượng hoạt động robot(rb), trước đó ta cho nó tách thành từng phần qua method tach trước, cách nhau bởi dấu phẩy (có dạng: say,x,y) rb.getcommand(tach(command,","));}} public void keyReleased(int k){this.k=0;} //chức năng tách chuỗi ra thành từng phần 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;} }Lớp robot là một dạng như sau, nó sẽ nhận các giá trị lệnh và xử lí để hoạt động theo lệnh đó:
| C:\Users\WIN7\Documents\NetBeansProjects\textfield\src\NewClass.java |
class robot{ int x,y,nx,ny; String say; long lm=0; //hàm khởi tạo robot nhận 2 giá trị x, y là tọa độ đầu tiên của nó public robot(int x,int y){ this.x=x; this.y=y; this.nx=x; this.ny=y; } //hàm getcommand này nhận một mảng chuỗi bao gồm các giá trị truyền vào say, nx, ny public void getcommand(String[] s){ say=s[0]; nx=Integer.parseInt(s[1]); ny=Integer.parseInt(s[2]); } //hàm paint sẽ vẽ đối tượng này lên Graphics của canvas, đồng thời cũng di chuyển nó thông qua hàm move public void paint(Graphics g){ //cũng cần phải cho nghỉ một khoảng thời gian để nó không di chuyển quá nhanh mà ta không kịp theo dõi if(System.currentTimeMillis()-lm>200) move(); g.setColor(0xf000f0); g.fillRect(x,y,16,16); } //hàm move này so sánh giá trị tọa độ x,y với nx,ny để từ đó tính toán và thay đổi giá trị của x,y cho đến khi bằng nx,ny void move(){ //so sánh x và nx nếu như x lớn hơn nx thì cho x trừ đi 1, nếu x bằng nx thì không thay đổi x, ngược lại thì cho x tăng lên 1 khi x nhỏ hơn nx x+=x>nx?-1:(x==nx?0:1); //tương tự với y và ny y+=y>ny?-1:(y==ny?0:1);} }Xong như vậy là chúng ta đã hoàn thành rồi, chỉ cần ghép nó vào MIDlet nữa là thấy: http://holyeyed.99k.org/function/up/mog-25113.zip http://holyeyed.99k.org/function/up/mog-97485.jar
Đăng ký:
Bài đăng (Atom)