Pham_loi
Chức vụ: 16:47:10, 01-06-2016 |
một nhân vật phụ họa trong trò chơi
Một nhân vật chạy tới chạy lui, cũng khá là hay và vui mắt, điều này còn làm cho trò chơi trở nên sinh động hơn. Chúng ta sẽ thêm một lớp other.java như sau.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\other.java
<?php
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
public class other {
//bao gồm tọa độ của other (x,y), khung hình hiện tại f, phía di chuyển k, step
int x,y,f=0,k=1;
//dùng Sprite để tạo hình ảnh nhân vật phụ
Sprite other;
//mốc thời gian lần di chuyển cuối và lần đổi hướng cuối.
long lm,lc;
//hình ảnh dùng tạo Sprite
Image im;
//biến ngẫu nhiên dùng để tạo hướng ngẫu nhiên.
Random rd=new Random();
//hàm khởi tạo nhân các tham số hình ảnh và tọa độ ban đầu của other.
public other(Image im,int x,int y){
this.x=x;
this.y=y;
this.im=im;
other=new Sprite(im,16,16);
other.setFrame(f);
}
//hàm paint dùng vẽ nhân vật other lên Graphics g.
void paint(Graphics g,map m){
move(m);
other.paint(g);
}
//hàm move nhân giá trị là biến map m, sử dụng để điều hướng nhân vật phụ.
void move(map m){
//so sánh mốc chuyển hướng cuối cùng để cho cứ 1.5s thì chuyển hướng.
if(lc<m.curr()-1500){
//với phép chia dư này, k chỉ nhận giá trị từ 1-4.
k=Math.abs(rd.nextInt()%4)+1;
lc=m.curr();}
//so sánh với lần di chuyển cuối cùng, nếu cách 0.5s thì cho di chuyển.
if(lm<m.curr()-200){
f=f%2==0?(k-1)*2+1:(k-1)*2;
other.setFrame(f);
switch(k){
case 1:
y-=4;
break;
case 2:
y+=4;
break;
case 3:
x-=4;
break;
case 4:
x+=4;
break;}
lm=m.curr();
}
//tọa độ của nhân vật phụ được hình thành từ tọa độ của bản đồ và tọa độ của nhân vật phụ.
other.setPosition(x+m.x,y+m.y);
}
}
?>
Copy code
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
public class other {
//bao gồm tọa độ của other (x,y), khung hình hiện tại f, phía di chuyển k, step
int x,y,f=0,k=1;
//dùng Sprite để tạo hình ảnh nhân vật phụ
Sprite other;
//mốc thời gian lần di chuyển cuối và lần đổi hướng cuối.
long lm,lc;
//hình ảnh dùng tạo Sprite
Image im;
//biến ngẫu nhiên dùng để tạo hướng ngẫu nhiên.
Random rd=new Random();
//hàm khởi tạo nhân các tham số hình ảnh và tọa độ ban đầu của other.
public other(Image im,int x,int y){
this.x=x;
this.y=y;
this.im=im;
other=new Sprite(im,16,16);
other.setFrame(f);
}
//hàm paint dùng vẽ nhân vật other lên Graphics g.
void paint(Graphics g,map m){
move(m);
other.paint(g);
}
//hàm move nhân giá trị là biến map m, sử dụng để điều hướng nhân vật phụ.
void move(map m){
//so sánh mốc chuyển hướng cuối cùng để cho cứ 1.5s thì chuyển hướng.
if(lc<m.curr()-1500){
//với phép chia dư này, k chỉ nhận giá trị từ 1-4.
k=Math.abs(rd.nextInt()%4)+1;
lc=m.curr();}
//so sánh với lần di chuyển cuối cùng, nếu cách 0.5s thì cho di chuyển.
if(lm<m.curr()-200){
f=f%2==0?(k-1)*2+1:(k-1)*2;
other.setFrame(f);
switch(k){
case 1:
y-=4;
break;
case 2:
y+=4;
break;
case 3:
x-=4;
break;
case 4:
x+=4;
break;}
lm=m.curr();
}
//tọa độ của nhân vật phụ được hình thành từ tọa độ của bản đồ và tọa độ của nhân vật phụ.
other.setPosition(x+m.x,y+m.y);
}
}
?>
Copy code
Và ta sẽ sử dụng hình ảnh này để tạo nhân vật phụ :
Ta sẽ thêm vào trong map.java để sử dụng nhân vật phụ này :
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.
//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;
//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;
//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);
//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);
}}
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(other,w/2-4*16,h/2-6*16);
}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);
tl.paint(g);
//vẽ nhân vật phụ lên map.
ot.paint(g,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){
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();}
}
?>
Copy code
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.
//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;
//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;
//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);
//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);
}}
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(other,w/2-4*16,h/2-6*16);
}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);
tl.paint(g);
//vẽ nhân vật phụ lên map.
ot.paint(g,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){
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();}
}
?>
Copy code
Rồi vậy là xong, kết quả đây :
Source: RPG-82799.zip
Jar: RPG-49690.jar
: 0 ♥
Trực Tuyến:
Khách: 1