Chủ Nhật, 16 tháng 12, 2012

đ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
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 đó: NewClass.java
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 nhận xét