抛物线

来源:互联网 发布:js中的if内循环判断 编辑:程序博客网 时间:2024/04/28 19:40
Java代码  收藏代码
  1. 一。  
Java代码  收藏代码
  1. //Canvas类中的代码  
  2.   
  3. import java.io.IOException;  
  4. import javax.microedition.lcdui.Graphics;  
  5. import javax.microedition.lcdui.Image;  
  6. import javax.microedition.lcdui.game.GameCanvas;  
  7. import javax.microedition.lcdui.game.Sprite;  
  8. import javax.microedition.lcdui.game.TiledLayer;  
  9.   
  10. public class MyCanvas extends GameCanvas implements Runnable  
  11. {  
  12.  int x,y;         //小船的位置  
  13.  Sprite ship;     //小船精灵  
  14.  TiledLayer background;     //地图  
  15.  Image ship_IMG, sea_IMG, bullet_IMG;    //图片  
  16.   Bullets bullets;      //炮弹  
  17.  public MyCanvas()  
  18.  {  
  19.   super(true);  
  20.   //初始化船的位置  
  21.   x = 10;  
  22.   y = 60;  
  23.   try  
  24.   {  
  25.    ship_IMG = Image.createImage("/ship.png");  
  26.    sea_IMG = Image.createImage("/sea.png");  
  27.    bullet_IMG = Image.createImage("/bullet.png");  
  28.   }  
  29.   catch (IOException e)  
  30.   {  
  31.    e.printStackTrace();  
  32.   }  
  33.   //初始化炮弹  
  34.   bullets = new Bullets(bullet_IMG);  
  35.   //初始化小船  
  36.   ship = new Sprite(ship_IMG, 2430);  
  37.   ship.setPosition(x, y);  
  38.   //初始化地图  
  39.   background = new TiledLayer(206, sea_IMG, 3232);  
  40.   background.createAnimatedTile(1);  
  41.   int[][] map = new int[][]  
  42.   {  
  43.     { 44444444444444444444 },  
  44.     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },  
  45.     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },  
  46.     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },  
  47.     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },  
  48.     { 66666666666666666666 }  
  49.   };  
  50.   //绘制地图  
  51.   for(int i = 0 ; i < map.length ; i ++){  
  52.    for(int j = 0 ; j < map[i].length ; j++){  
  53.     background.setCell(j, i, map[i][j]);  
  54.    }  
  55.   }  
  56.   Thread th = new Thread(this);  
  57.   th.start();  
  58.  }  
  59.   
  60.  private int k = 0;  
  61.  public void run(){  
  62.   Graphics g = getGraphics();  
  63.   while(true){  
  64.    //显示出水的流动  
  65.    k++;  
  66.    if(k==10){  
  67.     if(background.getAnimatedTile(-1) == 1){  
  68.      background.setAnimatedTile(-12);  
  69.     }  
  70.     else if(background.getAnimatedTile(-1) == 2){  
  71.      background.setAnimatedTile(-11);  
  72.     }  
  73.     k = 0;  
  74.    }  
  75.    //主控制  
  76.    support(g);  
  77.    //绘制  
  78.    draw(g);  
  79.    try{  
  80.     Thread.sleep(35);  
  81.    }  
  82.    catch (InterruptedException e){  
  83.     e.printStackTrace();  
  84.    }  
  85.   }  
  86.  }  
  87.    
  88.  public void support(Graphics g){  
  89.   //控制船的移动及发射  
  90.   int keyCode = getKeyStates();  
  91.   switch(keyCode){  
  92.      case UP_PRESSED:  
  93.       y = Math.max(0, y - 2);  
  94.       if(ship.getFrame() >= 2)  
  95.        ship.setFrame(0);  
  96.       else  
  97.        ship.nextFrame();  
  98.       break;  
  99.      case DOWN_PRESSED:  
  100.       y = Math.min(getHeight(), y + 2);  
  101.       if(ship.getFrame() <= 2 || ship.getFrame() >= 5)  
  102.        ship.setFrame(3);  
  103.       else  
  104.        ship.nextFrame();  
  105.       break;  
  106.      case LEFT_PRESSED:  
  107.       x = Math.max(0, x - 2);  
  108.       if(ship.getFrame() <= 5 || ship.getFrame() >= 8)  
  109.        ship.setFrame(6);  
  110.       else  
  111.        ship.nextFrame();  
  112.       break;  
  113.      case RIGHT_PRESSED:  
  114.       x = Math.min(getWidth(), x + 2);  
  115.       if(ship.getFrame() <= 8 || ship.getFrame() >= 11)  
  116.        ship.setFrame(9);  
  117.       else  
  118.        ship.nextFrame();  
  119.       break;  
  120.      case FIRE_PRESSED:  
  121.       if(!bullets.isfire){  
  122.        bullets.isfire = true;  
  123.        bullets.setPoint(x+13,y);  
  124.       }  
  125.       break;  
  126.   }  
  127.   ship.setPosition(this.x, this.y);  
  128.  }  
  129.    
  130.  /** 
  131.   * 绘制 
  132.   * @param g 
  133.   */  
  134.  public void draw(Graphics g){  
  135.   g.setColor(0xffffff);  
  136.   g.fillRect(0,0,this.getWidth(),this.getHeight());  
  137.   g.setColor(0x000000);  
  138.   background.paint(g);  
  139.   bullets.drawBullets(g);  
  140.   ship.paint(g);  
  141.   flushGraphics();  
  142.  }  
  143. }  
  144. /** 
  145.  * 炮弹 
  146.  * <p>Title: Bullets</p> 
  147.  * <p>Description: </p> 
  148.  * <p>Copyright: Copyright (c) 2005</p> 
  149.  * <p>Date: 2006-3-2</p> 
  150.  * @author ZGY 
  151.  * @version 1.0 
  152.  */  
  153. class Bullets extends Sprite{  
  154.  boolean isfire = false;  
  155.  //炮弹的发射点  
  156.  int bulletX, bulletY;  
  157.  //炮弹的射程  
  158.  int shotWidth = 50;  
  159.  //炮弹的射程高度  
  160.  int shotHeight = shotWidth/2-10;  
  161.  //炮弹的速度  
  162.  int shotSpeed = 3;  
  163.  //炮弹抛物线的系数  
  164.  double a,b,c;  
  165.  public Bullets(Image image){  
  166.   super(image, 1515);  
  167.  }  
  168.    
  169.  /** 
  170.   * 初始化炮弹 
  171.   * @param x 
  172.   * @param y 
  173.   */  
  174.  public void setPoint(int x, int y){  
  175.   //初始化炮弹的发射点  
  176.   this.bulletX = x;  
  177.   this.bulletY = y;  
  178.   //根据炮弹的发射点、高度、射程计算出炮弹抛物线的三点  
  179.   int x1 = bulletX;  
  180.   int y1 = bulletY;  
  181.   int x2 = bulletX+shotWidth/2;  
  182.   int y2 = bulletY-shotHeight;  
  183.   int x3 = bulletX+shotWidth;  
  184.   int y3 = bulletY;  
  185.   //根据抛物线方程ax^2+bx+c=y,得方程组  
  186.   //ax1^2+bx1+c=y1  
  187.   //ax2^2+bx2+c=y2  
  188.   //ax3^2+bx3+c=y3  
  189.   //解方程组得抛物线的a,b,c  
  190.   b = ((y1-y3)*(x1*x1-x2*x2)-(y1-y2)*(x1*x1-x3*x3))/((x1-x3)*(x1*x1-x2*x2)-(x1-x2)*(x1*x1-x3*x3));  
  191.   a = ((y1-y2)-b*(x1-x2))/(x1*x1-x2*x2);  
  192.   c = y1-a*x1*x1-b*x1;  
  193.  }  
  194.    
  195.  /** 
  196.   * 绘出炮弹 
  197.   * @param g 
  198.   */  
  199.  public void drawBullets(Graphics g){  
  200.   if(isfire) {  
  201.    int k = (int)(a*bulletX*bulletX+b*bulletX+c);  
  202.    setPosition(bulletX, k);  
  203.    paint(g);  
  204.    //炮弹的速度  
  205.    bulletX += shotSpeed;  
  206.    //炮弹将消失于小船的水平线  
  207.    if(k > bulletY){  
  208.     nextFrame();  
  209.     if(getFrame() == 2){  
  210.      isfire = false;  
  211.      setFrame(0);  
  212.     }  
  213.    }  
  214.   }  
  215.  }  
  216. }  

 二。更多学习资料

http://ajava.org/course/j2me/2475.html

=========================================================================

1.程序实现抛物线运动。

 x+=vx;

vy+=a;

y+=vy;

2.数学实现抛物线运动。

即根据发射点坐标与射程和射程高度。解方程。

缺点:必须支持小数。

3.物理。实现抛物线运动

发射的初始速度为V.与水平方向的夹角为@。

则水平方向的分速度:vx=v*cos@;

则竖直方向的分速度:vx=v*sin@;

水平方向运动:x+=vx;

竖直方向运动:v2=v1+g;

y+=(

v2^2-V1^2

)/(2*g);

0 0
原创粉丝点击