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 ♥
Pham_loi
Chức vụ: 16:44:47, 01-06-2016 |
di chuyển bản đồ mà tưởng nhân vật đang di chuyển vậy
Thay vì di chuyển nhân vật, nhân vật ta luôn làm trung tâm và chúng ta chỉ cho bản đồ di chuyển. mọi thứ sẽ thay đổi nhiều so với lần trước, nhưng cũng không đến nổi khó hiểu cho lắm.
Mỗi lần bản đồ di chuyển một khoảng là một ô gạch, như vậy thì ta sẽ thấy nó rất giật, cho nên mỗi lần bấm phím di chuyển ta cho bản đồ di chuyển thành nhiều bước nhỏ, mỗi bước nhỏ là một ước số của kích thước ô gạch. Làm như vậy, nhân vật và bản đồ luôn khớp với nhau tại từng ô, chứ nhân vật không bao giờ nằm lưng chừng giữa 2 ô gạch, điều này sẽ giúp ta xác định điểm chạm ở bài sau.
File map.java trở thành thế 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;
//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;
//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;
System.out.println("finish");
}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);}
//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;
//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;
//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;
System.out.println("finish");
}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);}
//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
Và vì vậy trong RPG.java ta cũng thay đổi cách sử dụng các hàm trong map.java, nhân vật chúng ta sẽ di chuyển, nhưng thật chất là thay đổi vị trí bản đồ trên màn hình.
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, nhân vật ở vị trí cột 3, dòng 4 trên map.
m.load("m0.mbd",3,4,w,h);}
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,k);
//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
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, nhân vật ở vị trí cột 3, dòng 4 trên map.
m.load("m0.mbd",3,4,w,h);}
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,k);
//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
Kết quả là đây :
Source: RPG-07641.zip
Jar: RPG-17847.jar
: 0 ♥
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):
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.
byte[ map;
//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(j, i, map[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(x, y);
tl.paint(g);}
}
?>
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.
int mw,mh,tw,th;
//chứa dữ liệu các tile trong map.
byte[ map;
//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(j, i, map[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(x, y);
tl.paint(g);}
}
?>
Copy code
ở đây ta dùng file tiles.png này làm gạch lát:
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
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 :
Source: RPG-20156.zip
Jar: RPG-00207.jar
: 0 ♥
Pham_loi
Chức vụ: 16:37:06, 01-06-2016 |
một nhân vật trên nền không
đây là bài đơn giản nhất mà ai cũng có thể làm được, và nó là bắt đầu cho những gì đó thật phức tạp sau này. Chúng ta sẽ cho hiện thị ra một hình ảnh của nhân vật và điều hướng nó cũng như hình ảnh mà nó sẽ xuất hiện trên màn hình. Hình ảnh mà ta sử dụng ở đây là một hình ảnh gồm 8 hình ảnh nhỏ, mỗi ảnh nhỏ sẽ gọi là khung ảnh và được tính từ 0, ứng với mỗi khung là một hướng mà nhân vật chúng ta sẽ hiện thị. Mỗi khung là 16x16, vậy 8 khung là 128x16
Và đây là file RPG.java của chúng ta
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;
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){}}
public void paint(Graphics g){
//lệnh tô màn hình
g.setColor(0);
g.fillRect(0,0,w,h);
//hàm xử lí di chuyển theo phím bấm
move();
//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
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;
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){}}
public void paint(Graphics g){
//lệnh tô màn hình
g.setColor(0);
g.fillRect(0,0,w,h);
//hàm xử lí di chuyển theo phím bấm
move();
//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
Chúng ta cũng cần một Midlet.java để ứng dụng hoạt động được.
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\Midlet.java
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new RPG()); }
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new RPG()); }
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
Kết quả đây :
Source: RPG-49912.zip
Jar: RPG-44072.jar
: 0 ♥
Pham_loi
Chức vụ: 16:34:34, 01-06-2016 |
Trò chơi trúc xanh
hôm nay tôi sẽ giới thiệu với các bạn một trò chơi khác nữa, đó là trò chơi lật các ô hình để tìm ra những cặp hình giống nhau. Trò chơi này chắc cũng quen thuộc với các bạn qua chương trình trúc xanh phát trên htv7 nhỉ. Chúng ta có file trucxanh.java ban đầu như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\trucxanh.java
<?php
import javax.microedition.lcdui.*;
import java.util.*;
public class trucxanh extends Canvas{
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
int x,y,sx,sy,w,h,ff=-1;
Midlet m;
public trucxanh(Midlet m) {
try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
} catch (Exception e) {
}
}
public void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, w, h);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
if(board[i[j!=-1)
g.drawString(""+board[i[j,10+j*16,10+i*16,0);}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*16, 10+sy*16, 16, 16);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*16, 10+y*16, 16, 16);
repaint();
}
//hàm nhấn phím
protected void keyPressed(int k) {
switch(k){
case -1:
y--;
break;
case -2:
y++;
break;
case -3:
x--;
break;
case -4:
x++;
break;
case -5:
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
if(ff==-1)
{if(board[y[x!=-1){sx=x; sy=y; ff=board[y[x;}}
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
else
{if(board[y[x==ff){board[y[x=board[sy[sx=-1; ff=-1;}else{ff=-1;}}
break;}
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
if(x==board[0.length)x=0;
if(x<0)x=board[0.length-1;
if(y==board.length)y=0;
if(y<0)y=board.length-1;
}
//hàm general sử dụng 2 tham số cột c và hàng r
void general(int c,int r){
Random rd=new Random();
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
if(c%2==0||r%2==0){
board=new byte[r[c;
//tạo vector chứa các vị trí còn trống
Vector v=new Vector();
//cho các giá trị vị trí còn trống vào vector
for(int i=0;i<c*r;i++){
v.addElement(""+i);}
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
for(int i=0;i<c*r/2;i++){
//tìm số ngẫu nhiên.
int rand=Math.abs(rd.nextInt());
//giá trị mà cặp số sẽ mang.
int tile=rand%4;
//vị trí số thứ nhất.
int fp=rand%v.size();
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
v.removeElementAt(fp);
//tương tự ta có vị trí của số thứ 2.
int sp=rand%v.size();
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
v.removeElementAt(sp);
}
}}
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
void insertboard(int xy,int v){
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
int c=xy%board[0.length;
int r=(xy-c)/board[0.length;
board[r[c=(byte)v;}
}
?>
Copy code
import javax.microedition.lcdui.*;
import java.util.*;
public class trucxanh extends Canvas{
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
int x,y,sx,sy,w,h,ff=-1;
Midlet m;
public trucxanh(Midlet m) {
try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
} catch (Exception e) {
}
}
public void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, w, h);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
if(board[i[j!=-1)
g.drawString(""+board[i[j,10+j*16,10+i*16,0);}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*16, 10+sy*16, 16, 16);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*16, 10+y*16, 16, 16);
repaint();
}
//hàm nhấn phím
protected void keyPressed(int k) {
switch(k){
case -1:
y--;
break;
case -2:
y++;
break;
case -3:
x--;
break;
case -4:
x++;
break;
case -5:
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
if(ff==-1)
{if(board[y[x!=-1){sx=x; sy=y; ff=board[y[x;}}
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
else
{if(board[y[x==ff){board[y[x=board[sy[sx=-1; ff=-1;}else{ff=-1;}}
break;}
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
if(x==board[0.length)x=0;
if(x<0)x=board[0.length-1;
if(y==board.length)y=0;
if(y<0)y=board.length-1;
}
//hàm general sử dụng 2 tham số cột c và hàng r
void general(int c,int r){
Random rd=new Random();
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
if(c%2==0||r%2==0){
board=new byte[r[c;
//tạo vector chứa các vị trí còn trống
Vector v=new Vector();
//cho các giá trị vị trí còn trống vào vector
for(int i=0;i<c*r;i++){
v.addElement(""+i);}
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
for(int i=0;i<c*r/2;i++){
//tìm số ngẫu nhiên.
int rand=Math.abs(rd.nextInt());
//giá trị mà cặp số sẽ mang.
int tile=rand%4;
//vị trí số thứ nhất.
int fp=rand%v.size();
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
v.removeElementAt(fp);
//tương tự ta có vị trí của số thứ 2.
int sp=rand%v.size();
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
v.removeElementAt(sp);
}
}}
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
void insertboard(int xy,int v){
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
int c=xy%board[0.length;
int r=(xy-c)/board[0.length;
board[r[c=(byte)v;}
}
?>
Copy code
Và chúng ta cũng có một file Midlet.java để hiện thị nó ra màn hình như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\Midlet.java
<?php
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new trucxanh(this));}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new trucxanh(this));}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
Và kết quả ta được như thế này:
Source: src-29988.zip
Jar: trucxanh-60143.jar
nhưng như thế thì chỉ dành cho trẻ con chơi thôi và cũng chưa giống gì với trúc xanh nhỉ, vì nó rõ như ban ngày vậy. thế nên ta cần có hình ảnh vào cho nó đẹp đẽ một chút và cũng làm sao để người chơi phải đoán xem đâu mới là cặp hình đúng. Ta cần thêm một file hình ảnh tile.png
và trucxanh.java trở thành thế này, rất đơn giản thôi.
C:\Users\thanhliem\Documents\NetBeansProjects\trucxanh\src\trucxanh.java
<?php
import javax.microedition.lcdui.*;
import java.util.*;
public class trucxanh extends Canvas{
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
//cũng thêm biến số lượt sai có thể lost và số lần chọn đúng right.
int x,y,sx,sy,w,h,ff=-1,lost=2,right=0;
Midlet m;
//hình ảnh dùng để vẽ các mảnh ảnh khác nhau
Image im;
public trucxanh(Midlet m) {
try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
//tạo hình ảnh từ file nguồn
im=Image.createImage("/tile.png");
} catch (Exception e) {
}
}
public void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, w, h);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
if(board[i[j!=-1){
//thay vì vẽ số của ảnh ta tô màu cho nó thành màu đỏ
g.fillRect(10+j*32, 10+i*32, 31, 31);}}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*32, 10+sy*32, 32, 32);
//tìm ra vị trí mảnh ảnh trong ảnh gốc, mỗi mảnh là 32x32
int c=ff%(im.getWidth()/32);
int r=(ff-c)/(im.getWidth()/32);
//sau đó dùng cách vẽ 1 phần ảnh gốc theo vị trí tìm được
g.drawRegion(im, c*32, r*32, 32, 32, 0, 10+sx*32, 10+sy*32, 0);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*32, 10+y*32, 32, 32);
//vẽ số lượt sai có thể chọn
g.drawString("rest:"+lost,0,h,Graphics.BOTTOM|Graphics.LEFT);
repaint();
//tính toán và hiển thị kết quả
if(lost<=0){g.drawString("you lost!",w/2,h/2,0);}
if(right==board[0.length*board.length/2){g.drawString("you win!",w/2,h/2,0);}
}
//hàm nhấn phím
protected void keyPressed(int k) {
switch(k){
case -1:
y--;
break;
case -2:
y++;
break;
case -3:
x--;
break;
case -4:
x++;
break;
case -5:
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
if(ff==-1)
{if(board[y[x!=-1){sx=x; sy=y; ff=board[y[x;}}
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
else
{if(board[y[x==ff){board[y[x=board[sy[sx=-1; ff=-1; right++;}else{ff=-1; lost--;}}
break;}
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
if(x==board[0.length)x=0;
if(x<0)x=board[0.length-1;
if(y==board.length)y=0;
if(y<0)y=board.length-1;
}
//hàm general sử dụng 2 tham số cột c và hàng r
void general(int c,int r){
Random rd=new Random();
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
if(c%2==0||r%2==0){
board=new byte[r[c;
//tạo vector chứa các vị trí còn trống
Vector v=new Vector();
//cho các giá trị vị trí còn trống vào vector
for(int i=0;i<c*r;i++){
v.addElement(""+i);}
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
for(int i=0;i<c*r/2;i++){
//tìm số ngẫu nhiên.
int rand=Math.abs(rd.nextInt());
//giá trị mà cặp số sẽ mang.
int tile=rand%4;
//vị trí số thứ nhất.
int fp=rand%v.size();
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
v.removeElementAt(fp);
//tương tự ta có vị trí của số thứ 2.
int sp=rand%v.size();
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
v.removeElementAt(sp);
}
}}
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
void insertboard(int xy,int v){
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
int c=xy%board[0.length;
int r=(xy-c)/board[0.length;
board[r[c=(byte)v;}
}
?>
Copy code
import javax.microedition.lcdui.*;
import java.util.*;
public class trucxanh extends Canvas{
//mảng chứa các mảnh hình
byte[[ board;
//các biến bao gồm: tọa độ khung chọn(x,y), vị trí đã chọn(sx,sy), giá trị chọn(ff)
//cũng thêm biến số lượt sai có thể lost và số lần chọn đúng right.
int x,y,sx,sy,w,h,ff=-1,lost=2,right=0;
Midlet m;
//hình ảnh dùng để vẽ các mảnh ảnh khác nhau
Image im;
public trucxanh(Midlet m) {
try {
setFullScreenMode(true);
w=getWidth();
h=getHeight();
this.m=m;
//hàm general, tạo ra một mảng mới với các cặp giá trị.
general(4,3);
//tạo hình ảnh từ file nguồn
im=Image.createImage("/tile.png");
} catch (Exception e) {
}
}
public void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, w, h);
g.setColor(0x00ff00);
//nếu như mảng không rỗng thì vẽ bảng
if(board!=null)
//lần lượt cho hàng i
for(int i=0;i<board.length;i++){
//lần lượt cho cột j
for(int j=0;j<board[0.length;j++){
//nếu giá trị tìm được trong bảng khác -1 thì vẽ ra
if(board[i[j!=-1){
//thay vì vẽ số của ảnh ta tô màu cho nó thành màu đỏ
g.fillRect(10+j*32, 10+i*32, 31, 31);}}}
//nếu giá trị đã chọn khác -1 thì vẽ khung đã chọn vị trí sx,sy
if(ff!=-1){
g.setColor(0xff0000);
g.drawRect(10+sx*32, 10+sy*32, 32, 32);
//tìm ra vị trí mảnh ảnh trong ảnh gốc, mỗi mảnh là 32x32
int c=ff%(im.getWidth()/32);
int r=(ff-c)/(im.getWidth()/32);
//sau đó dùng cách vẽ 1 phần ảnh gốc theo vị trí tìm được
g.drawRegion(im, c*32, r*32, 32, 32, 0, 10+sx*32, 10+sy*32, 0);
}
//vẽ khung lựa chọn tại vị trí x,y
g.setColor(0x0000ff);
g.drawRect(10+x*32, 10+y*32, 32, 32);
//vẽ số lượt sai có thể chọn
g.drawString("rest:"+lost,0,h,Graphics.BOTTOM|Graphics.LEFT);
repaint();
//tính toán và hiển thị kết quả
if(lost<=0){g.drawString("you lost!",w/2,h/2,0);}
if(right==board[0.length*board.length/2){g.drawString("you win!",w/2,h/2,0);}
}
//hàm nhấn phím
protected void keyPressed(int k) {
switch(k){
case -1:
y--;
break;
case -2:
y++;
break;
case -3:
x--;
break;
case -4:
x++;
break;
case -5:
//nếu chưa chọn (ff==-1) thì cho giá trị vào ff, sx, sy
if(ff==-1)
{if(board[y[x!=-1){sx=x; sy=y; ff=board[y[x;}}
//ngược lại thì cho so sánh giá trị đã chọn và giá trị vừa chọn
else
{if(board[y[x==ff){board[y[x=board[sy[sx=-1; ff=-1; right++;}else{ff=-1; lost--;}}
break;}
//các công thức này đảm bảo khung lựa chọn không đi ra ngoài bảng
if(x==board[0.length)x=0;
if(x<0)x=board[0.length-1;
if(y==board.length)y=0;
if(y<0)y=board.length-1;
}
//hàm general sử dụng 2 tham số cột c và hàng r
void general(int c,int r){
Random rd=new Random();
//nếu như một trong 2 số chia hết cho 2 tức là bảng có thể chia cặp
if(c%2==0||r%2==0){
board=new byte[r[c;
//tạo vector chứa các vị trí còn trống
Vector v=new Vector();
//cho các giá trị vị trí còn trống vào vector
for(int i=0;i<c*r;i++){
v.addElement(""+i);}
//do bảng là một bảng cặp số nên ta chỉ cần tính nửa số bảng. mỗi lần ta tìm ra giá trị của cặp số, đồng thời cũng tìm giá trị vị trí cho cặp số.
for(int i=0;i<c*r/2;i++){
//tìm số ngẫu nhiên.
int rand=Math.abs(rd.nextInt());
//giá trị mà cặp số sẽ mang.
int tile=rand%4;
//vị trí số thứ nhất.
int fp=rand%v.size();
//hàm insertboard tự động điền vào bảng giá trị tại vị trí nhất định.
insertboard(Integer.parseInt((String)v.elementAt(fp)),tile);
//sau đó vị trí đó không tồn tại nữa, ta bỏ nó ra khỏi vector chỗ trống.
v.removeElementAt(fp);
//tương tự ta có vị trí của số thứ 2.
int sp=rand%v.size();
insertboard(Integer.parseInt((String)v.elementAt(sp)),tile);
v.removeElementAt(sp);
}
}}
//hàm insert board, đây sẽ chèn vào bảng một giá trị tại một vị trí nhất định.
void insertboard(int xy,int v){
//bảng có bao nhiêu đối tượng ta sẽ có thể tính ra hàng và cột mà một vị trí số đang ở.
int c=xy%board[0.length;
int r=(xy-c)/board[0.length;
board[r[c=(byte)v;}
}
?>
Copy code
Source: src-83170.zip
Jar: trucxanh-43462.jar
: 0 ♥
Pham_loi
Chức vụ: 16:30:09, 01-06-2016 |
the Sky Fall
Không phải là phim đâu, mà là một trò chơi đơn giản: nhân vật của chúng ta sẽ rơi xuống vào một rừng mũi tên đang bắn lên, chúng ta sẽ điều khiển để nhân vật đừng chạm vào mũi tên nào hết. các bạn cần có 3 file sau, tôi đã chú thích trong từng file hết rồi, chắc các bạn cũng hiểu thôi. Đầu tiên là file muiten.java
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\muiten.java
<?php
import javax.microedition.lcdui.*;
import java.util.*;
public class muiten {
//các biến: độ rộng màn hình, cao màn hình, vị trí x, vị trí y, chiều dài mũi tên, tốc độ mũi tên
int w, h, x, y, len, speed;
//biến chỉ mốc thời gian di chuyển lần cuối
long lm = 0;
// biến số ngẫu nhiên
Random rd = new Random();
//biến đầu mũi tên, và biến đuôi mũi tên dùng vẽ hình mũi tên
byte[[ mim = {
{0, 1, 0},
{1, 1, 1}},
dim = {{1, 0, 1}};
//hàm khởi tạo nhận các giá trị rộng,cao màn hình và một số nguyên ngẩu nhiên
public muiten(int w, int h, int rd) {
this.w = w;
this.h = h;
this.rd = new Random(rd);
//dùng hàm general để khởi tạo
general();
}
//hàm general xác định tọa độ x, y chiều dài và tốc độ ngẫu nhiên cho mũi tên
public void general() {
//hàm Math.abs(số nguyên) chỉ sang trị tuyệt đối, nextInt là lấy số nguyên ngẫu nhiên, dấu % là phép chia lấy dư.
x = Math.abs(rd.nextInt()) % w;
y = h + 3;
len = Math.abs(rd.nextInt()) % (h / 10);
speed = Math.abs(rd.nextInt()) % 3 + 2;
}
public void draw(Graphics g) {
//lấy màu hiện tại lưu lại vào ocl
int ocl = g.getColor();
//dặt màu mới
g.setColor(ocl & 0xff);
//cho vẽ mũi tên qua hàm drawmuiten
drawmuiten(g);
//đặt lại màu cũ
g.setColor(ocl);
//kiểm tra nếu như cách khoảng 20 mili giây từ lần cuối di chuyển lm thì cho mũi tên di chuyển tiếp
if (lm < System.currentTimeMillis() - 20) {
y -= speed;
lm = System.currentTimeMillis();
}
//nếu như tọa độ y bé hơn -h/10 thì cho tạo lại mũi tên.
if (y < -h / 10) {
general();
}
}
//hàm check dùng để kiểm tra xem nhân vật và mũi tên có chạm nhâu không, gồm tọa độ x,y của nhân vật và độ cao rộng của nhân vật
boolean check(int x, int y, int w, int h) {
int sx = (this.x - x);
int sy = (this.y - y);
if (sx > 0 && sy > 0 && sx <= w && sy <= h) {
return true;
}
return false;
}
//hàm vẽ mũi tên sẽ vẽ mũi tên theo tọa độ của nó
public void drawmuiten(Graphics g) {
//vẽ đầu mũi tên
for (int i = 0; i < mim.length; i++) {
for (int j = 0; j < mim[0.length; j++) {
if (mim[i[j != 0) {
g.fillRect(x + j, y + i, 1, 1);
}
}
}
//vẽ thân mũi tên
g.drawLine(x + 1, y, x + 1, y + len);
//vẽ đuôi mũi tên
for (int i = 0; i < dim.length; i++) {
for (int j = 0; j < dim[0.length; j++) {
if (dim[i[j != 0) {
g.fillRect(x + j, y + len + i, 1, 1);
}
}
}
}
}
?>
Copy code
import javax.microedition.lcdui.*;
import java.util.*;
public class muiten {
//các biến: độ rộng màn hình, cao màn hình, vị trí x, vị trí y, chiều dài mũi tên, tốc độ mũi tên
int w, h, x, y, len, speed;
//biến chỉ mốc thời gian di chuyển lần cuối
long lm = 0;
// biến số ngẫu nhiên
Random rd = new Random();
//biến đầu mũi tên, và biến đuôi mũi tên dùng vẽ hình mũi tên
byte[[ mim = {
{0, 1, 0},
{1, 1, 1}},
dim = {{1, 0, 1}};
//hàm khởi tạo nhận các giá trị rộng,cao màn hình và một số nguyên ngẩu nhiên
public muiten(int w, int h, int rd) {
this.w = w;
this.h = h;
this.rd = new Random(rd);
//dùng hàm general để khởi tạo
general();
}
//hàm general xác định tọa độ x, y chiều dài và tốc độ ngẫu nhiên cho mũi tên
public void general() {
//hàm Math.abs(số nguyên) chỉ sang trị tuyệt đối, nextInt là lấy số nguyên ngẫu nhiên, dấu % là phép chia lấy dư.
x = Math.abs(rd.nextInt()) % w;
y = h + 3;
len = Math.abs(rd.nextInt()) % (h / 10);
speed = Math.abs(rd.nextInt()) % 3 + 2;
}
public void draw(Graphics g) {
//lấy màu hiện tại lưu lại vào ocl
int ocl = g.getColor();
//dặt màu mới
g.setColor(ocl & 0xff);
//cho vẽ mũi tên qua hàm drawmuiten
drawmuiten(g);
//đặt lại màu cũ
g.setColor(ocl);
//kiểm tra nếu như cách khoảng 20 mili giây từ lần cuối di chuyển lm thì cho mũi tên di chuyển tiếp
if (lm < System.currentTimeMillis() - 20) {
y -= speed;
lm = System.currentTimeMillis();
}
//nếu như tọa độ y bé hơn -h/10 thì cho tạo lại mũi tên.
if (y < -h / 10) {
general();
}
}
//hàm check dùng để kiểm tra xem nhân vật và mũi tên có chạm nhâu không, gồm tọa độ x,y của nhân vật và độ cao rộng của nhân vật
boolean check(int x, int y, int w, int h) {
int sx = (this.x - x);
int sy = (this.y - y);
if (sx > 0 && sy > 0 && sx <= w && sy <= h) {
return true;
}
return false;
}
//hàm vẽ mũi tên sẽ vẽ mũi tên theo tọa độ của nó
public void drawmuiten(Graphics g) {
//vẽ đầu mũi tên
for (int i = 0; i < mim.length; i++) {
for (int j = 0; j < mim[0.length; j++) {
if (mim[i[j != 0) {
g.fillRect(x + j, y + i, 1, 1);
}
}
}
//vẽ thân mũi tên
g.drawLine(x + 1, y, x + 1, y + len);
//vẽ đuôi mũi tên
for (int i = 0; i < dim.length; i++) {
for (int j = 0; j < dim[0.length; j++) {
if (dim[i[j != 0) {
g.fillRect(x + j, y + len + i, 1, 1);
}
}
}
}
}
?>
Copy code
Tiếp theo đó là file skyfall.java:
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\skyfall.java
<?php
import javax.microedition.lcdui.*;
import java.util.*;
public class skyfall extends Canvas {
//biến mt chứa các mũi tên sẽ bay lên từ dưới màn hình
muiten[ mt = new muiten[10;
Midlet m;
//biến ngẩu nhiên rd
Random rd = new Random();
//các biến: rộng cao màn hình, tọa độ x, y của nhân vật, biến t số ngẩu nhiên, phím bấm k
int w, h, x, y, t = 0, k;
//hình ảnh nhân vật dùng để vẽ
Image man;
//các biến đúng sai: di chuyển, chẳn lẻ, kết thúc
boolean move = false, chan = true, over = false;
//biến mốc di chuyển lần cuối để tính khoảng thời gian di chuyển
long lm;
public skyfall(Midlet m) {
try {
this.m = m;
setFullScreenMode(true);
//tạo ra các phân tử mũi tên cho mảng mt
for (int i = 0; i < mt.length; i++) {
//gồm chiều rộng cao màn hình và một số nguyên ngẫu nhiên
mt[i = new muiten(getWidth(), getHeight(), t);
t = rd.nextInt();
}
//ban đầu cho tọa độ nhân vật ở giữa màn hình
y = getHeight() / 2;
x = getWidth() / 2;
//tạo ra hình ảnh nhân vật là ảnh 32x32
man = Image.createImage("/man.png");
} catch (Exception e) {
}
}
public void paint(Graphics g) {
//kiểm tra xem đã bị trúng tên chưa
over = over();
//xét xem lần di chuyển cuối cùng và có di chuyển tiếp không, hàm System.currentTimeMillis() dùng lấy thời gian hiện tại ở dạng mili giây.
if (move && lm < System.currentTimeMillis() - 10) {
if (k == -3 || k == KEY_NUM4) {
x--;
}
if (k == -4 || k == KEY_NUM6) {
x++;
}
//sau đó gán giá trị thời gian hiện tại cho biến lm
lm = System.currentTimeMillis();
}
//đặt màu mới và tô màn hình
g.setColor(0x90b5ff);
g.fillRect(0, 0, getWidth(), getHeight());
//hàm vẽ này vẽ ra một phần của hình ảnh, bao gồm: hình ảnh, tọa độ x trên ảnh, tọa độ y trên ảnh, chiều rộng cần vẽ, chiểu cao cần vẽ, quay góc, tọa độ vẽ x, tọa độ vẽ y, điểm neo.
g.drawRegion(man, chan ? 0 : 16, 0, 16, 32, 0, x, y, Graphics.TOP | Graphics.LEFT);
//sau đó cho biến chẳn lẻ thay đổi, nếu chẳn thì thành lẻ và ngược lại
chan = !chan;
//đặt màu mới, vẽ các phần tử muiten trong mảng mt
g.setColor(0xff);
for (int i = 0; i < mt.length; i++) {
mt[i.draw(g);
}
//nếu kết thúc over=true thì cho dừng lại, không thì vẽ tiếp.
if (over) {
} else {
repaint();
}
}
//hàm over kiểm tra xem có chạm nhân vật và muiten không
boolean over() {
for (int i = 0; i < mt.length; i++) {
if (mt[i.check(x, y, 16, 32)) {
return true;
}
}
return false;
}
//hàm xử lí phím, bấm phím nào thì cho k= mã phím đó
public void keyPressed(int k) {
move = true;
this.k = k;
if (k == -7) {
//hàm notifyDestroyed của MIDlet dùng để đóng ứng dụng.
m.notifyDestroyed();
}
}
//nếu buông nút bấm thì không cho di chuyển nữa.
public void keyReleased(int k) {
move = false;
}
}
?>
Copy code
import javax.microedition.lcdui.*;
import java.util.*;
public class skyfall extends Canvas {
//biến mt chứa các mũi tên sẽ bay lên từ dưới màn hình
muiten[ mt = new muiten[10;
Midlet m;
//biến ngẩu nhiên rd
Random rd = new Random();
//các biến: rộng cao màn hình, tọa độ x, y của nhân vật, biến t số ngẩu nhiên, phím bấm k
int w, h, x, y, t = 0, k;
//hình ảnh nhân vật dùng để vẽ
Image man;
//các biến đúng sai: di chuyển, chẳn lẻ, kết thúc
boolean move = false, chan = true, over = false;
//biến mốc di chuyển lần cuối để tính khoảng thời gian di chuyển
long lm;
public skyfall(Midlet m) {
try {
this.m = m;
setFullScreenMode(true);
//tạo ra các phân tử mũi tên cho mảng mt
for (int i = 0; i < mt.length; i++) {
//gồm chiều rộng cao màn hình và một số nguyên ngẫu nhiên
mt[i = new muiten(getWidth(), getHeight(), t);
t = rd.nextInt();
}
//ban đầu cho tọa độ nhân vật ở giữa màn hình
y = getHeight() / 2;
x = getWidth() / 2;
//tạo ra hình ảnh nhân vật là ảnh 32x32
man = Image.createImage("/man.png");
} catch (Exception e) {
}
}
public void paint(Graphics g) {
//kiểm tra xem đã bị trúng tên chưa
over = over();
//xét xem lần di chuyển cuối cùng và có di chuyển tiếp không, hàm System.currentTimeMillis() dùng lấy thời gian hiện tại ở dạng mili giây.
if (move && lm < System.currentTimeMillis() - 10) {
if (k == -3 || k == KEY_NUM4) {
x--;
}
if (k == -4 || k == KEY_NUM6) {
x++;
}
//sau đó gán giá trị thời gian hiện tại cho biến lm
lm = System.currentTimeMillis();
}
//đặt màu mới và tô màn hình
g.setColor(0x90b5ff);
g.fillRect(0, 0, getWidth(), getHeight());
//hàm vẽ này vẽ ra một phần của hình ảnh, bao gồm: hình ảnh, tọa độ x trên ảnh, tọa độ y trên ảnh, chiều rộng cần vẽ, chiểu cao cần vẽ, quay góc, tọa độ vẽ x, tọa độ vẽ y, điểm neo.
g.drawRegion(man, chan ? 0 : 16, 0, 16, 32, 0, x, y, Graphics.TOP | Graphics.LEFT);
//sau đó cho biến chẳn lẻ thay đổi, nếu chẳn thì thành lẻ và ngược lại
chan = !chan;
//đặt màu mới, vẽ các phần tử muiten trong mảng mt
g.setColor(0xff);
for (int i = 0; i < mt.length; i++) {
mt[i.draw(g);
}
//nếu kết thúc over=true thì cho dừng lại, không thì vẽ tiếp.
if (over) {
} else {
repaint();
}
}
//hàm over kiểm tra xem có chạm nhân vật và muiten không
boolean over() {
for (int i = 0; i < mt.length; i++) {
if (mt[i.check(x, y, 16, 32)) {
return true;
}
}
return false;
}
//hàm xử lí phím, bấm phím nào thì cho k= mã phím đó
public void keyPressed(int k) {
move = true;
this.k = k;
if (k == -7) {
//hàm notifyDestroyed của MIDlet dùng để đóng ứng dụng.
m.notifyDestroyed();
}
}
//nếu buông nút bấm thì không cho di chuyển nữa.
public void keyReleased(int k) {
move = false;
}
}
?>
Copy code
Và cuối cùng là cho hiển thị thông qua một Midlet.java như ta vẫn thường hay dùng:
C:\Users\thanhliem\Documents\NetBeansProjects\SkyFall\src\Midlet.java
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* @author thanhliem
*/
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new skyfall(this));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
?>
Copy code
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* @author thanhliem
*/
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new skyfall(this));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
?>
Copy code
Các bạn thấy đó, rất là đơn giản phải không nào, để trò chơi thêm phần hấp dẫn bạn có thể thêm biến điểm tính theo lượt những mũi tên được tạo lại sau mỗi lần general mới, trong muiten.java hay là thêm thắt những thứ khác nữa như mạng, vật phẩm chẳng hạn.
Source: SkyFall-27614.zip
Jar: SkyFall-63031.jar
: 0 ♥
Pham_loi
Chức vụ: 16:26:10, 01-06-2016 |
trò chơi chó cắn
Cờ chó cắn chắc là cờ đơn giản nhất mà tôi từng chơi khi còn nhỏ và ở bất cứ đâu cũng có thể chơi được. nó còn đơn giản hơn là tic tac toe nữa đấy, và hôm nay tôi sẽ hướng dẫn viết một bàn cờ chó cắn đơn giản. đầu tiên là quân cờ chó cắn, gồm có các thông tin sau:
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\tree.java
<?php
public class tree {
//vị trí hiện tại của quân cờ và màu của quân cờ
int position,color;
//hàm khởi tạo nhận giá trị vị trí và màu quân cờ
public tree(int pos,int color){
this.position=pos;
this.color=color;}
}
?>
Copy code
public class tree {
//vị trí hiện tại của quân cờ và màu của quân cờ
int position,color;
//hàm khởi tạo nhận giá trị vị trí và màu quân cờ
public tree(int pos,int color){
this.position=pos;
this.color=color;}
}
?>
Copy code
Còn đây là file banco.java dùng để tiến hành các lệnh vẽ theo game, điều kiện trò chơi, cách chơi….
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\banco.java
<?php
import javax.microedition.lcdui.*;
import java.util.*;
public class banco extends Canvas {
Midlet m;
//biến các điểm tọa độ của bàn cờ
int[[ moc;
//biến các điểm có thể di chuyển trên bàn cờ
boolean[ free=new boolean[5;
int w,h,dx,dy,k;
boolean mot=true,finish=false,win=false;
//biến các quân cờ, vị trí của ta là 0, 2 của máy là 1, 3
tree[ quan;
//biến rd này dùng để chọn ngẫu nhiên nhân vật tự động
Random rd=new Random();
public banco(Midlet m){
setFullScreenMode(true);
w=getWidth(); h=getHeight();
//điểm vẽ bàn cờ
dx=(w-128)/2;
dy=(h-128)/2;
//tạo các tọa độ vẽ bàn cờ, 128x128
moc=new int[5[2;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
moc[i*2+j[0=i*128;
moc[i*2+j[1=j*128;}}
moc[4[0=64;
moc[4[1=64;
//tạo các quân cờ ban đầu, của ta là số chẵn 0, 2
quan=new tree[4;
for(int i=0;i<quan.length;i++){
//các điểm đặt quân không còn trống, không thể di chuyển vào
free[i=false;
//đặt màu cho các quân cờ, quân ta màu xanh lá 0, 2 chia hết cho 2
quan[i=new tree(i,i%2==0?0x00f000:0x0000f0);}
//điểm còn lại chưa đặt quân cờ trống là ở giữa bàn cờ vị trí 4
free[4=true;
this.m=m;}
public void paint(Graphics g){
g.setColor(0);
g.fillRect(0,0,w,h);
//vẽ bàn cờ
vebanco(g);
//vẽ quân cờ
vequanco(g);
g.setColor(0xf000f0);
//nếu kết thúc thì vẽ kết quả
if(finish)
g.drawString(win?"you win!":"you lose!",w/2,h,Graphics.BOTTOM|Graphics.HCENTER);
//vẽ hướng dẫn chơi game
g.drawString("nhấn 5 để di chuyển.",w/2,0,Graphics.TOP|Graphics.HCENTER);
g.drawString("nhấn * để thay đổi đối tượng",w/2,0+g.getFont().getHeight(),Graphics.TOP|Graphics.HCENTER);
repaint();
}
protected void keyPressed(int k){
//nếu mot==true thì ta điều khiển quân 0, sai ta điều khiển quân 2
//tìm ra vị trí trống có thể đi tiếp
int focus=mot?0:2,move=free();
//nếu chưa xong game thì cho di chuyển
if(!finish)
//nếu như bấm phím 5 thì cho di chuyển
if(k==KEY_NUM5||k==-5)
//nếu di chuyển được thì cho auto di chuyển
if(move(focus,move)){
auto();}
//nếu không thì chuyển qua quân còn lại di chuyển, nếu được thì auto di chuyển
else if(move(focus==0?2:0,move)){
auto();
}
//ngược lại thì thua và kết thúc trò chơi
else{finish=true; win=false;}
//nhấn phím * để thay đổi đối tượng điều khiển
if(k==KEY_STAR)mot=!mot;}
//di chuyển nhân vật tự động
void auto(){
//tìm ra vị trí còn trống
int move=free();
//chọn ngẫu nhiên nhân vật tự động giữa 1 và 3
int focus=rd.nextInt()%2==0?1:3;
//cho di chuyển, nếu 1 không di chuyển thì chuyển qua 3 và ngược lại
if(move(focus,move)){}else{
//nếu cả 1 và 3 đều không còn di chuyển được nữa thì kết thúc trò chơi, người chơi thắng
if(!move(focus==1?3:1,move)){
finish=true;
win=true;}}}
//vẽ bàn cờ
void vebanco(Graphics g){
g.setColor(0xf0f000);
//vẽ 2 gạch chéo bàn cờ
g.drawLine(dx+moc[0[0,dy+moc[0[1,dx+moc[3[0,dy+moc[3[1);
g.drawLine(dx+moc[1[0, dy+moc[1[1,dx+moc[2[0, dy+moc[2[1);
//vẽ khung vuông bàn cờ
g.drawRect(dx, dy, 128, 128);
//vẽ nơi dành cho con chó, chữ "chó"
g.drawString("chó",dx+64,dy,Graphics.BASELINE|Graphics.HCENTER);
}
//vẽ các quân cờ
void vequanco(Graphics g){
//xác định đối tượng đang chọn, 0 hay là 2
int focus=mot?0:2;
for(int i=0;i<4;i++){
//tìm ra vị trí hiện tại của quân được chọn
int pos=quan[i.position;
//vẽ con trỏ chọn đối tượng
if(i==focus){
g.setColor(0xf00000);
g.fillArc(dx+moc[pos[0-9, dy+moc[pos[1-9, 18, 18, 0, 360);}
g.setColor(quan[i.color);
g.fillArc(dx+moc[pos[0-8, dy+moc[pos[1-8, 16, 16, 0, 360);
}
}
//kiểm tra xem có thể chuyển từ vị trí này tới vị trí trống được ko
boolean cango(int pos,int npos){
if(pos==1&&npos==2)return false;
if(pos==2&&npos==1)return false;
if(pos==0&&npos==3)return false;
if(pos==3&&npos==0)return false;
if(pos==0&&npos==2)return false;
if(pos==2&&npos==0)return false;
return true;}
//tìm ra vị trí còn trống
int free(){
//kiểm tra trong mảng free xem có vị trí nào trống thì trả lại
for(int i=0;i<5;i++){
if(free[i)return i;}
return 0;}
//cho di chuyển và nếu di chuyển được thì trả lại giá trị đúng sai
boolean move(int pos,int npos){
if(cango(quan[pos.position,npos)){
//đặt vị trí đang đứng thành trống
free[quan[pos.position=true;
//cho chuyển sang vị trí mới
quan[pos.position=npos;
//đặt vị trí mới không còn trống nữa
free[quan[pos.position=false;
return true;}
return false;}
}
?>
Copy code
import javax.microedition.lcdui.*;
import java.util.*;
public class banco extends Canvas {
Midlet m;
//biến các điểm tọa độ của bàn cờ
int[[ moc;
//biến các điểm có thể di chuyển trên bàn cờ
boolean[ free=new boolean[5;
int w,h,dx,dy,k;
boolean mot=true,finish=false,win=false;
//biến các quân cờ, vị trí của ta là 0, 2 của máy là 1, 3
tree[ quan;
//biến rd này dùng để chọn ngẫu nhiên nhân vật tự động
Random rd=new Random();
public banco(Midlet m){
setFullScreenMode(true);
w=getWidth(); h=getHeight();
//điểm vẽ bàn cờ
dx=(w-128)/2;
dy=(h-128)/2;
//tạo các tọa độ vẽ bàn cờ, 128x128
moc=new int[5[2;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
moc[i*2+j[0=i*128;
moc[i*2+j[1=j*128;}}
moc[4[0=64;
moc[4[1=64;
//tạo các quân cờ ban đầu, của ta là số chẵn 0, 2
quan=new tree[4;
for(int i=0;i<quan.length;i++){
//các điểm đặt quân không còn trống, không thể di chuyển vào
free[i=false;
//đặt màu cho các quân cờ, quân ta màu xanh lá 0, 2 chia hết cho 2
quan[i=new tree(i,i%2==0?0x00f000:0x0000f0);}
//điểm còn lại chưa đặt quân cờ trống là ở giữa bàn cờ vị trí 4
free[4=true;
this.m=m;}
public void paint(Graphics g){
g.setColor(0);
g.fillRect(0,0,w,h);
//vẽ bàn cờ
vebanco(g);
//vẽ quân cờ
vequanco(g);
g.setColor(0xf000f0);
//nếu kết thúc thì vẽ kết quả
if(finish)
g.drawString(win?"you win!":"you lose!",w/2,h,Graphics.BOTTOM|Graphics.HCENTER);
//vẽ hướng dẫn chơi game
g.drawString("nhấn 5 để di chuyển.",w/2,0,Graphics.TOP|Graphics.HCENTER);
g.drawString("nhấn * để thay đổi đối tượng",w/2,0+g.getFont().getHeight(),Graphics.TOP|Graphics.HCENTER);
repaint();
}
protected void keyPressed(int k){
//nếu mot==true thì ta điều khiển quân 0, sai ta điều khiển quân 2
//tìm ra vị trí trống có thể đi tiếp
int focus=mot?0:2,move=free();
//nếu chưa xong game thì cho di chuyển
if(!finish)
//nếu như bấm phím 5 thì cho di chuyển
if(k==KEY_NUM5||k==-5)
//nếu di chuyển được thì cho auto di chuyển
if(move(focus,move)){
auto();}
//nếu không thì chuyển qua quân còn lại di chuyển, nếu được thì auto di chuyển
else if(move(focus==0?2:0,move)){
auto();
}
//ngược lại thì thua và kết thúc trò chơi
else{finish=true; win=false;}
//nhấn phím * để thay đổi đối tượng điều khiển
if(k==KEY_STAR)mot=!mot;}
//di chuyển nhân vật tự động
void auto(){
//tìm ra vị trí còn trống
int move=free();
//chọn ngẫu nhiên nhân vật tự động giữa 1 và 3
int focus=rd.nextInt()%2==0?1:3;
//cho di chuyển, nếu 1 không di chuyển thì chuyển qua 3 và ngược lại
if(move(focus,move)){}else{
//nếu cả 1 và 3 đều không còn di chuyển được nữa thì kết thúc trò chơi, người chơi thắng
if(!move(focus==1?3:1,move)){
finish=true;
win=true;}}}
//vẽ bàn cờ
void vebanco(Graphics g){
g.setColor(0xf0f000);
//vẽ 2 gạch chéo bàn cờ
g.drawLine(dx+moc[0[0,dy+moc[0[1,dx+moc[3[0,dy+moc[3[1);
g.drawLine(dx+moc[1[0, dy+moc[1[1,dx+moc[2[0, dy+moc[2[1);
//vẽ khung vuông bàn cờ
g.drawRect(dx, dy, 128, 128);
//vẽ nơi dành cho con chó, chữ "chó"
g.drawString("chó",dx+64,dy,Graphics.BASELINE|Graphics.HCENTER);
}
//vẽ các quân cờ
void vequanco(Graphics g){
//xác định đối tượng đang chọn, 0 hay là 2
int focus=mot?0:2;
for(int i=0;i<4;i++){
//tìm ra vị trí hiện tại của quân được chọn
int pos=quan[i.position;
//vẽ con trỏ chọn đối tượng
if(i==focus){
g.setColor(0xf00000);
g.fillArc(dx+moc[pos[0-9, dy+moc[pos[1-9, 18, 18, 0, 360);}
g.setColor(quan[i.color);
g.fillArc(dx+moc[pos[0-8, dy+moc[pos[1-8, 16, 16, 0, 360);
}
}
//kiểm tra xem có thể chuyển từ vị trí này tới vị trí trống được ko
boolean cango(int pos,int npos){
if(pos==1&&npos==2)return false;
if(pos==2&&npos==1)return false;
if(pos==0&&npos==3)return false;
if(pos==3&&npos==0)return false;
if(pos==0&&npos==2)return false;
if(pos==2&&npos==0)return false;
return true;}
//tìm ra vị trí còn trống
int free(){
//kiểm tra trong mảng free xem có vị trí nào trống thì trả lại
for(int i=0;i<5;i++){
if(free[i)return i;}
return 0;}
//cho di chuyển và nếu di chuyển được thì trả lại giá trị đúng sai
boolean move(int pos,int npos){
if(cango(quan[pos.position,npos)){
//đặt vị trí đang đứng thành trống
free[quan[pos.position=true;
//cho chuyển sang vị trí mới
quan[pos.position=npos;
//đặt vị trí mới không còn trống nữa
free[quan[pos.position=false;
return true;}
return false;}
}
?>
Copy code
Và cũng cần có file Midlet.java để ứng dụng có thể hiện thị được. Cái này thì cũng đơn giản và quen quá rồi.
C:\Users\thanhliem\Documents\NetBeansProjects\Tree\src\Midlet.java
<?php
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new banco(this));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
public class Midlet extends MIDlet {
public void startApp() {
Display.getDisplay(this).setCurrent(new banco(this));
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
?>
Copy code
Source: Tree-99352.zip
Jar: Tree-17566.jar
: 0 ♥
Pham_loi
Chức vụ: 16:22:01, 01-06-2016 |
nhận thông tin từ những người chơi khác
Bài này sẽ là kết thúc của hướng dẫn về sự kết hợp giữa php và j2me, những ứng dụng trực tuyến ngày càng cho thấy hiệu quả của nó trong thời đại công nghệ thông tin. Bạn không thể nào thiếu internet trong một ngày và chiếc di động là thứ hỗ trợ đắc lực nhất, ứng dụng web luôn không làm cho người sử dụng phải nhàm chán vì tính mới mỗi ngày của nó. Tôi cũng kì vọng vào sức mạnh của di động như về j2me thì không còn nhiều nữa, ngày nay android và ios ngày càng chiếm lĩnh trên thị trường di động nhất là android. Có thể một ngày nào đó những bài viết này chỉ là vô ích, nhưng ít nhất là tôi đã viết nó, bằng những kiến thức của mình và hy vọng điều gì đó. Do form get.html và server.php mà tôi đã viết có sự lựa chọn để chỉ hiện thị thông tin về những người chơi khác chứ không cho phép lấy về thông tin của nhân vật của ta. Do đó, ít nhất bạn phải có thêm một ai đó nữa cùng đăng nhập vào một id khác thì các bạn mới nhìn thấy kết quả của việc nhận dữ liệu. Ta thêm một biến dt (String) nữa và sẽ nhận dữ liệu vào đây, đồng thời vẽ ra màn hình. Class canvas sẽ thành thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[ acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
String[ info=tach(acommand[i,",");
robot nrb=new robot(w/2,h/2);
for(int j=0;j<rb.size();j++){
if(info[0.equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
}
class robot{
int x,y,nx,ny;
String say;
long lm=0;
public robot(int x,int y){
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[ s){
say=s[0;
nx=Integer.parseInt(s[1);
ny=Integer.parseInt(s[2);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
}
void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
?>
Copy code
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[ acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
String[ info=tach(acommand[i,",");
robot nrb=new robot(w/2,h/2);
for(int j=0;j<rb.size();j++){
if(info[0.equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
}
class robot{
int x,y,nx,ny;
String say;
long lm=0;
public robot(int x,int y){
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[ s){
say=s[0;
nx=Integer.parseInt(s[1);
ny=Integer.parseInt(s[2);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
}
void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
?>
Copy code
Đồng thời mog.java cũng thay đổi như sau đây:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
canvas cv=new canvas();
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
id=Integer.parseInt(st.substring(3));
if(id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
new Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
while(true){
try{
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
Thread.sleep(500);
switch(mode){
case 1:
break;
case 2:
break;
case 3:
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
//cùng lúc gửi thông tin lên server, ta cho nhận dữ liệu về luôn một thể, submit=4 cùng với id
cv.dt=send("http://holyeyed.99k.org/game/server.php","submit=4&id="+id);
break;}}catch(Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
canvas cv=new canvas();
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
id=Integer.parseInt(st.substring(3));
if(id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
new Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
while(true){
try{
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
Thread.sleep(500);
switch(mode){
case 1:
break;
case 2:
break;
case 3:
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
//cùng lúc gửi thông tin lên server, ta cho nhận dữ liệu về luôn một thể, submit=4 cùng với id
cv.dt=send("http://holyeyed.99k.org/game/server.php","submit=4&id="+id);
break;}}catch(Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
Kết quả ta được như sau:
Bây giờ ta sẽ chuyển dt (String) trong cv (canvas) thì mã lệnh dùng cho điều khiển các biến robot như ta đã làm lúc trước, dữ liệu nhận về như bạn thấy trên hình trên bao gồm: Mã BOM | id | user name | chuỗi | x | y # id | username | chuỗi | x |y #.... Class robot.java của ta sẽ thay đổi để nhận thêm nhiều giá trị hơn như sau:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class robot{
int x,y,nx,ny,id;
String say,user;
long lm=0;
//class robot bây giờ có 4 tham số khởi tạo: id, user, x ,y
public robot(int id,String user,int x,int y){
this.id=id;
this.user=user;
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[ s){
say=s[2;
nx=Integer.parseInt(s[3);
ny=Integer.parseInt(s[4);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
//vẽ thêm username cho dễ phân biệt
g.drawString(user,x,y-16,Graphics.TOP|Graphics.LEFT);
}
void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
?>
Copy code
class robot{
int x,y,nx,ny,id;
String say,user;
long lm=0;
//class robot bây giờ có 4 tham số khởi tạo: id, user, x ,y
public robot(int id,String user,int x,int y){
this.id=id;
this.user=user;
this.x=x;
this.y=y;
this.nx=x;
this.ny=y;
}
public void getcommand(String[ s){
say=s[2;
nx=Integer.parseInt(s[3);
ny=Integer.parseInt(s[4);
}
public void paint(Graphics g){
if(System.currentTimeMillis()-lm>200)
move();
g.setColor(0xf000f0);
g.fillRect(x,y,16,16);
//vẽ thêm username cho dễ phân biệt
g.drawString(user,x,y-16,Graphics.TOP|Graphics.LEFT);
}
void move(){
x+=x>nx?-1:(x==nx?0:1);
y+=y>ny?-1:(y==ny?0:1);}
}
?>
Copy code
Trong canvas.java cũng có những thay đổi, cụ thể là ta tách việc [phân tích dữ liệu gửi về vào hàm khac(), và cho vào trong vòng lặp paint(g), như vậy sẽ làm cho mọi thứ trở nên liên tục hơn. Ta cũng cần chú ý, bây giờ khởi tạo biến robot phải cần tới 4 tham số, cho nhân vật của ta có id=0, user=”me”, x=0, y=0:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,"me",0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
//sử dụng hàm khác để phân tích thông tin gửi về.
khac();
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
//hàm này dùng chuyển nhanh chuỗi thành số nguyên.
int toint(String s){return Integer.parseInt(s);}
//ta thêm một hàm khac với việc phân tích dữ liệu nhận về và vẽ những thông tin đó ra
void khac(){
//nếu như thông tin nhận về khác null, và dài hơn 3
if(dt!=null&&dt.length()>3){
//bỏ mã BOM, lấy từ kí tự thứ 3
command=dt.substring(3);
//tách ra thành những nhân vật khác nhau, cách nhau bằng dấu #
String[ acommand=tach(command,"#");
//tạo một Vector mới để nhận giá trị
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
//tách thông tin cho mỗi nhân vật, cách nhau bằng dấu |
String[ info=tach(acommand[i,"|");
if(info!=null){
//biến robot bây giờ có tới 4 tham số khởi tạo: id, user , x, y
robot nrb=new robot(toint(info[0),info[1,toint(info[3),toint(info[4));
//kiểm tra nếu như mà có id nào trong Vector cũ thì dùng lại thông tin đó.
for(int j=0;j<rb.size();j++){
//ta so sánh id để chắc là duy nhất id đó đại diện cho người chơi đó
if(Integer.parseInt(info[0)==(((robot)rb.elementAt(j)).id)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
//thêm vào Vector mới
trb.addElement((robot)nrb);}}
//cho Vector mới bằng Vector rb
rb=trb;}}
?>
Copy code
class canvas extends Canvas{
//biến nhận dữ liệu của các id khác
String dt;
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,"me",0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
//sử dụng hàm khác để phân tích thông tin gửi về.
khac();
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
//vẽ thông tin lên màn hình,
if(dt!=null)
g.drawString(dt,0,h,Graphics.LEFT|Graphics.BOTTOM);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
//hàm này dùng chuyển nhanh chuỗi thành số nguyên.
int toint(String s){return Integer.parseInt(s);}
//ta thêm một hàm khac với việc phân tích dữ liệu nhận về và vẽ những thông tin đó ra
void khac(){
//nếu như thông tin nhận về khác null, và dài hơn 3
if(dt!=null&&dt.length()>3){
//bỏ mã BOM, lấy từ kí tự thứ 3
command=dt.substring(3);
//tách ra thành những nhân vật khác nhau, cách nhau bằng dấu #
String[ acommand=tach(command,"#");
//tạo một Vector mới để nhận giá trị
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
//tách thông tin cho mỗi nhân vật, cách nhau bằng dấu |
String[ info=tach(acommand[i,"|");
if(info!=null){
//biến robot bây giờ có tới 4 tham số khởi tạo: id, user , x, y
robot nrb=new robot(toint(info[0),info[1,toint(info[3),toint(info[4));
//kiểm tra nếu như mà có id nào trong Vector cũ thì dùng lại thông tin đó.
for(int j=0;j<rb.size();j++){
//ta so sánh id để chắc là duy nhất id đó đại diện cho người chơi đó
if(Integer.parseInt(info[0)==(((robot)rb.elementAt(j)).id)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
//thêm vào Vector mới
trb.addElement((robot)nrb);}}
//cho Vector mới bằng Vector rb
rb=trb;}}
?>
Copy code
Jar: mog-96778.jar
: 0 ♥
Pham_loi
Chức vụ: 16:19:03, 01-06-2016 |
Gửi thông tin đến server theo từng đợt
Bài trước chúng ta đã có thể đăng nhập vào một hệ thống thành viên đơn giản, code trước tôi cũng đã post hết mã source của server. Chúng ta ở bài này sẽ sử dụng form send.html và gửi thông tin đến server thông qua form này. Nhưng đầu tiên chúng ta cần tạo ra một nhân vật của mình, tôi cũng sử dụng class robot để tạo nhân vật, nhưng chúng ta sẽ trực tiếp điều khiển nó thông qua phím chứ không phải là mã lệnh nữa. class canvas của chúng ta sẽ thành như thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
class canvas extends Canvas{
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[ acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
String[ info=tach(acommand[i,",");
robot nrb=new robot(w/2,h/2);
for(int j=0;j<rb.size();j++){
if(info[0.equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
}
?>
Copy code
class canvas extends Canvas{
textfield tf;
Vector rb=new Vector();
Font f=Font.getFont(0,0,8);
int w,h,k=0,fh;
String command="";
//tạo ra một biến robot để làm nhân vật của ta, tại vị trí (0,0)
robot me=new robot(0,0);
public canvas(){
setFullScreenMode(true);
w=getWidth();
h=getHeight();
fh=f.getHeight();
tf=new textfield("command",0,0,w);
}
public void paint(Graphics g){
g.setFont(f);
g.setColor(0);
g.fillRect(0,0,w,h);
tf.paint(g,k,true);
g.setColor(0xf0f0);
g.setClip(0,0,w,h);
g.drawString(command,0,fh*2,Graphics.TOP|Graphics.LEFT);
if(rb!=null)
for(int i=0;i<rb.size();i++)
((robot)rb.elementAt(i)).paint(g);
//vẽ nhân vật chúng ta lên canvas qua hàm paint của class robot
me.paint(g);
k=0;
repaint();
}
public void keyPressed(int k){
this.k=k;
if(k==-5){
command=tf.getString();
String[ acommand=tach(command,".");
Vector trb=new Vector();
for(int i=0;i<acommand.length;i++){
String[ info=tach(acommand[i,",");
robot nrb=new robot(w/2,h/2);
for(int j=0;j<rb.size();j++){
if(info[0.equals(((robot)rb.elementAt(j)).say)){nrb=(robot)rb.elementAt(j);
System.out.println("dectect");}}
nrb.getcommand(info);
trb.addElement((robot)nrb);}
rb=trb;}
//ta thêm đoạn này để điều khiển trực tiếp biến me (robot) thông qua nhấn phím
if(k==-4){me.nx=me.x+5;}
if(k==-3){me.nx=me.x-5;}
if(k==-2){me.ny=me.y+5;}
if(k==-1){me.ny=me.y-5;}
}
public void keyReleased(int k){this.k=0;}
public String[ tach(String s,String c){
Vector v=new Vector();
if(!s.endsWith(c)){s+=c;}
int st=0,np=s.indexOf(c,st);
while(np!=-1){
v.addElement((String)s.substring(st,np));
st=np+c.length();
np=s.indexOf(c,st);}
String[ rt=new String[v.size();
v.copyInto((String[)rt);
for(int i=0;i<rt.length;i++){System.out.println(rt[i+rt[i.length());}
return rt;}
}
?>
Copy code
Xong bây giờ thì chỉnh sửa một chút ở file mog.java để gửi thông tin lên server thông qua hàm send mà ta đã biết. địa chỉ vẫn là địa chỉ cũ, còn thông số thì có thay khác theo form send.html chúng ta đã biết (nghiên cứu html nhé).
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
canvas cv=new canvas();
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
id=Integer.parseInt(st.substring(3));
if(id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
new Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
while(true){
try{
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
Thread.sleep(500);
switch(mode){
case 1:
break;
case 2:
break;
case 3:
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
break;}}catch(Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
canvas cv=new canvas();
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
//nếu như trả về dữ liệu khác null thì cho hiện canvas.
id=Integer.parseInt(st.substring(3));
if(id>0){
Display.getDisplay(this).setCurrent(cv);
//chuyển mode sang 3, và cho khởi động thread
mode=3;
new Thread(this).start();}}
//khi thread khởi động nó sẽ không dừng lại
public void run(){
while(true){
try{
//cho ngừng một khoảng thời gian (500millis) sau mỗi lần gửi thông tin lên server
Thread.sleep(500);
switch(mode){
case 1:
break;
case 2:
break;
case 3:
//thông qua hàm send gửi các thông tin gồm: id, mess, x, y lên server.
send("http://holyeyed.99k.org/game/server.php","submit=3&id="+id+"&mess=holyeyed&x="+cv.me.x+"&y="+cv.me.y);
break;}}catch(Exception e){}}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
Vậy thôi, dù bạn có chạy chương trình thì chỉ có thể thấy là điều khiển được nhân vật hình vuông thôi, chứ không biết nó có gửi thông tin đúng lên server hay không. Nhưng đừng lo, theo lý thuyết là vậy và bạn sẽ biết được là nó có thật sự gửi được hay không thì chờ bài sau nhé.
Source: mog-84566.zip
Jar: mog-57614.jar
: 0 ♥
Pham_loi
Chức vụ: 16:16:29, 01-06-2016 |
một form login đơn giản
có vẻ như bài này không có liên quan gì đến bài trước cả, và cũng đừng có nghĩ là tôi đang chuyển qua nói về lập trình web. Chỉ là có những thứ cần thiết cho quá trình lập trình mà chúng ta cần biết. Chúng ta sẽ có một trang như thế này, code của nó tôi sẽ post cuối bài:
http://holyeyed.99k.org/game/reg.html
http://holyeyed.99k.org/game/get.html
http://holyeyed.99k.org/game/login.html
http://holyeyed.99k.org/game/send.html
trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé. bây giờ chúng ta hãy chú ý tới midlet của chúng ta. trong một lúc chúng ta sẽ phải gửi dữ liệu từ ứng dụng lên server đồng thời cũng nhận từ server về thông tin về những người chơi khác. Chúng ta sẽ tạo một form đăng nhập đơn giản, còn phần đăng kí các bạn tự viết nhé. File mog.java của chúng ta sẽ như thế này:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\mog.java
<?php
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import java.io.*;
import javax.microedition.io.*;
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
if(st!=null)
Display.getDisplay(this).setCurrent(new canvas());}
public void run(){
switch(mode){
case 1:
break;
case 2:
break;}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import java.io.*;
import javax.microedition.io.*;
public class mog extends MIDlet implements Runnable{
//tạo biến nhận giá trị của user và pass
String user,pass;
//id là giá trị của trả về ứng với mỗi user có một số id riêng biệt
int id,mode=0;
public void startApp(){
//chúng ta cho hiển thị form login là một class mở rộng từ class Form
Display.getDisplay(this).setCurrent(new login(this));}
public void destroyApp(boolean t){}
public void pauseApp(){}
//hàm cv này dùng để nhận giá trị từ login.java sau khi đã thực hiện nhấn lệnh ok
public void cv(String user,String pass){
this.user=user;
this.pass=pass;
//hàm send trả về dữ liệu lấy từ server là id nhưng có kèm theo mã BOM của utf-8
String st= send("http://holyeyed.99k.org/game/server.php","submit=2&user="+user+"&pass="+pass);
if(st!=null)
Display.getDisplay(this).setCurrent(new canvas());}
public void run(){
switch(mode){
case 1:
break;
case 2:
break;}}
//hàm send dùng thực hiện kết nối, nhận 2 tham số là địa chỉ web và các thông số gửi đi
String send(String add,String para){
try{
HttpConnection hc=(HttpConnection)Connector.open(add);
//set method giống với form trên server
hc.setRequestMethod(HttpConnection.POST);
//khi method là POST thì phải có content-type
hc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//phần sau là đọc và trả về chuỗi
OutputStream os=hc.openOutputStream();
os.write(para.getBytes());
InputStream is=hc.openDataInputStream();
int c;
StringBuffer sb=new StringBuffer();
while((c=is.read())!=-1){sb.append((char)c);}
is.close();
os.close();
hc.close();
System.out.println(sb.toString());
return sb.toString();
}catch(Exception e){}
return null;}}
?>
Copy code
Đó là trong mog.java, còn một file nữa đó là login.java, đây là class mở rộng từ Form và được tạo dựng sẵn có các field và command theo ý mình, khi sử dụng chỉ cần cho khởi tạo và hiện thị, như các bạn thấy ở trong class mog ở trên:
C:\Users\thanhliem\Documents\NetBeansProjects\mog\src\login.java
<?php
import javax.microedition.lcdui.*;
//class login là một Form được tạo dựng sẵn
public class login extends Form implements CommandListener {
//nó chứa 2 textfield và một command
TextField user=new TextField("use","",15,0);
TextField pass=new TextField("pass","",15,TextField.PASSWORD);
Command ok=new Command("ok",Command.OK,2);
mog m;
public login(mog m){
//do mở rộng từ Form nên khi khởi tạo phải cho nó tiêu đề qua hàm super
super("đăng nhập");
this.m=m;
//thêm và các field và command
append(user);
append(pass);
addCommand(ok);
setCommandListener(this);}
public void commandAction(Command c,Displayable d){
//khi nhấn phím ok thì nó sẽ chạy hàm cv trong class mog.java và nhận các giá trị từ các field
if(c==ok){m.cv(user.getString(),pass.getString());}}
}
?>
Copy code
import javax.microedition.lcdui.*;
//class login là một Form được tạo dựng sẵn
public class login extends Form implements CommandListener {
//nó chứa 2 textfield và một command
TextField user=new TextField("use","",15,0);
TextField pass=new TextField("pass","",15,TextField.PASSWORD);
Command ok=new Command("ok",Command.OK,2);
mog m;
public login(mog m){
//do mở rộng từ Form nên khi khởi tạo phải cho nó tiêu đề qua hàm super
super("đăng nhập");
this.m=m;
//thêm và các field và command
append(user);
append(pass);
addCommand(ok);
setCommandListener(this);}
public void commandAction(Command c,Displayable d){
//khi nhấn phím ok thì nó sẽ chạy hàm cv trong class mog.java và nhận các giá trị từ các field
if(c==ok){m.cv(user.getString(),pass.getString());}}
}
?>
Copy code
• Do càng về sau bài càng phức tạp nên tôi sẽ nói ít thôi, hãy đọc là chính và rồi sẽ hiểu. • Như trên là chúng ta đã tạo ra một ứng dụng login đơn giản với việc đăng kí trên server rồi.
Source: mog-74430.zip
Jar: mog-38525.jar
Html: game-99233.zip
: 0 ♥