Hi, Khách!
![]() | ![]() ![]() ![]() ![]() |
record manager system(rms) và save game
Nếu như không có gì thay đổi thì gần như là bạn có thể hoàn thành một trò chơi đơn giản rồi đó, chỉ có điểu mỗi lần thoát khỏi trò chơi thì đâu lại quay lại từ đầu. tuy nhiên có khi nào các bạn để ý là những ứng dụng java thường hay tăng kích thước sau khi sử dụng không. Đó là vì chúng tạo ra những tập tin ẩn hệ thống để lưu lại những gì cần thiết( các cài đặt, tên người dùng, ngày giờ đăng kí, thông tin…). Java cung cấp một class gọi là record manager system(hệ thống quản lí mẫu tin, gọi tắt là rms) dùng để tạo ra những file lưu lại thông tin của những phiên làm việc trước.
Để sử dụng được class này ta chú ý những điều sau đây:
Những thao tác mà ta cần thực hiện trên recordstore như sau:
<?php
Recordstore rs=RecordStore.openRecordStore("data",true);//mở 1 recordstore có tên là data nếu đã tồn tại , nếu chưa có thì tạo mới. true ở đây là chỉ việc sẽ tạo mới nếu chưa tồn tại, để false sẽ không tạo mới dù không tồn tại
int rs.addRecord(byte[,offset,length byte);// trả về id của record khi thực hiện lệnh thêm một record mới. Các thông tin cho việc thêm record là một byte array, điểm bắt đầu, số byte tính từ điểm bắt đầu.
void rs.setRocord(ID,byte[,offset,length byte); // tương tự add record, nhưng ở đây nó là một thao tác không trả về ID mà chỉ định sẵn ID sẽ mang thông tin mới này (id record phải tồn tại rồi).
byte[ dt=rs.getRecord(ID) // nhận giá trị của một record thông qua ID của nó, trả về giá trị bytearray. dùng:
String s=new String(dt,0,dt.length); // chuyển giá trị bytearray thành chuỗi và thao tác dễ hơn.
Hoặc:
int getRecord(ID,buffer,offset); // chuyển giá trị vào một buffer và trả về số byte của record. Một buffer có thể là một byte array hoặc là được tạo ra bằng lệnh: StringBuffer sb=new StringBuffer();
void deleteRecord(ID); // tất nhiên là xóa record rồi.
Sau khi sử dụng xong recordStore thì nên đóng nó lại để tiết kiệm bộ nhớ, và nếu không cần nó nữa thì xóa luôn nó đi cũng không sao vì ta đã có được các thông tin cần thiết rồi:
void rs.closeRecordStore();
void deleteRecordStrore(tên record);
?>
Copy code
Recordstore rs=RecordStore.openRecordStore("data",true);//mở 1 recordstore có tên là data nếu đã tồn tại , nếu chưa có thì tạo mới. true ở đây là chỉ việc sẽ tạo mới nếu chưa tồn tại, để false sẽ không tạo mới dù không tồn tại
int rs.addRecord(byte[,offset,length byte);// trả về id của record khi thực hiện lệnh thêm một record mới. Các thông tin cho việc thêm record là một byte array, điểm bắt đầu, số byte tính từ điểm bắt đầu.
void rs.setRocord(ID,byte[,offset,length byte); // tương tự add record, nhưng ở đây nó là một thao tác không trả về ID mà chỉ định sẵn ID sẽ mang thông tin mới này (id record phải tồn tại rồi).
byte[ dt=rs.getRecord(ID) // nhận giá trị của một record thông qua ID của nó, trả về giá trị bytearray. dùng:
String s=new String(dt,0,dt.length); // chuyển giá trị bytearray thành chuỗi và thao tác dễ hơn.
Hoặc:
int getRecord(ID,buffer,offset); // chuyển giá trị vào một buffer và trả về số byte của record. Một buffer có thể là một byte array hoặc là được tạo ra bằng lệnh: StringBuffer sb=new StringBuffer();
void deleteRecord(ID); // tất nhiên là xóa record rồi.
Sau khi sử dụng xong recordStore thì nên đóng nó lại để tiết kiệm bộ nhớ, và nếu không cần nó nữa thì xóa luôn nó đi cũng không sao vì ta đã có được các thông tin cần thiết rồi:
void rs.closeRecordStore();
void deleteRecordStrore(tên record);
?>
Copy code
và sau đây là ví dụ minh họa cho dễ hiểu, chúng ta sẽ sử dụng project vd lần nữa. chẳng hạn nhân vật ta di chuyển trên map và ta muốn mỗi lần thóat ra thì vị trí của nhân vật sẽ đựơc lưu lại cho lần sau mở lên. Ta cần làm ở đây là ghi giá trị x,y của nhân vật và trong recordstore. Tôi sẽ sửa lại file map.java để cho đơn giản hơn, nhân vật của ta sẽ di chuyển tự do không bị giới hạn, và khi nhấn phím 5 sẽ thoát game, file map.java như sau:
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private vd main;
private add sp=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t,ch;
private TiledLayer tl;
private int x=w/2,y=h/2,f=0;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this); t.start();}
public void run()
{
try{
ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++){
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map);}
while(play){ input();
g.setColor(0x000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngung mot thoi gian
}
}
void input(){
int k=getKeyStates();
if(k==UP_PRESSED){y+=3; f=1;}
if(k==LEFT_PRESSED){x+=3; f=2;}
if(k==RIGHT_PRESSED){x-=3; f=3;}
if(k==DOWN_PRESSED){y-=3; f=0;}
if(k==FIRE_PRESSED){play=false; main.destroyApp(true);}
}
}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private vd main;
private add sp=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t,ch;
private TiledLayer tl;
private int x=w/2,y=h/2,f=0;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this); t.start();}
public void run()
{
try{
ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++){
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map);}
while(play){ input();
g.setColor(0x000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngung mot thoi gian
}
}
void input(){
int k=getKeyStates();
if(k==UP_PRESSED){y+=3; f=1;}
if(k==LEFT_PRESSED){x+=3; f=2;}
if(k==RIGHT_PRESSED){x-=3; f=3;}
if(k==DOWN_PRESSED){y-=3; f=0;}
if(k==FIRE_PRESSED){play=false; main.destroyApp(true);}
}
}
?>
Copy code
Còn bây giờ là một class chức năng, gồm hai chức năng là save và load:
Data.java có nội dung như sau:
<?php
import javax.microedition.rms.*;
public class data
{private RecordStore rs;
public data(){}
void save(String name,int id,String info){
try{
rs=RecordStore.openRecordStore("name",true);
int nr=rs.getNumRecords();
if(nr<id){//nếu chưa tồn tại record tại id cần thêm thì thêm vào record null tại id đó
byte[ a={};//dữ liệu null
for(int i=0;i<(id-nr);i++){int d=rs.addRecord(a,0,0);}//thêm vào 2 id: 1 và 2
}
byte[ bdt=info.getBytes();
rs.setRecord(id,bdt,0,bdt.length);
rs.closeRecordStore();
bdt=null;
}
catch(Exception e){}
}
String load(String name,int id){
String t="";
try{
rs=RecordStore.openRecordStore("name",true);
byte[ bdt=rs.getRecord(id);
t=new String(bdt,0,bdt.length);
}
catch(Exception e){}
return t;
}
}
?>
Copy code
import javax.microedition.rms.*;
public class data
{private RecordStore rs;
public data(){}
void save(String name,int id,String info){
try{
rs=RecordStore.openRecordStore("name",true);
int nr=rs.getNumRecords();
if(nr<id){//nếu chưa tồn tại record tại id cần thêm thì thêm vào record null tại id đó
byte[ a={};//dữ liệu null
for(int i=0;i<(id-nr);i++){int d=rs.addRecord(a,0,0);}//thêm vào 2 id: 1 và 2
}
byte[ bdt=info.getBytes();
rs.setRecord(id,bdt,0,bdt.length);
rs.closeRecordStore();
bdt=null;
}
catch(Exception e){}
}
String load(String name,int id){
String t="";
try{
rs=RecordStore.openRecordStore("name",true);
byte[ bdt=rs.getRecord(id);
t=new String(bdt,0,bdt.length);
}
catch(Exception e){}
return t;
}
}
?>
Copy code
Sau đó trong map.java ta sử dụng class chức năng data.java cho việc lưu và nhận dữ liệu, map.java sẽ như thế này:
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private data dt=new data();
private vd main;
private add nv=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t;
private TiledLayer tl;
private int x=0,y=0;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this); t.start();}
public void run()
{try
{x=Integer.parseInt(dt.load("save",1),10);
y=Integer.parseInt(dt.load("save",2),10);}
catch(Exception e){}
try{ ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++){
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map);}
while(play){ input();
g.setColor(0×000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngưng một thời gian
}
}
void input(){
int k=getKeyStates();
if(k==UP_PRESSED){y++;}
if(k==LEFT_PRESSED){x++;}
if(k==RIGHT_PRESSED){x--;}
if(k==DOWN_PRESSED){y--;}
if(k==FIRE_PRESSED){
play=false;
dt.save("save",1,x+"");
dt.save("save",2,y+"");
main.destroyApp(true);}
}
}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class map extends GameCanvas implements Runnable
{
private data dt=new data();
private vd main;
private add nv=new add();
private Graphics g=getGraphics();
int w=getWidth();
int h=getHeight();
private Image t;
private TiledLayer tl;
private int x=0,y=0;
private boolean play=true;
private int[ map={
4,4,4,1,1,4,4,4,4,4,
4,4,1,1,4,4,4,4,4,4,
4,4,1,1,4,4,1,1,4,4,
4,4,1,1,3,1,1,4,4,4,
4,4,1,1,1,1,1,1,4,4,
4,4,4,4,1,1,1,2,4,4,
1,4,4,4,1,1,4,4,4,4,
1,4,4,4,1,1,4,4,4,1,
1,4,4,4,4,4,4,4,4,1,
1,1,4,4,4,4,4,4,1,1
};
public map(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this); t.start();}
public void run()
{try
{x=Integer.parseInt(dt.load("save",1),10);
y=Integer.parseInt(dt.load("save",2),10);}
catch(Exception e){}
try{ ch=Image.createImage("/s.png");
t=Image.createImage("/t.png");}catch(Exception e){}
tl=new TiledLayer(10,10,t,32,32);
for(int i=0;i<map.length;i++){
int col=i%10;
int row=(i-col)/10;
tl.setCell(col,row,map);}
while(play){ input();
g.setColor(0×000000);
g.fillRect(0,0,w,h);
tl.setPosition(x,y);
tl.paint(g);
sp.addsprite(g,ch,f,w/2,h/2);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngưng một thời gian
}
}
void input(){
int k=getKeyStates();
if(k==UP_PRESSED){y++;}
if(k==LEFT_PRESSED){x++;}
if(k==RIGHT_PRESSED){x--;}
if(k==DOWN_PRESSED){y--;}
if(k==FIRE_PRESSED){
play=false;
dt.save("save",1,x+"");
dt.save("save",2,y+"");
main.destroyApp(true);}
}
}
?>
Copy code
Như vậy là coi như xong những bước cơ bản nhất của một game java cần có rồi đó, nếu như muốn hòan thiện một game thật sự, có thể các bạn cần đau đầu một chút vì đây chỉ là những class cơ bản thôi, các bạn có thể tự tạo ra nhưng class chức năng khác cho công việc của riêng mình, điều quan trọng là trước khi làm mình cần suy nghĩ xem nó sẽ như thế nào trước đã rồi hẳn viết code, cũng như không thể nào đánh caro mà không suy nghĩ hay dựng nhà mà không vẽ thiết kế. mong là các bạn có thể tạo ra những trò chơi hay ho cho mình và cộng đồng game mobile. Còn nếu có thắc mắc gì thì cũng có thể để lại lời nhắn qua địa chỉ mail: holyeyed@ gmail.com, tôi sẽ sẵn sàng giúp đỡ thôi.
Chỉnh sửa lúc 2016-07-09 14:22 bởi Pham_loi

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