游戲策劃咨訊
          做一個游戲并不難,難的是做一個好游戲;完美在于積累!

          動畫方面.

          前面的朋友說了動畫的制作,一個動畫是由很多幀組在的.,您說的方法把一幀幀的動畫做成一幅幅的圖象,再一幅幅地載入,這樣做的效率不高.應該把各幅員的動畫放在一起,做成一幅大的圖,加載一幅大圖比加載多幅小圖效率要高,一幅大圖也比多幅小圖容易管理得多.那么怎樣做呢?


          做法和前面朋友說的差不多,關鍵是這個方法:
          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 藍色雪焰 閱讀(285) 評論(0)  編輯  收藏 所屬分類: 編程技術
           
          主站蜘蛛池模板: 军事| 义乌市| 绥芬河市| 綦江县| 和顺县| 太和县| 平江县| 济阳县| 龙胜| 盐源县| 襄垣县| 罗城| 中西区| 靖江市| 武川县| 鲁山县| 得荣县| 大同县| 宝山区| 界首市| 交口县| 盈江县| 五华县| 海原县| 红桥区| 新竹县| 高清| 苏尼特左旗| 三门峡市| 瓦房店市| 辽源市| 尉犁县| 田东县| 怀集县| 禹城市| 泽普县| 荣成市| 武山县| 河西区| 蓬溪县| 镶黄旗|