C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\other.java |
import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; import java.util.*; public class other { //bao gồm tọa độ của other (x,y), khung hình hiện tại f, phía di chuyển k, step int x,y,f=0,k=1; //dùng Sprite để tạo hình ảnh nhân vật phụ Sprite other; //mốc thời gian lần di chuyển cuối và lần đổi hướng cuối. long lm,lc; //hình ảnh dùng tạo Sprite Image im; //biến ngẫu nhiên dùng để tạo hướng ngẫu nhiên. Random rd=new Random(); //hàm khởi tạo nhân các tham số hình ảnh và tọa độ ban đầu của other. public other(Image im,int x,int y){ this.x=x; this.y=y; this.im=im; other=new Sprite(im,16,16); other.setFrame(f); } //hàm paint dùng vẽ nhân vật other lên Graphics g. void paint(Graphics g,map m){ move(m); other.paint(g); } //hàm move nhân giá trị là biến map m, sử dụng để điều hướng nhân vật phụ. void move(map m){ //so sánh mốc chuyển hướng cuối cùng để cho cứ 1.5s thì chuyển hướng. if(lc<m.curr()-1500){ //với phép chia dư này, k chỉ nhận giá trị từ 1-4. k=Math.abs(rd.nextInt()%4)+1; lc=m.curr();} //so sánh với lần di chuyển cuối cùng, nếu cách 0.5s thì cho di chuyển. if(lm<m.curr()-200){ f=f%2==0?(k-1)*2+1:(k-1)*2; other.setFrame(f); switch(k){ case 1: y-=4; break; case 2: y+=4; break; case 3: x-=4; break; case 4: x+=4; break;} lm=m.curr(); } //tọa độ của nhân vật phụ được hình thành từ tọa độ của bản đồ và tọa độ của nhân vật phụ. other.setPosition(x+m.x,y+m.y); } }Và ta sẽ sử dụng hình ảnh này để tạo nhân vật phụ :
Ta sẽ thêm vào trong map.java để sử dụng nhân vật phụ này :
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java |
import java.io.*; import javax.microedition.lcdui.game.*; import javax.microedition.lcdui.*; public class map { //các thông số gồm có số cột, số hàng trong map, kích thước mỗi tile tw, th. //tọa độ map (x,y), phím bấm k, số lần di chuyển nhỏ. int mw,mh,tw,th,x,y,k,step=0; //chứa dữ liệu các tile trong map. byte[] map; //hình ảnh dùng làm tile Image tiles,other; //dùng class TiledLayer có sẵn trong GameCanvas để tạo map. TiledLayer tl; //mốc thời gian di chuyển lần cuối long lm=0; //thêm một biến other ot dùng làm nhân vật phụ. other ot; //hàm khởi tạo sẽ tải hình ảnh làm tile vào class map. public map(String im){ try{ this.tiles=Image.createImage("/"+im); }catch(Exception e){}} //hàm load dùng tải file nguồn và phân tích các thông số trong đó vào map. //bây giờ ta có thông số xác định tọa độ ban đầu nhân vật, tại cột c, dòng r và so sánh với độ dài rộng màn hình. public void load(String fn,int c,int r,int w,int h){ //file nguồn là dữ liệu với cấu trúc: [số cột]-[số hàng]-[tile width]-[tile height]-[dữ liệu map (số cột * số hàng)] try{ InputStream is=getClass().getResourceAsStream("/"+fn); mw=is.read(); mh=is.read(); tw=is.read(); th=is.read(); map=new byte[is.available()]; is.read(map); //tạo TiledLayer tl từ những gì đã nhận được. tl=new TiledLayer(mw,mh,tiles,tw,th); //lát gạch vào TiledLayer tl. for(int i=0;i<mh;i++){ for(int j=0;j<mw;j++){ tl.setCell(j, i, map[i*mw+j]); }} x=w/2-c*tw; y=h/2-r*th; //tạo file ảnh cho nhân vật phụ và khởi tạo ot ở vị trí cột 4 và hàng 6 trên map. other=Image.createImage("/other.png"); ot=new other(other,w/2-4*16,h/2-6*16); }catch(Exception e){}} //hàm paint dùng vẽ tl lên Graphics g, và nhận giá trị phím bấm vào hàm move. void paint(Graphics g,int k){ move(k); tl.paint(g); //vẽ nhân vật phụ lên map. ot.paint(g,this);} //hàm move nhận giá trị phím bấm k và kiểm tra điều kiện để thay đổi tọa độ của map. void move(int k){ //do mỗi lần di chuyển ta cho chuyển 16 pixel, nên ta cần chia ra 4 lần di chuyễn nhỏ để hình ảnh mượt hơn. //nếu thấy không cần bước di chuyển nhỏ nào nữa thì cho di gán di chuyển tiếp if(step==0){ this.k=k; step=4; }else{ //nếu còn lượt di chuyển nhỏ step!=0, thì xét đến thời gian di chuyển lần cuối. if(lm<=curr()-30){ step--; switch(this.k){ case -1: y+=th/4; break; case -2: y-=th/4; break; case -3: x+=tw/4; break; case -4: x-=tw/4; break;} lm=curr();} } //gán vị trí cho tl. tl.setPosition(x, y); } long curr(){return System.currentTimeMillis();} }Rồi vậy là xong, kết quả đây :
source jar
Không có nhận xét nào:
Đăng nhận xét