Insane
logo

Chatbox|Admin nhận làm wap/web, giá cả thương lượng... Thông tin admin tại mỗi bài viết.
Home · Bang hội ·
* Đăng Nhập hoặc Đăng Kí
để sử dụng hết chức năng của diễn đàn.
Hi, Khách!
HomeBang hội » Thủ thuật » Nokia s40 » » Xem bài viết
Xuống dưới »
avatar by Pham_loi Pham_loi
Chức vụ:
01:11:52, 27-05-2016

FireWork-tạo pháo hoa đơn giản trên j2me sử dụng vector

Download FireWork.jar
code gồm 4 file Midlet.java, main.java, manager.java và firework.java.
Trước tiên tạo file chính Midlet.java và để đó sửa sau .
<?php
import javax
.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * @author ThanhAn
 */
public class Midlet extends MIDlet {
Display dis;

    public 
void startApp() {
        
dis=Display.getDisplay(this);
    }
    
    public 
void pauseApp() {
    }
    
    public 
void destroyApp(boolean unconditional) {
    }
}
?>

Copy code


Bây giờ tạo class firework, class này có tác dụng vẽ lên màn hình 1 điểm bị ném xiên 1 góc bất bất kì với gia tốc rơi a,vận tốc ném v:
<?php

import javax
.microedition.lcdui.*;
import java.util.*;
/**
 *
 * @author ThanhAn
 */
public class firework {
int w,h,v,x0,x,y,y0,angle,t=0,cl=0xff0000;
/* v-vận tốc bắn 
*  angle-goc bay
*  y0,x0-toa do ban dau
*  cl-mau
*  t-thoi gian
*/
float a;//gia tốc rơi
long last=0l,delay=150l;//thời gian chờ
boolean act=true;
intarr_x=new int[2;
intarr_y=new int[2;

    
    public 
firework(int x0,int y0,int v,int angle,int cl){
        
this.y0=y0;
        
this.x0=x0;
        
this.a=1;//cho gia tốc rơi bằng 1 cho gọn
        
this.v=v;
        
this.angle=angle;
        
//độ rộng màn hình lấy từ class main
        
this.w=main.w;
        
this.h=main.h;
        
this.last=time();
        for(
int i=0;i<2;i++){
            
arr_x[i=x0;
            
arr_y[i=y0;
        }
        
this.cl=cl;
    }

    public 
void preDraw(){
        if(
time()-last>=delay){
            
t++;
            
last=time();
            
/*
            * lấy tọa độ x,y mới
            */
            
arr_x[1=arr_x[0;
            
arr_y[1=arr_y[0;                
            
/*
            * lưu tọa độ x,y trước
            */
            
arr_x[0=x;
            
arr_y[0=y;
            
/* 
            * sử dụng công thức của vật bị ném xiên để tính tọa độ điểm đó lúc sau
            */
            
x=(int)(Math.cos(angle*Math.PI/180)*v*t)+x0;
            
y=(int)(v*Math.sin(angle*Math.PI/180)*t-a*t*t/2)+y0;
        }
    }
    
    public 
void paint(Graphics g){
        
//vẽ điểm đó ra
        
Drawline(g,w-x,h-y,cl);
        
//vẽ thêm 2 điểm cũ và mới của điểm bị ném ban đầu
        
for(int i=0;i<2;i++)
            
Drawline(g,w-arr_x[i,h-arr_y[i,cl);
        
/*
         * do tọa độ đặt trên thiết bị nằm ở góc trái trên cùng
         * vì vậy ta phải đổi hệ tọa độ chuyển về góc phải dưới cùng
         * nên 1 điểm có tọa độ x,y -> chuyển về w-x,h-y
         */
        
if(actpreDraw();
    }
    
    public 
long time(){
        return 
System.currentTimeMillis();//hàm trả về thời gian hiện tại
    
}
    
    public 
void Drawline(Graphics g,int x,int y,int color){
        
g.setColor(color);
        
g.drawLine(xyxy);
    }
}
?>

Copy code


tiếp theo tạo class manager.java quản lý các điểm rơi (firework) cái này giống như nổ tung trên ko :v và bắn ra các phía

<?php
import javax
.microedition.lcdui.*;
import java.util.*;
/**
 *
 * @author ThanhAn
 */

public class manager {
int x,y,goc=1,n=360;
/*
* x,y tọa độ pháo hoa
* goc,n cái này là góc rơi cảu các điểm từ 1->360
*/
//tạo 1 biến random 
Random rd=new Random();
//tạo 1 vector lưu các điểm đó
Vector fw=new Vector();
//màu sắc
intcolor={0xff0000,0xffff00,0x00ff00,0xffffff,0x0000ff,0x00ffff,0xf0f0f0,0xC0C0C0};//mau cho phao hoa
    
    
public manager(int x,int y,int goc,int n){
        
this.x=x;
        
this.y=y;
        
this.goc=goc;
        
this.n=n;
        for(
int i=0;i<n;i++){
           
//thêm các điểm vào vector
           //vận tốc ném cho 3<=v<=11
           
fw.addElement(new firework(x,y,Math.abs(rd.nextInt()%8)+3,i*goc,color[Math.abs(rd.nextInt()%color.length)));
        }
    }
 
   
//vẽ ra màn hình
    
public void paint(Graphics g){
        for(
int i=0;i<fw.size();i++){
            
//lấy đối tượng firework
            
firework f=((firework)(fw.elementAt(i)));
            
//xét xem nằm ngoài màn hình chưa nếu rồi thì xóa nó
            
if(f.x>240||f.x<0||f.y<0||f.y>320fw.removeElementAt(i);
            
//vẽ
            
f.paint(g);
        }
    }
}
?>

Copy code


:)) cuối cung phần quan trọng nhất vẽ tất cả ra màn hình
tạo 1 class mới main.java extends Canvas trong class này ta tạo thêm 1 viên đạn bay từ dưới -> trên sau đó nổ tung

<?php

import javax
.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
/**
 *
 * @author ThanhAn
 */

public class main extends Canvas {
Midlet mid;
static 
int w,h;
//tạo 1 đối tượng random
Random r=new Random();
//lưu các class manager
Vector mg=new Vector();
//hình ảnh viên đạn lấy từ game Tankzor
Image img;
//dưới đây là các thuộc tính của viên đạn bay từ dưới -> trên
int f=17,x,y,ag,x0,y0,t,v,ymax=269;
/*
* f=17 frame của ảnh
* ag-goc ban
* x0,y0-toa do ban dau
* t-thoi gian
* v-toc do
* ymax tọa độ y lớn nhất
*/
float a;//gia toc roi tu do
//mang lưu tọa độ của viên đạn bay
intmang_x=new int[3;
intmang_y=new int[3;
//biến xác định xem viên đan đã nổ hay chưa
//nếu nổ rồi ta tiến hành thêm một đối tượng manager rồi vẽ nó
boolean st=false;
long last=0l,delay=150l;
    
    public 
main(Midlet mid){
        
this.mid=mid;
        
setFullScreenMode(true);
        
w=getWidth();
        
h=getHeight();
        try{
            
//ảnh nằm phía dưới
            
img=Image.createImage("/bullets.png");
        }catch(
Exception e){}
    }
 
    public 
void preDraw(){
        
//bat dau di chuyen
        
if(stanimate();
        
//nếu thời gian t>16 thì thêm 1 pháo hoa
        
if(t>16&&st){
             
st=false;
             
mg.addElement(new manager(x,y,1,360));
        }
    }

    public 
void paint(Graphics g){
        
preDraw();
        
g.setColor(0);
        
g.fillRect(00wh);
        
g.setColor(0xff0000);
        
//cái này viết bữa tết nên sẽ để nguyên hehe .
        
g.drawString("Happy New Year!"w/2h/2-12*2Graphics.HCENTER|Graphics.BASELINE);
        
g.drawString("2014"w/2h/2Graphics.HCENTER|Graphics.BASELINE);
        
g.drawString("J2mevn.wapka.mobi"w/2h/2+12*2Graphics.HCENTER|Graphics.BASELINE);
        
//vẽ viên đạn ra
        // tương tự ta cũng đổi hệ tọa độ
        
if(st){
            
g.drawRegion(img19*24024240w-mang_x[2h-mang_y[23);
            
g.drawRegion(img20*24024240w-mang_x[1h-mang_y[13);
            
g.drawRegion(img21*24024240w-mang_x[0h-mang_y[03);
            
g.drawRegion(img22*24024240w-xh-y3);
        }
        
//vẽ pháo hoa ra
        
for(int i=0;i<mg.size();i++)
            ((
manager)(mg.elementAt(i))).paint(g);
        
//trường hợp ko có nhấn phím thì cho pháo hoa tự bắn
        
if(!st)
             
keyPressed(-(Math.abs(r.nextInt()%3)+5));
        
repaint(); 
    }
     
    public 
void keyPressed(int k){
        if(
k==-5&&!st){
            
x0=w/2;
            
ag=80;
            
st=true;
            
add();
        }else
            if(
k==-7&&!st){
            
ag=60;
            
x0=0;
            
st=true;
            
add();
        }
            else if(
k==-6&&!st){
            
ag=120;
            
x0=w;
            
st=true;
            
add();
        }
    }
    
   public 
void add(){
        
y0=0;
        
v=16;
        
t=0;
        
a=1/4;
        for(
int i=0;i<3;i++){
            
mang_y[i=0;
            
mang_x[i=x0;
        }
        
st=true;
    }
   public 
void animate(){
       
mang_y[2=mang_y[1;
       
mang_x[2=mang_x[1;
       
mang_y[1=mang_y[0;
       
mang_x[1=mang_x[0;
       
mang_y[0=y;
       
mang_x[0=x;
       
//chỗ này tương tự như trong file firework mô tả chuyển động của vật bị ném xiên
       
x=(int)(Math.cos(ag*Math.PI/180)*v*t)+x0;
       
y=(int)(v*Math.sin(ag*Math.PI/180)*t-a*t*t/2)+y0;
       if(
time()-last>=delay){
            
t++;
            
last=time();
       }
   }

     public 
long time(){
        return 
System.currentTimeMillis();
    }
}
?>

Copy code


và sửa lại file Midlet như sau :
<?php
import javax
.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * @author ThanhAn
 */
public class Midlet extends MIDlet {
Display dis;
main m;

    public 
void startApp() {
        
dis=Display.getDisplay(this);
        
m=new main(this);
        
dis.setCurrent(m);
    }
    
    public 
void pauseApp() {
    }
    
    public 
void destroyApp(boolean unconditional) {
    }
}

?>

Copy code


Đính kèm file ảnh:
Download bullets.png
Nguồn: mbvn

Like: 0

Trực Tuyến: Khách: 1
Diễn đàn teen Việt Nam
CopyRight 2014