XtGem Forum catalog
logo

Chatbox|Admin nhận làm wap/web, giá cả thương lượng... Thông tin admin tại mỗi bài viết.
Home · Bang hội ·
* Đăng Nhập hoặc Đăng Kí
để sử dụng hết chức năng của diễn đàn.
Hi, Khách!
HomeBang hội » Thủ thuật » Nokia s40 » » Xem bài viết
Xuống dưới »
avatar by Pham_loi Pham_loi
Chức vụ:
16:42:13, 01-06-2016

Load map từ file nguồn
do bản đồ trong game RPG là rất rộng lớn cho nên ta sẽ không đặt map thông qua mảng trực tiếp mà sẽ tải dữ liệu từ file map, đó là file được tạo ra từ phần mềm http://www.mapeditor.org/ và được xử lí qua phần chuyển đổi http://holyeyed.99k.org/function/tombd.php để dễ sử dụng hơn. Và đây là file dùng để load map.mbd và sử dụng trong trò chơi. trước khi lưu file map trong phần mềm tiled map editor, bạn vào edit -> reference và thiết lặp như sau (store tile layer data as CSV):
img
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java
<?php
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.
    
bytemap;
    
//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(jimap[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(xy);
tl.paint(g);}
}
?>

Copy code

ở đây ta dùng file tiles.png này làm gạch lát:
img
Chúng ta sẽ sử dụng nó trong RPG.java như sau.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\RPG.java
<?php
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();}
}
?>

Copy code

Và kết quả như sau :
img


Source: RPG-20156.zip
Jar: RPG-00207.jar

Like: 0

Trực Tuyến: Khách: 1
Diễn đàn teen Việt Nam
CopyRight 2014