Pham_loi
Chức vụ: 08:48:44, 29-07-2015 |
load map từ file nguồn– function class
để có thể dễ dàng hành động và quản lí các máp hơn ta sẽ sử dụng một class tự tạo, va chức năng của nó là tổng hợp một map từ một text file và một hình ảnh nguồn làm gạch.
tôi sử dụng phần mềm tiled-qt để vẽ map cho nên tôi chỉ viết code để chuyển file map mà nó tạo ra thành nguồn mà tôi có thể sử dụng:
các bạn có thể down tiled-qt tại đây
tiled-qt-0.5.1-win32.zip
nội dung của đoạn code như sau:
tomap.java
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class tomap
{
TiledLayer totile(String fn,String im)
{
int lw,lh,tw,th;
Image img=null;
InputStream is=getClass().getResourceAsStream(fn);
try{ lw=is.read();
lh=(int)is.read();
tw=(int)is.read();
th=(int)is.read();
try{img=Image.createImage(im);}catch(Exception e){}
TiledLayer tl=new TiledLayer(lw,lh,img,tw,th);
for(int i=0;i<lw*lh;i++){
int c=i%lw;
int r=(i-c)/lh;
tl.setCell(c,r,is.read());}
img=null;
return tl;
}catch(Exception e){return null;}
}
}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class tomap
{
TiledLayer totile(String fn,String im)
{
int lw,lh,tw,th;
Image img=null;
InputStream is=getClass().getResourceAsStream(fn);
try{ lw=is.read();
lh=(int)is.read();
tw=(int)is.read();
th=(int)is.read();
try{img=Image.createImage(im);}catch(Exception e){}
TiledLayer tl=new TiledLayer(lw,lh,img,tw,th);
for(int i=0;i<lw*lh;i++){
int c=i%lw;
int r=(i-c)/lh;
tl.setCell(c,r,is.read());}
img=null;
return tl;
}catch(Exception e){return null;}
}
}
?>
Copy code
khi sử dụng đơn giản ta chỉ cần gọi một biến với kiểu là tên class này(tomap) sau đó cho thực hiện function totile(tên txt file,ten ảnh nguồn)
như ví dụ sau:
map.tmx
ví dụ đây là file map do tiled-qt tạo ra:map.tmx
các bạn vào trang http://holyeyed.99k.org/function/tombd.php để chuyển lấy file map cho class trên có thể đọc được
n.mbd
và đây là file sau khi chuyển:n.mbd
ví dụ ta load map trên trong file map.java của vd project như sau:
map.java
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class map extends GameCanvas implements Runnable
{
TiledLayer m;
tomap cm=new tomap();
add nv=new add();
private vd main;
private Graphics g=getGraphics();
private boolean play=true,say=false;
private int map=0,f=0,x=0,y=0,sx,sy;
String[ mname={"n.mbd"};
int w=getWidth();
int h=getHeight();
public map(vd main){
super(false);
this.main=main;
}
void start(){
setFullScreenMode(true);
play=true;
Thread t=new Thread(this);
t.start();}
public void run(){
//int i=0,j=0;
switch(map)
{
case 0:
{
g.setColor(0x0);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0xa09040);
g.drawString("please wait…",w/2,h/2,g.HCENTER|g.BASELINE);
flushGraphics();
m=cm.totile(mname[map,"/t.png");
}
break;
case 2:
{}//do something for another map
break;
case 3:
{}// do another map
break;
}
while(play){
g.setColor(0x0);
g.fillRect(0,0,getWidth(),getHeight());
input();
m.setPosition(x,y);
m.paint(g);g.fillRect(0,0,60,40);
g.setColor(0xdd0000);
g.drawString(x+" "+y,0,0,g.TOP|g.LEFT);
nv.addsprite(g,"/s.png",f,(w-32)/2,(h-32)/2,32,32);
flushGraphics();
}
}
void input()
{int k=getKeyStates();
switch(k){
case 64:
y-=4;
break;
case 2:
y+=4;
break;
case 32:
x-=4;
break;
case 4:
x+=4;
break;
case 256:
{play=false;
main.destroyApp(true);}
break; }
}
}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class map extends GameCanvas implements Runnable
{
TiledLayer m;
tomap cm=new tomap();
add nv=new add();
private vd main;
private Graphics g=getGraphics();
private boolean play=true,say=false;
private int map=0,f=0,x=0,y=0,sx,sy;
String[ mname={"n.mbd"};
int w=getWidth();
int h=getHeight();
public map(vd main){
super(false);
this.main=main;
}
void start(){
setFullScreenMode(true);
play=true;
Thread t=new Thread(this);
t.start();}
public void run(){
//int i=0,j=0;
switch(map)
{
case 0:
{
g.setColor(0x0);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0xa09040);
g.drawString("please wait…",w/2,h/2,g.HCENTER|g.BASELINE);
flushGraphics();
m=cm.totile(mname[map,"/t.png");
}
break;
case 2:
{}//do something for another map
break;
case 3:
{}// do another map
break;
}
while(play){
g.setColor(0x0);
g.fillRect(0,0,getWidth(),getHeight());
input();
m.setPosition(x,y);
m.paint(g);g.fillRect(0,0,60,40);
g.setColor(0xdd0000);
g.drawString(x+" "+y,0,0,g.TOP|g.LEFT);
nv.addsprite(g,"/s.png",f,(w-32)/2,(h-32)/2,32,32);
flushGraphics();
}
}
void input()
{int k=getKeyStates();
switch(k){
case 64:
y-=4;
break;
case 2:
y+=4;
break;
case 32:
x-=4;
break;
case 4:
x+=4;
break;
case 256:
{play=false;
main.destroyApp(true);}
break; }
}
}
?>
Copy code
. trong trường hợp này, nếu bạn muốn xét điểm chạm giữa nhân vật và map thì không dùng cách của bài trước nữa, bởi vì ở đây không tồn tại một array bản đồ cho bạn xét. thế nhưng trên tiledllayer cung cấp một function giúp bạn có thể phát hiện xem một tọa độ điểm đang nằm trên tile nào.
[bint tl.getCell(col, row);[\b
như vậy chỉ cần có tọa độ của nhân vật là bạn có thể dễ dàng xét xem nó đang thuộc tile nào mà xét điểm chạm.
[download
đây là link tilededitor
http://sourceforge.net/projects/tiled/files/tiled-qt/0.7.1/tiled-0.7.1-win32-setup.exe
cách sử dụng:
bạn tạo một file mới điền các thông số của map
vào edit, preference , chọn save data là CSV, bỏ chọn include dtd referens in saved maps
vào map, new tiledset để chọn ảnh làm gạch cho map mới .
sau đó thì upload file map lên trang này để đổi lấy file .mbd
Chỉnh sửa lúc 2016-07-09 14:26 bởi Pham_loi
: 0 ♥
Trực Tuyến:
Khách: 1