java动画2.docx
《java动画2.docx》由会员分享,可在线阅读,更多相关《java动画2.docx(26页珍藏版)》请在冰点文库上搜索。
java动画2
动画2
这一讲我们继续学习动画。
好呀,好想马上就能制作Java游戏啊。
恩,学习了本讲,就离制作真正的Java程序又近了一步了啊。
1.上一讲的程序
先来看一下上一讲我们学习的程序。
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*车动画
*/
publicclassCarAnimationextendsMIDlet{
privateCanvascanvas;
privateDisplaydisplay;
/**
*开始方法
*/
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
canvas=newCarCanvas();
display.setCurrent(canvas);
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanbool)throwsMIDletStateChangeException{
}
}
importjava.io.IOException;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
/**
*车动画canvas
*/
publicclassCarCanvasextendsCanvasimplementsRunnable{
privateImagecarImage;
privateintx=130;//x坐标
privateinty=130;//y坐标
/**
*构造器
*/
publicCarCanvas(){
try{
carImage=Image.createImage("/car2.png");
}catch(IOExceptione){
e.printStackTrace();
}
//使用线程
Threadth=newThread(this);//制作新线程
th.start();//开始线程
}
/**
*描画用方法
*/
protectedvoidpaint(Graphicsg){
//描画与画面大小一样的长方形
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
//显示图像
g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER);
}
/**
*运行线程的处理
*/
publicvoidrun(){
while(true){
y++;
x-=2;
//到达一端后从相反端出来
if(x<0)x=getWidth();
if(y>getHeight())y=0;
repaint();
try{
Thread.sleep(100);//100毫秒待机
}catch(InterruptedExceptione){
}
}
}
}
2.制作游戏
上一讲我们制作了使车移动的程序,这一讲把这个程序改造一下,制作一个游戏程序怎么样?
噢!
游戏啊!
是不是太难了啊。
没关系。
游戏也不复杂,小尼克应该了解的吧。
是什么样的游戏呢?
躲闪障碍物,最后到达终点的racinggame。
来试试制作可以移动障碍物的车程序吧。
真有你说的那么简单么…
当然了,用目前为止咱们学的就够了。
下面是制作步骤,按照这个步骤试试吧。
1.准备图像
2.车的操作
3.配置障碍物
4.移动障碍物
5.判定与障碍物的冲突
2.1.准备图像
首先要准备游戏使用的图像。
本讲除了要准备车的图像之外,还要准备障碍物的车的图像。
2.2.车的操作
下面我们对车进行改造,利用十字键使车左右移动。
要使用以前用过的keyevent吧。
没错,那么尼克你就做做看吧。
是这样么?
改造CarCanvas,使按左右键时改变x坐标。
importjava.io.IOException;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
/**
*车动画canvas
*/
publicclassCarCanvasextendsCanvasimplementsRunnable{
privateImagecarImage;
privateintx=100;//x坐标
privateinty=180;//y坐标
/**
*构造器
*/
publicCarCanvas(){
try{
carImage=Image.createImage("/car3.png");
}catch(IOExceptione){
e.printStackTrace();
}
//使用线程
Threadth=newThread(this);//制作新线程
th.start();//开始线程
}
/**
*描画用方法
*/
protectedvoidpaint(Graphicsg){
//描画与画面大小一样的长方形
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
//显示图像
g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER);
}
/**
*运行线程的处理
*/
publicvoidrun(){
while(true){
y--;
//到达一端后从相反端出来
if(x<0)x=getWidth();
if(y>getHeight())y=0;
repaint();
try{
Thread.sleep(100);//100毫秒待机
}catch(InterruptedExceptione){
}
}
}
/**************************************************
*keyevent处理
**************************************************/
/**
*键被按下时的处理
*/
protectedvoidkeyPressed(intkey){
intgameaction=getGameAction(key);
switch(gameaction){
caseCanvas.RIGHT:
x+=3;
break;
caseCanvas.LEFT:
x-=3;
break;
default:
}
}
}
2.3.配置障碍物
好,这样就使车移动了。
下面是配置障碍物的车,先试着在(30,30)的位置配置一个看看。
好的。
importjava.io.IOException;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
/**
*车动画canvas
*/
publicclassCarCanvasextendsCanvasimplementsRunnable{
privateImagecarImage;
privateImageenemyImage;
privateintx=100;//x坐标
privateinty=180;//y坐标
/**
*构造器
*/
publicCarCanvas(){
try{
carImage=Image.createImage("/car3.png");
enemyImage=Image.createImage("/enemycar.png");
}catch(IOExceptione){
e.printStackTrace();
}
//使用线程
Threadth=newThread(this);//制作新线程
th.start();//开始线程
}
/**
*描画用方法
*/
protectedvoidpaint(Graphicsg){
//描画与画面大小一样的长方形
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
//显示图像
g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER);
g.drawImage(enemyImage,30,30,Graphics.HCENTER|Graphics.VCENTER);
}
/**
*运行线程的处理
*/
publicvoidrun(){
while(true){
y--;
//到达一端后从相反端出来
if(x<0)x=getWidth();
if(y>getHeight())y=0;
repaint();
try{
Thread.sleep(100);//100毫秒待机
}catch(InterruptedExceptione){
}
}
}
/**************************************************
*keyevent处理
**************************************************/
/**
*键被按下时的处理
*/
protectedvoidkeyPressed(intkey){
intgameaction=getGameAction(key);
switch(gameaction){
caseCanvas.RIGHT:
x+=3;
break;
caseCanvas.LEFT:
x-=3;
break;
default:
}
}
}
接下来就试着使障碍物移动吧。
如果静止不动会显得很奇怪啊。
那你知道怎么使障碍物移动么?
设障碍物的坐标为变量,利用线程处理对它进行改变。
importjava.io.IOException;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
/**
*车动画canvas
*/
publicclassCarCanvasextendsCanvasimplementsRunnable{
privateImagecarImage;
privateImageenemyImage;
privateintx=100;//x坐标
privateinty=180;//y坐标
privateintenemyX=30;//敌人x坐标
privateintenemyY=30;//敌人y坐标
/**
*构造器
*/
publicCarCanvas(){
try{
carImage=Image.createImage("/car3.png");
enemyImage=Image.createImage("/enemycar.png");
}catch(IOExceptione){
e.printStackTrace();
}
//使用线程
Threadth=newThread(this);//制作新线程
th.start();//开始线程
}
/**
*描画用方法
*/
protectedvoidpaint(Graphicsg){
//描画与画面大小一样的长方形
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
//显示图像
g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER);
g.drawImage(enemyImage,enemyX,enemyY,Graphics.HCENTER|Graphics.VCENTER);
}
/**
*运行线程的处理
*/
publicvoidrun(){
while(true){
y--;
enemyX+=3;
//到达一端后从相反端出来
if(x<0)x=getWidth();
if(y>getHeight())y=0;
if(enemyX>getWidth())enemyX=0;
repaint();
try{
Thread.sleep(100);//100毫秒待机
}catch(InterruptedExceptione){
}
}
}
/**************************************************
*keyevent处理
**************************************************/
/**
*键被按下时的处理
*/
protectedvoidkeyPressed(intkey){
intgameaction=getGameAction(key);
switch(gameaction){
caseCanvas.RIGHT:
x+=3;
break;
caseCanvas.LEFT:
x-=3;
break;
default:
}
}
}
2.4.判定与障碍物的冲突
最后是判定与障碍物的冲突。
与障碍物发生冲突后,游戏就停顿了。
自己的车与障碍物的车发生冲突,游戏停顿…恩,自己的车的图像与障碍物的车的图像开始重合,就是发生冲突了吧?
就是这样。
那么就必须要知道图像的尺寸了。
要取得图像的尺寸可以使用以下两个方法。
image.getHeight();
image.getWidth’();
使用上面两个方法,制作判定车与障碍物的冲突的if语句吧。
要注意的是,车与障碍物的坐标都要位于图像的中心。
好,是下面这样么?
//冲突判定
if(x-carImage.getWidth()/2x+carImage.getWidth()/2>enemyX-enemyImage.getWidth()/2){
if(y-carImage.getHeight()/2y+carImage.getHeight()/2>enemyY-enemyImage.getHeight()/2){
//发生冲突时的处理
}
}
哦,做的不错啊。
那么使游戏停顿的处理如下所示。
wait()
Wait方法可以停止线程的处理,这时会有例外发生。
那就必须要加入例外处理了?
恩,没错。
加到程序里面试试吧。
加入使游戏停顿的处理后的sourcecode是这样的吧。
importjava.io.IOException;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
/**
*车动画canvas
*/
publicclassCarCanvasextendsCanvasimplementsRunnable{
privateImagecarImage;
privateImageenemyImage;
privateintx=100;//x坐标
privateinty=180;//y坐标
privateintenemyX=30;//敌人x坐标
privateintenemyY=30;//敌人y坐标
/**
*构造器
*/
publicCarCanvas(){
try{
carImage=Image.createImage("/car3.png");
enemyImage=Image.createImage("/enemycar.png");
}catch(IOExceptione){
e.printStackTrace();
}
//使用线程
Threadth=newThread(this);//制作新线程
th.start();//开始线程
}
/**
*描画用方法
*/
protectedvoidpaint(Graphicsg){
//描画与画面大小一样的长方形
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
//显示图像
g.drawImage(carImage,x,y,Graphics.HCENTER|Graphics.VCENTER);
g.drawImage(enemyImage,enemyX,enemyY,Graphics.HCENTER|Graphics.VCENTER);
}
/**
*运行线程的处理
*/
publicvoidrun(){
while(true){
y--;
enemyX+=3;
//到达一端后从相反端出来
if(x<0)x=getWidth();
if(y>getHeight())y=0;
if(enemyX>getWidth())enemyX=0;
//冲突判定
try{
if(x-carImage.getWidth()/2x+carImage.getWidth()/2>enemyX-enemyImage.getWidth()/2){
if(y-carImage.getHeight()/2y+carImage.getHeight()/2>enemyY-enemyImage.getHeight()/2){
//发生冲突时的处理
wait();//使游戏停顿
}
}
}catch(InterruptedExceptione1){
}
repaint();
try{
Thread.sleep(100);//100毫秒待机
}catch(InterruptedExceptione){
}
}
}
/**************************************************
*keyevent处理
**************************************************/
/**
*键被按下时的处理
*/
protectedvoidkeyPressed(intkey){
in