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. int mw,mh,tw,th; //chứa dữ liệu các tile trong map. byte[] map; //hình ảnh dùng làm tile Image tiles; //dùng class TiledLayer có sẵn trong GameCanvas để tạo map. TiledLayer tl; //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. public void load(String fn){ //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]); }} }catch(Exception e){}} //hàm paint dùng vẽ tl lên Graphics g, tại vị trí (x,y). void paint(Graphics g,int x,int y){ tl.setPosition(x, y); tl.paint(g);} }ở đây ta dùng file tiles.png này làm gạch lát:
Chúng ta sẽ sử dụng nó trong RPG.java như sau.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\RPG.java |
import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; public class RPG extends Canvas{ //các biến này bao gồm kích thước màn hình w,h, khung hiện tại hiện thị f, phím nhấn k int w,h,f=2,k; //biến thời gian ghi lại mốc thời gian di chuyển cuối cùng long lm=0; //nhân vật được tạo qua lớp Sprite là có sẵn trong GameCanvas Sprite nv; //hình ảnh sử dụng Image im; //tạo biến load map m, với hình ảnh là tiles.png . map m=new map("tiles.png"); public RPG(){ setFullScreenMode(true); w=getWidth(); h=getHeight(); try{ //tạo hình ảnh trước im=Image.createImage("/nv.png"); //tạo Sprite sau khi đã có hình ảnh, mỗi khung nhỏ là 16x16 nv=new Sprite(im,16,16);}catch(Exception e){} //load map m0.mbd vào biến map m. m.load("m0.mbd");} public void paint(Graphics g){ //lệnh tô màn hình g.setColor(0x6060a0); g.fillRect(0,0,w,h); //hàm xử lí di chuyển theo phím bấm move(); //vẽ map ở vị trí (0,0). m.paint(g,0,0); //vẽ nhân vật ra màn hình thông qua hàm paint có sẵn của lớp Sprite nv.paint(g); //cho vẽ lại repaint();} public void keyPressed(int k){this.k=k;} public void keyReleased(int k){this.k=0;} //hàm di chuyển sẽ xữ lí phím bấm k để xác định khung của nhân vật void move(){ //ở đây cho kiểm tra nếu lần di chuyển cuối cùng cách thời gian hiện tại 20 milli giây thì cho di chuyển tiếp. if(lm<curr()-20&&k!=0){ //công thức xử lí phím và khung hiện tại để cho ra khung ảnh phù hợp, bạn tự thế vào và xem nó có đúng không nhé. f=f%2==0?(-k-1)*2+1:(-k-1)*2; //sau khi di chuyển thì cho mốc thời gian lần cuối thay đổi. lm=curr(); } //đặt giá trị khung ảnh và vị trí nhân vật trên màn hình. nv.setFrame(f); nv.setPosition(w/2,h/2); } //hàm trả về thời gian hiện tại, do sử dụng nhiều lần nên làm riêng một hàm cho khõi phải mất công viết lại. long curr(){return System.currentTimeMillis();} }Và kết quả như sau :
source jar
Không có nhận xét nào:
Đăng nhận xét