游戏策划咨讯
做一个游戏并不难,难的是做一个好游戏;完美在于积累!

动画方面.

前面的朋友说了动画的制作,一个动画是由很多帧组在的.,您说的方法把一帧帧的动画做成一幅幅的图象,再一幅幅地载入,这样做的效率不高.应该把各幅员的动画放在一起,做成一幅大的图,加载一幅大图比加载多幅小图效率要高,一幅大图也比多幅小图容易管理得多.那么怎样做呢?


做法和前面朋友说的差不多,关键是这个方法:
drawImage(Image img,dx1,dy1,dx2,dy2,sx1,sy1,sx1,sy1,this)
其中Image img是来源图象,
    dx1是目的区域的===左上===顶点的===X====坐标;

    dy1是目的区域的===左上===顶点的===Y====坐标;

    dx2是目的区域的===右下===顶点的===X====坐标;

    dy2是目的区域的===右下===顶点的===Y====坐标;

    sx1是来源区域的===左上===顶点的===X====坐标;

    sy1是来源区域的===左上===顶点的===Y====坐标;

    sx2是来源区域的===右下===顶点的===X====坐标;

    sy2是来源区域的===右下===顶点的===Y====坐标.
================================================================
下面是一个动画的程序代码.
import java.awt.*;
import java.applet.*;
public class Seriallmage4 extends Applet implements Runnable
{
  int SPF;                       //用来表示线程暂停的时间
  int sx,sy;
/******************************************************************
sx,sy用来表示来源区域的左上顶点.因为每一帧我们都做成了长是80宽87的图,再把它们放在一起做成一幅大的图,
所以来源区域的右下顶点的坐标等于左上顶点坐标加上长和高.
式子为:sx+80;sy+87
******************************************************************/                     
  Image Animation;              //来源图象
  MediaTracker MT;              //图像追踪器,用来检查图像是否完全加载
  Thread newThread;             //新的线程.
  Image OffScreen;              //后台图像;
  Graphics drawOffScreen;       //绘制后台图像的实体(实例).
//======================init()函数===========================
  public void init()
  {
     SPF=100;                   //线程暂停的时间是100豪秒,
     MT=new MediaTracker(this); //实体化图像追踪器.
     Animation=getImage(getDocumentBase(),"lunisEx.gif");//加载图像.
//======================//追踪图像=============================
     MT.addImage(Animation,0);  
     try
     {
       showStatus("图象加载中....");   //在状态栏中显示信息
       MT.waitForAll();                //等待加载
     }
     catch(InterruptedException E){}
//============================================================
     OffScreen=createImage(300,300);  //建立后台画面的实体
     drawOffScreen=OffScreen.getGraphics();  //取得后台画面的绘制类
  }
//===========================================================
  public void start()                //start函数
  {
     newThread=new Thread(this);     //建立线程
     newThread.start();              //启动线程
  }
  public void stop()                 //stop函数
  {
     newThread=null;                 //线程设为null
  }
//==========================================================
  public void paint(Graphics g)
  {
     drawOffScreen.setColor(Color.green);    //设置后台画面的背景色,
     drawOffScreen.fillRect(0,0,300,300);    //画一次背景,作用是清除后台画面,如果背景是一幅画
//则要用这幅图来画.
     drawOffScreen.drawImage(Animation,20,20,250,250,sx,sy,sx+80,sy+87,this);//在后台画面绘制
//的图像,
     g.drawImage(OffScreen,0,0,300,300,this);//把后台画面画到前台画面
  }
  public void update(Graphics g)
  {
     paint(g);                              
  }
//====================新动画循环在此========================50
   public void run()                       
   {
      while(newThread !=null)               //如果线程不等于null
      {
        repaint();                         // 重画一次.
        try
        {
           Thread.sleep(SPF);              //让线程暂停
           sx+=80;                         //画了一次后,改变来源区域,使其到下一帧.
           if(sx==800)                     //我的图像是一幅800*170的,有两行,每行十帧,如果sx走到了
//800就说明播放完第一行了,
           {
              sy+=85;                      //播放完第一行后,改变来源区域的左上顶点使其跑到第二行.
              sx=0;
              if(sy==170)                  //如果播放完第二行后,又让它回到第一行,
              {
                 sy=0;
              }
           }
        }
        catch(InterruptedException E){}
      }
    }

}
动画每秒播放多少帧好呢?
电影的是每秒24帧,这样的速度不仅能产生视觉停留,而且让人感觉到画面非常流畅.那么是不是我们做游戏也要用这个速度呢?答案是否定的,实际上每秒播放10帧就足已产生视觉停留,如果设置高了会消耗更多的资源.至命的是,有一些手机连每秒10帖都做不到.

posted on 2005-02-17 18:07 蓝色雪焰 阅读(277) 评论(0)  编辑  收藏 所属分类: 编程技术

只有注册用户登录后才能发表评论。


网站导航: