Thứ Bảy, 21 tháng 11, 2015

[Android] Thế giới bất tử: bạn và sắc đẹp

sau khi tôi kết thúc serial thế giới bất tử trên J2me, tôi đã bắt đầu một câu chuyện khác trên thiết bị Android, vẫn là những tên cũ, và cách chơi tươg tự, trong phần đầu tiên này bạn sẽ đi tìm và giải cứu cho mimi.
Trong một buổi chiều mimi và những đứa trẻ đi chơi mà không thấy về, Hotra đã lên núi để tìm những người bạn, cậu đã đi vào một thế giới khác, ở nơi đó Hotra tìm thấy một âm mưu và những điều bí ẩn, hãy giúp Hotra giải cứu Mimi.



https://app.box.com/s/p2qgsy2fylr4dbe8kac79sewslowjvdv

Thứ Bảy, 7 tháng 12, 2013

Thế giới bất tử 7: cứu họ (cuối cùng)

serial game thế giới bất tử cuối cùng cũng kết thúc. phần trước kể về chuyện nhóm bạn bị Snake biến thành vật vô tri vô giác, tưởng chừng như chẳng còn cơ hội nào cho họ nữa, nhưng trong lúc đó Kelly trở lại và quyết định cứu lấy những người bạn và kế cả thế giới dù phải chống lại người mà cô thân thiết....
http://wapupload.net/17274

Chủ Nhật, 19 tháng 5, 2013

game thế giới bất tử: Mirror World

lần trước kể đến lúc Orli đã đánh bại được nhện tinh Kidomaru, đến hôm nay thì Orli lại có cơ hội trở lại với thế giới thứ 2 nơi mà anh rất muốn trở lại lúc này. Orli được mọi người trong làng cho biết là Kame là người có thể giúp anh trở về thế giới thứ 2 và gặp lại những người bạn, Orli đi tìm Kame, nhưng không may Kame lại đang bị bắt cóc bởi một toán quái vật. Vậy là Orli đi tìm giết quái vật cứu lại Kame, để đền ơn Kame cho Orli thử cỗ máy thời gian của ông và anh đã trở lại được nơi mình mong muốn, ở đây Orli biết được thế giới đang bị đảo lộn bởi Snake vậy là anh lại vào trong một hành trình mới....


download

Thứ Năm, 16 tháng 5, 2013

game tính nhẩm

game này chỉ là một phần nhỏ, trong đây người chơi sẽ xác định xem biều thức tính toán là đúng hay sai, game dùng hình ảnh để hiện thị những con số.
và game bao gồm: một class dùng vẽ chuỗi các phép tính:

C:\Users\thanhliem\Documents\NetBeansProjects\mathgame\src\font.java

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

public class font {
    //chuỗi kí tự dùng trong hình
    String c = "=+-0123456789";
//vị trí bắt đầu của từng kí tự trong hình
    int[] pos = {0, 15, 34, 47, 67, 80, 97, 114, 133, 150, 169, 186, 205, 222};
    Image im;

    public font() {
        try {
            im = Image.createImage("/math.png");
        } catch (Exception e) {
        }
    }
//hàm vẽ chuỗi
    void drawString(Graphics g, int x, int y, String ch) {
        for (int i = 0; i < ch.length(); i++) {
            int cp = c.indexOf(ch.charAt(i));
            drawChar(g, x, y, cp);
            x += pos[cp + 1] - pos[cp];
        }
    }
//hàm vẽ kí tự
    void drawChar(Graphics g, int x, int y, int c) {
        g.drawRegion(im, pos[c], 0, pos[c + 1] - pos[c], im.getHeight(), 0, x, y, 0);
    }
}
-->
và một class xử lí game, sự kiện người dùng:
C:\Users\thanhliem\Documents\NetBeansProjects\mathgame\src\mathgame.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class mathgame extends Canvas implements Runnable {

    int w, h, count = 10, score = 0;
    Random rd = new Random();
    int k;
    font f = new font();
    int mode = 0;
    int a, b, c, o;
    String dis, dau, ok;
    boolean t;

    public mathgame() {
        setFullScreenMode(true);
        w = getWidth();
        h = getHeight();
        general();
    }

    public void paint(Graphics g) {
        //check xem chọn đúng hay sai
        if (mode == 0) {
            if (k == -6) {
                if (!t) {
                    ok = "ok";
                    score++;
                } else {
                    ok = "bad";
                }
                mode = 1;
            }
            if (k == -7) {
                if (t) {
                    ok = "ok";
                    score++;
                } else {
                    ok = "bad";
                }
                mode = 1;
            }
            k = 0;
        }
        g.setColor(0);
        g.fillRect(0, 0, w, h);
        g.setColor(0xf0f0);
        switch (mode) {
            case 0: {//xem xét phép toán
                f.drawString(g, 5, w / 2, dis);
                g.drawString("còn lại " + count + " câu", 0, 40, Graphics.LEFT | Graphics.BOTTOM);
                g.drawString("sai", 0, h, Graphics.LEFT | Graphics.BOTTOM);
                g.drawString("đúng", w, h, Graphics.RIGHT | Graphics.BOTTOM);
            }
            break;
            case 1: {//hiện thị kết quả chọn
                g.drawString(ok, 0, h / 2, Graphics.LEFT | Graphics.BOTTOM);
                if (count > 0) {
                    general();
                    mode = 0;
                } else {
                    mode = 2;
                }
                slept(2500);
            }
            break;
            case 2: {
                g.drawString("Điểm " + score, 0, h / 2, Graphics.LEFT | Graphics.BOTTOM);
                slept(1000);
            }
            break;
        }
    }
    
    public void run(){
    while(true){
    repaint();}}
//hàm tổng hợp bài toán tiếp theo.
    void general() {
        count--;
        a = hai();
        o = hai() % 2;
        b = hai();
        if (o == 0) {
            dau = "+";
            c = a + b;
        } else {
            dau = "-";
            c = a - b;
        }
        t = hai() % 2 == 0 ? true : false;
        if (t) {
            dis = a + dau + b + "=" + c;
        } else {
            dis = a + dau + b + "=" + (c + hai() % 8 + 1);
        }
    }
//hàm dừng lại một khoảng thời gian
    void slept(long t) {
        try {
            Thread.sleep(t);
        } catch (Exception e) {
        }
    }
//hàm lấy về số nguyên 2 chữ số

    int hai() {
        slept(20);
        return Math.abs(rd.nextInt()) % 99;
    }
//hàm nhận biết phím bấm

    public void keyPressed(int k) {
        this.k = k;
    }
}

--> cuối cùng là một Midlet để hiện thị:
C:\Users\thanhliem\Documents\NetBeansProjects\mathgame\src\Midlet.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Midlet extends MIDlet {
    public void startApp() {
        mathgame mg=new mathgame();
        new Thread(mg).start();
    Display.getDisplay(this).setCurrent(mg);}

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

--> hình ảnh dùng trong game làm font số là:

source

Thứ Bảy, 20 tháng 4, 2013

thế giới bất tử: phần tiếp theo

cũng đã lâu lắm rồi từ khi bắt đầu viết serial game thế giới bất tử, nhưng có lẽ là không sao quên được cái cảm giác được hiện thực hóa câu chuyện của mình thành game java. dù là đơn giản và không mấy ly kì như những game hiện thời, nhưng đó là những gì mà tôi có thể làm, tôi không thực sự nghĩ là nó sẽ mang lại lợi ích gì ngoài niềm vui cho chính bản thân mình. câu chuyện về một chàng trai bị lạc vào một thế giới khác lạ và nơi đó đã thật sự là nơi mà cậu không bao giờ quên được...


http://holyeyed.99k.org/up/parapol-44699.jar

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

Đến nơi tận cùng

Một khi bạn nhận ra rằng những người xung quanh bạn thật quá vô tình thì bạn cũng không còn trông mong gì họ nữa. Cách đây khoảng 2 năm gì đó tôi cũng quan tâm nhiều người lắm nhưng bây giờ thì điều đó không còn tồn tại nữa. Dù tôi biết là cho đến ngày tận cùng thì tôi vẫn nhớ tới họ. Liệu rồi sau này tôi còn quan tâm đến ai nữa không.
Tôi từng nhớ một câu nói rất hay, không biết có đúng hay không: tốt với tất cả thì cũng như không tốt với ai cả. Chuyện này cũng không phải là tại mình, những suy nghĩ của họ thì không phải mình có thể điều khiển được. Tôi không phải muốn mọi người phải trả lại những tình cảm mà tôi bỏ ra, nhưng vô tình quá đã khiến trái tim người ta tan nát.
Một hôm chợt thức dậy và phát hiện ra rằng, hình như mình đã già rồi mà không có một người bạn được gọi là tri kỉ. Có phải là mình xấu xa lắm không, nhưng nghĩ kĩ lại thì không phải như vậy. Có những người thật sự xấu hơn mình nhiều nhưng họ vẫn có cặp có đôi, và một câu hỏi tại sao lại xuất hiện. Tôi từng nhìn thấy cuộc sống thật nhàm chán khi mỗi ngày đều tìm kiếm hạnh phúc bằng việc giúp đỡ người khác, tại sao không có ai muốn nhìn thấy tôi hạnh phúc, muốn làm tôi hạnh phúc, tất nhiên không phải là người trong gia đình tôi.
Thật chất có nhiều câu chuyện làm tôi cảm thấy điều đó cũng bình thường như là final fantasy 7 vậy, dù Tifa có tốt với cloud đến đâu thì sao, cuối cùng cũng không là gì cả, chỉ chuốc thêm đau khổ về mình. Tôi cũng vậy, đã biết là vô vọng thì tại sao lại như vậy, dù cuộc sống này có đến đâu thì tôi cũng có những người thân bên cạnh. Những người cuối cùng vẫn không bỏ rơi tôi...

A new World

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

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

public class hole {
    //những điểm thông giữa 2 map.
int[][] hole={{0,3,5},{1,5,4}};
//những vị trí bản đồ mà từ đó sẽ thoát ra.
int[] out={1,0};
//kiểm tra xem có phải đang trong điểm chuyển không.
boolean inhole=true;
//bản đồ hiện tại.
int m;
//hàm kiểm tra xem có nằm trong điểm chuyển hay không.
public boolean check(int nm,int x,int y,map m){
    //lần lượt check qua từng điểm chuyển.
for(int i=0;i<hole.length;i++){
   int nx=x/16;
   int ny=y/16;
if(nm==hole[i][0]&&nx==hole[i][1]&&ny==hole[i][2]){
    this.m=out[i];
return true;}
}
return false;}
//hàm chuyển map.
public void change(int nm,int x,int y,map m){
if(check(nm,x,y,m)){
if(!inhole){
    inhole=true;
m.m=hole[this.m][0];
m.load("m"+hole[this.m][0]+".mbd",hole[this.m][1],hole[this.m][2],m.w,m.h);}}
else{
inhole=false;}
}
}
Nhưng khi thay đổi map thì nhân vật phụ cũng thay đổi luôn đó, cho nguyên nhân đó nên chúng ta cũng thay đổi cách tạo nhân vật phụ, nhân vật dẫn chuyện cũng nên thay đổi, nhưng ở đây tôi không nói nhiều về chuyện đó. Chúng ta chỉ thay đổi một chút để game không bị lỗi, file map.java thành thế này. map.java
C:\Users\thanhliem\Documents\NetBeansProjects\RPG\src\map.java
import java.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class map {
    //các thông số gồm có số cột, số hàng trong map, kích thước mỗi tile tw, th.
    //tọa độ map (x,y), phím bấm k, số lần di chuyển nhỏ.
    int mw,mh,tw,th,x,y,k,step=0,w,h,m=0;
    //chứa dữ liệu các tile trong map.
    byte[] map;
    //hình ảnh dùng làm tile
    Image tiles,other;
    //dùng class TiledLayer có sẵn trong GameCanvas để tạo map.
    TiledLayer tl;
    //mốc thời gian di chuyển lần cuối
    long lm=0;
    //thêm một biến other ot dùng làm nhân vật phụ.
        other[] ot;
        //thêm biến vẽ nhân vật dẫn thoại.
        trail tr=new trail();
        //tạo biến check để chuyển map
        hole hl=new hole();
    //hàm khởi tạo sẽ tải hình ảnh làm tile vào class map.
    public map(String im){
    try{
    this.tiles=Image.createImage("/"+im);
    }catch(Exception e){}}
    //hàm load dùng tải file nguồn và phân tích các thông số trong đó vào map.
    //bây giờ ta có thông số xác định tọa độ ban đầu nhân vật, tại cột c, dòng r và so sánh với độ dài rộng màn hình.
public void load(String fn,int c,int r,int w,int h){
    //file nguồn là dữ liệu với cấu trúc: [số cột]-[số hàng]-[tile width]-[tile height]-[dữ liệu map (số cột * số hàng)]
try{
InputStream is=getClass().getResourceAsStream("/"+fn);
mw=is.read();
mh=is.read();
tw=is.read();
th=is.read();
map=new byte[is.available()];
is.read(map);
is.close();
//tạo TiledLayer tl từ những gì đã nhận được.
tl=new TiledLayer(mw,mh,tiles,tw,th);
//lát gạch vào TiledLayer tl.
for(int i=0;i<mh;i++){
for(int j=0;j<mw;j++){
tl.setCell(j, i, map[i*mw+j]);
}}
this.w=w;
this.h=h;
x=w/2-c*tw;
y=h/2-r*th;
//tạo file ảnh cho nhân vật phụ và khởi tạo ot ở vị trí cột 4 và hàng 6 trên map.
other=Image.createImage("/other.png");
ot=new other[3];
for(int i=0;i<ot.length;i++)
{
    Random d=new Random();
    int cot=Math.abs(d.nextInt())%mw,rot=Math.abs(d.nextInt())%mh;
    ot[i]=new other(other,cot*16,rot*16);
Thread.sleep(50);}
}catch(Exception e){}} 
//hàm paint dùng vẽ tl lên Graphics g, và nhận giá trị phím bấm vào hàm move.
void paint(Graphics g,int k){
    move(k);
    g.setColor(0);
    g.drawRect(x,y,tl.getWidth(),tl.getHeight());
tl.paint(g);
//vẽ nhân vật phụ lên map.
for(int i=0;i<ot.length;i++)
ot[i].paint(g,this);
//vẽ nhân vật dẫn chuyện ra màn hình.
tr.paint(g,this,k);
//dùng hàm để chuyển map khi phát hiện đúng điều kiện.
hl.change(this.m, w/2-x, h/2-y, this);
}
//hàm move nhận giá trị phím bấm k và kiểm tra điều kiện để thay đổi tọa độ của map.
void move(int k){
    //do mỗi lần di chuyển ta cho chuyển 16 pixel, nên ta cần chia ra 4 lần di chuyễn nhỏ để hình ảnh mượt hơn.
    //nếu thấy không cần bước di chuyển nhỏ nào nữa thì cho di gán di chuyển tiếp
if(step==0){
    //gán tọa độ cũ vào các biến gx gy.
    int gx=x,gy=y;
    //tính tọa độ mới.
    switch(k){
        case -1:
            gy+=16;
    break;
    case -2:
            gy-=16;
    break;
    case -3:
            gx+=16;
    break;
    case -4:
            gx-=16;
    break;}
    //kiểm tra xem toa6 độ mới có chạm tường không.
if(check(w/2-gx,h/2-gy)){
this.k=k;
step=4;}
}else{
    //nếu còn lượt di chuyển nhỏ step!=0, thì xét đến thời gian di chuyển lần cuối.
    if(lm<=curr()-30){
    step--;
    switch(this.k){
        case -1:
            y+=th/4;
    break;
        case -2:
            y-=th/4;
    break;
        case -3:
            x+=tw/4;
    break;
        case -4:
            x-=tw/4;
    break;}
    lm=curr();}
}
//gán vị trí cho tl.
tl.setPosition(x, y);
}
  long curr(){return System.currentTimeMillis();}
  //hàm kiểm tra xem có chạm tường không, tường là gạch số 3.
  boolean check(int a,int b){
      if(a<0||b<0||a>mw*16-16||b>mh*16-16){return false;}
 return tl.getCell(a/16, b/16)<3;}
}

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