Hi, Khách!
![]() | ![]() ![]() ![]() ![]() |
phát hiện điểm chạm giữa nhân vật và map
như vậy là ta đã có nhân vật trong trò chơi và cũng đã có thể điều khiển được nhân vật như ta đã đươc biết, thế nhưng khi di chuyển các bạn sẽ thấy rằng nhân vật của bạn có thể di chuyển tự do trên map dù cứ như là ở trên một lớp khác vậy. đúng vậy bởi gì ta vẽ nhân vật và map trên hai lớp khác nhau nên giữa chúng chẳng có liên quan gì. bây giờ ta sẽ tạo ra sự liên hệ giữa chúng để khi nhân vật chạm phải chướng ngại thì không thể đi tiếp nữa.
để làm được như vậy ta gán thêm một tọa độ điểm(px,py) và xét vị trí của toa độ điểm này trên map.
giống như thế này
-khung màu đen là sprite còn khung màu xanh lam là giới hạn mà sprite có thể di chuyển
-khung lớn bên ngoài là map, những ô nhỏ hơn là những tile(viên gạch)
ta sẽ xét bốn điểm góc của sprite so với vị trí các tile nhỏ. từ việc xác định được điểm (px,py)tâm của sprite ta dễ dàng tính được tọa độ bốn góc của nó và từ đó xét vị trí của từng điểm góc so với map, nếu một trong các góc thuộc vào tile là cây hoặc là nhân vật tĩnh thì ta không cho tăng x,y nữa. việc tính xem một góc của sprite đang ở tile nào chỉ cần tìm dòng và cột mà điểm góc đó
hãy xem code map hoàn chỉnh sau để hiểu rõ hơn:
map.java
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private vd main;
private add sp=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t,ch;
private TiledLayer tl;
private int x=w/2,y=h/2,f=0,px,py;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this);
t.start();
}
public void run()
{
try{
ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++)
{
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map[i);
}
while(play)
{
input();
g.setColor(0x000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try
{
Thread.sleep(30);}catch(Exception e){}//cho ngưng một thời gian
}
}
void input(){
int k=getKeyStates();
px=-(x-w/2)+16;
py=-(y-h/2)+16;//px,py luôn đối số với x,y và chuyển về tâm nên cộng thêm 16
if(k==UP_PRESSED)
{
f=1;
if(collide(px,py-4)==0)
{
y+=4;
}}
if(k==LEFT_PRESSED)
{
f=2;
if(collide(px-4,py)==0)
{
x+=4;
}}
if(k==RIGHT_PRESSED)
{
f=3;
if(collide(px+4,py)==0)
{
x-=4;
}}
if(k==DOWN_PRESSED)
{
f=0;
if(collide(px,py+4)==0)
{
y-=4;
}}
}
int collide(int fx,int fy)
{
int collide=0;
for(int m=-16;m<16;m+=31)
{
for(int n=-16;n<16;n+=31)
{
int c=(fx+m)/32;
int r=(fy+n)/32;
if(map[r*10+c!=4)
{
collide++;
}//chỉ có tile 4 là di chuyển được
}}
return collide;
}}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private vd main;
private add sp=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t,ch;
private TiledLayer tl;
private int x=w/2,y=h/2,f=0,px,py;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this);
t.start();
}
public void run()
{
try{
ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++)
{
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map[i);
}
while(play)
{
input();
g.setColor(0x000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try
{
Thread.sleep(30);}catch(Exception e){}//cho ngưng một thời gian
}
}
void input(){
int k=getKeyStates();
px=-(x-w/2)+16;
py=-(y-h/2)+16;//px,py luôn đối số với x,y và chuyển về tâm nên cộng thêm 16
if(k==UP_PRESSED)
{
f=1;
if(collide(px,py-4)==0)
{
y+=4;
}}
if(k==LEFT_PRESSED)
{
f=2;
if(collide(px-4,py)==0)
{
x+=4;
}}
if(k==RIGHT_PRESSED)
{
f=3;
if(collide(px+4,py)==0)
{
x-=4;
}}
if(k==DOWN_PRESSED)
{
f=0;
if(collide(px,py+4)==0)
{
y-=4;
}}
}
int collide(int fx,int fy)
{
int collide=0;
for(int m=-16;m<16;m+=31)
{
for(int n=-16;n<16;n+=31)
{
int c=(fx+m)/32;
int r=(fy+n)/32;
if(map[r*10+c!=4)
{
collide++;
}//chỉ có tile 4 là di chuyển được
}}
return collide;
}}
?>
Copy code
Chỉnh sửa lúc 2016-07-10 20:03 bởi Pham_loi

Trực Tuyến:
Khách: 1