Thứ Năm, 21 tháng 3, 2013

A new World

Dù cho bản đồ của mình có rộng lớn đến đâu chăng nữa thì cũng không thể nào chỉ đi trong đó cho đến hết trò chơi. Bây giờ chúng ta cần làm cho nó rộng lớn hơn nhiều nữa, và chúng ta sẽ tạo một class mới gọi là hole.java, nó như sau: hole.java
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\hole.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class hole {
    //những điểm thông giữa 2 map.
int[][] hole={{0,3,5},{1,5,4}};
//những vị trí bản đồ mà từ đó sẽ thoát ra.
int[] out={1,0};
//kiểm tra xem có phải đang trong điểm chuyển không.
boolean inhole=true;
//bản đồ hiện tại.
int m;
//hàm kiểm tra xem có nằm trong điểm chuyển hay không.
public boolean check(int nm,int x,int y,map m){
    //lần lượt check qua từng điểm chuyển.
for(int i=0;i<hole.length;i++){
   int nx=x/16;
   int ny=y/16;
if(nm==hole[i][0]&&nx==hole[i][1]&&ny==hole[i][2]){
    this.m=out[i];
return true;}
}
return false;}
//hàm chuyển map.
public void change(int nm,int x,int y,map m){
if(check(nm,x,y,m)){
if(!inhole){
    inhole=true;
m.m=hole[this.m][0];
m.load("m"+hole[this.m][0]+".mbd",hole[this.m][1],hole[this.m][2],m.w,m.h);}}
else{
inhole=false;}
}
}
Nhưng khi thay đổi map thì nhân vật phụ cũng thay đổi luôn đó, cho nguyên nhân đó nên chúng ta cũng thay đổi cách tạo nhân vật phụ, nhân vật dẫn chuyện cũng nên thay đổi, nhưng ở đây tôi không nói nhiều về chuyện đó. Chúng ta chỉ thay đổi một chút để game không bị lỗi, file map.java thành thế này. map.java
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java
import java.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.util.*;
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,w,h,m=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;
        //thêm biến vẽ nhân vật dẫn thoại.
        trail tr=new trail();
        //tạo biến check để chuyển map
        hole hl=new hole();
    //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);
is.close();
//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]);
}}
this.w=w;
this.h=h;
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[3];
for(int i=0;i<ot.length;i++)
{
    Random d=new Random();
    int cot=Math.abs(d.nextInt())%mw,rot=Math.abs(d.nextInt())%mh;
    ot[i]=new other(other,cot*16,rot*16);
Thread.sleep(50);}
}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);
    g.setColor(0);
    g.drawRect(x,y,tl.getWidth(),tl.getHeight());
tl.paint(g);
//vẽ nhân vật phụ lên map.
for(int i=0;i<ot.length;i++)
ot[i].paint(g,this);
//vẽ nhân vật dẫn chuyện ra màn hình.
tr.paint(g,this,k);
//dùng hàm để chuyển map khi phát hiện đúng điều kiện.
hl.change(this.m, w/2-x, h/2-y, 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){
    //gán tọa độ cũ vào các biến gx gy.
    int gx=x,gy=y;
    //tính tọa độ mới.
    switch(k){
        case -1:
            gy+=16;
    break;
    case -2:
            gy-=16;
    break;
    case -3:
            gx+=16;
    break;
    case -4:
            gx-=16;
    break;}
    //kiểm tra xem toa6 độ mới có chạm tường không.
if(check(w/2-gx,h/2-gy)){
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();}
  //hàm kiểm tra xem có chạm tường không, tường là gạch số 3.
  boolean check(int a,int b){
      if(a<0||b<0||a>mw*16-16||b>mh*16-16){return false;}
 return tl.getCell(a/16, b/16)<3;}
}

Kết quả chúng ta như sau:


Không có nhận xét nào: