Pham_loi
Chức vụ: 15:11:52, 26-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
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;
int[ arr_x=new int[2;
int[ arr_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(act) preDraw();
}
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(x, y, x, y);
}
}
?>
Copy code
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;
int[ arr_x=new int[2;
int[ arr_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(act) preDraw();
}
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(x, y, x, y);
}
}
?>
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
int[ color={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>320) fw.removeElementAt(i);
//vẽ
f.paint(g);
}
}
}
?>
Copy code
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
int[ color={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>320) fw.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
int[ mang_x=new int[3;
int[ mang_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(st) animate();
//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(0, 0, w, h);
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/2, h/2-12*2, Graphics.HCENTER|Graphics.BASELINE);
g.drawString("2014", w/2, h/2, Graphics.HCENTER|Graphics.BASELINE);
g.drawString("J2mevn.wapka.mobi", w/2, h/2+12*2, Graphics.HCENTER|Graphics.BASELINE);
//vẽ viên đạn ra
// tương tự ta cũng đổi hệ tọa độ
if(st){
g.drawRegion(img, 19*24, 0, 24, 24, 0, w-mang_x[2, h-mang_y[2, 3);
g.drawRegion(img, 20*24, 0, 24, 24, 0, w-mang_x[1, h-mang_y[1, 3);
g.drawRegion(img, 21*24, 0, 24, 24, 0, w-mang_x[0, h-mang_y[0, 3);
g.drawRegion(img, 22*24, 0, 24, 24, 0, w-x, h-y, 3);
}
//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
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
int[ mang_x=new int[3;
int[ mang_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(st) animate();
//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(0, 0, w, h);
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/2, h/2-12*2, Graphics.HCENTER|Graphics.BASELINE);
g.drawString("2014", w/2, h/2, Graphics.HCENTER|Graphics.BASELINE);
g.drawString("J2mevn.wapka.mobi", w/2, h/2+12*2, Graphics.HCENTER|Graphics.BASELINE);
//vẽ viên đạn ra
// tương tự ta cũng đổi hệ tọa độ
if(st){
g.drawRegion(img, 19*24, 0, 24, 24, 0, w-mang_x[2, h-mang_y[2, 3);
g.drawRegion(img, 20*24, 0, 24, 24, 0, w-mang_x[1, h-mang_y[1, 3);
g.drawRegion(img, 21*24, 0, 24, 24, 0, w-mang_x[0, h-mang_y[0, 3);
g.drawRegion(img, 22*24, 0, 24, 24, 0, w-x, h-y, 3);
}
//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
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
: 0 ♥
Trực Tuyến:
Khách: 1