游戲策劃咨訊
          做一個(gè)游戲并不難,難的是做一個(gè)好游戲;完美在于積累!
          使用MIDP(Mobile Information Device Profile)的開(kāi)發(fā)人員經(jīng)常會(huì)抱怨用些什么辦法才可以在一個(gè)MIDlet上顯示動(dòng)畫(huà)。MIDP 1.0 沒(méi)有直接提供對(duì)動(dòng)畫(huà)的支持(正在開(kāi)發(fā)中的MIDP 2.0支持),但真要是自己去實(shí)現(xiàn),其實(shí)也并非是一件很難的事。

          任何動(dòng)畫(huà)的最基本的前提,是要在足夠快的時(shí)間內(nèi)顯示和更換一張張的圖片,讓人的眼睛看到動(dòng)的畫(huà)面效果。圖片必須按照順序畫(huà)出來(lái)。從一張圖片到下一張圖片之間的變化越小,效果會(huì)越好。

          首先要做的,是使用你的圖片處理軟件(比如ps或者firework)創(chuàng)建一系列相同大小的圖片來(lái)組成動(dòng)畫(huà)。每張圖片代表動(dòng)畫(huà)一幀。

          你需要制作一定數(shù)量的禎--越多的幀會(huì)讓你的動(dòng)畫(huà)看上去越平滑。制作好的圖片一定要保存成PNG(Portable Network Graphics) 格式,MIDP唯一支持的圖片格式;(有兩個(gè)辦法讓你剛做好的圖片在MIDlet上變成動(dòng)畫(huà)。第一,把圖片都放到一個(gè)web服務(wù)器上,讓MIDlet下載他們,MIDP內(nèi)置的HTTP支持。第二個(gè)辦法更簡(jiǎn)單,把圖片用MIDlet打包成jar文件。如果你使用的是J2ME開(kāi)發(fā)工具,把PNG文件放在你的項(xiàng)目文件里面就可以了。

          動(dòng)畫(huà)的過(guò)程其實(shí)更像帳本記錄:顯示當(dāng)前幀,然后適當(dāng)?shù)馗鼡Q到下一幀。那么使用一個(gè)類(lèi)來(lái)完成這個(gè)工作應(yīng)該是很恰當(dāng)?shù)模呛茫覀兙拖榷x一個(gè)AnimatedImage類(lèi):

          import java.util.*;
          import javax.microedition.lcdui.*;
          // 定義了一個(gè)動(dòng)畫(huà),該動(dòng)畫(huà)其實(shí)只是一系列相同大小的圖片
          // 輪流顯示,然后模擬出的動(dòng)畫(huà)
          public class AnimatedImage extends TimerTask {;
          private Canvas canvas;
          private Image[] images;
          private int[][] clipList;
          private int current;
          private int x;
          private int y;
          private int w;
          private int h;

          // Construct an animation with no canvas.

          public AnimatedImage( Image[] images ){;
          this( null, images, null );
          };

          // Construct an animation with a null clip list.

          public AnimatedImage( Canvas canvas, Image[]
          images ){; this( canvas, images, null );
          };

          // Construct an animation. The canvas can be null,
          // but if not null then a repaint will be triggered
          // on it each time the image changes due to a timer
          // event. If a clip list is specified, the image is
          // drawn multiple times, each time with a different
          // clip rectangle, to simulate transparent parts.

          public AnimatedImage( Canvas canvas, Image[] images,
          int[][] clipList ){;
          this.canvas = canvas;
          this.images = images;
          this.clipList = clipList;

          if( images != null && clipList != null ){;
          if( clipList.length < images.length ){;
          throw new IllegalArgumentException();
          };
          };

          if( images != null && images.length > 0 ){;
          w = images[0].getWidth();
          h = images[0].getHeight();
          };
          };

          // Move to the next frame, wrapping if necessary.

          public void advance( boolean repaint ){;
          if( ++current >= images.length ){;
          current = 0;
          };

          if( repaint && canvas != null && canvas.isShown()
          ){;
          canvas.repaint( x, y, w, h );
          canvas.serviceRepaints();
          };
          };

          // Draw the current image in the animation. If
          // no clip list, just a simple copy, otherwise
          // set the clipping rectangle accordingly and
          // draw the image multiple times.

          public void draw( Graphics g ){;
          if( w == 0 || h == 0 ) return;

          int which = current;

          if( clipList == null || clipList[which] == null
          ){;
          g.drawImage( images[which], x, y,
          g.TOP | g.LEFT );
          }; else {;
          int cx = g.getClipX();
          int cy = g.getClipY();
          int cw = g.getClipWidth();
          int ch = g.getClipHeight();

          int[] list = clipList[which];

          for( int i = 0; i + 3 <= list.length; i +=
          4 ){;
          g.setClip( x + list[0], y + list[1],
          list[2], list[3] );
          g.drawImage( images[which], x, y,
          g.TOP | g.LEFT );
          };

          g.setClip( cx, cy, cw, ch );
          };
          };

          // Moves the animation's top left corner.

          public void move( int x, int y ){;
          this.x = x;
          this.y = y;
          };

          // Invoked by the timer. Advances to the next frame
          // and causes a repaint if a canvas is specified.

          public void run(){;
          if( w == 0 || h == 0 ) return;

          advance( true );
          };
          };

          posted on 2005-02-17 20:04 藍(lán)色雪焰 閱讀(350) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 編程技術(shù)
           
          主站蜘蛛池模板: 松溪县| 溆浦县| 深圳市| 叶城县| 策勒县| 儋州市| 乌兰浩特市| 山丹县| 湘潭县| 苍溪县| 彩票| 永定县| 康马县| 屏东县| 内丘县| 芜湖市| 无为县| 南乐县| 枣阳市| 三台县| 肥城市| 古丈县| 定南县| 崇文区| 巧家县| 那坡县| 泸州市| 海门市| 杭锦旗| 綦江县| 抚松县| 阳原县| 珠海市| 盐池县| 彭山县| 洛隆县| 靖边县| 张家川| 遂昌县| 长岛县| 中牟县|