J2MEのスクリーンセーバーまたは過去に戻る。 パート1

良い一日!



はじめに



1月3日であり、魂は時々何らかのプログラムを書くことを要求します。 考え直すことなく、私はかつてJ2MEのSplash Screenトピックの著者に修正を提案したことを思い出しました。 今日は、「通常のダイヤラー」の世界に飛び込んで、それらのアプリケーションを作成することをお勧めします。これは通常のスクリーンセーバーになります。





それでは始めましょう



開始するには、ソフトウェア開発に必要なものをインストールする必要があります。 アプリケーションをコンパイルして実行するためにPCにインストールする必要があるものをペイントする必要はないと思います。 このような指示は、インターネットで5秒で見つけることができます。 たとえば 。 個人的には、J2ME用のアプリケーションのすべてのソースコードを「通常のダイヤラー」でコンパイルします。 はい、はい、ロシアの土地には、事前検証機能を備えたコンパイラをJ2MEプラットフォームに移植した職人がいます。

すべてをインストールしたら、J2MEアプリケーションデバイスから始めて、アプリケーションのマニフェストディレクティブで終わる理論自体を思い出してください。 ただし、何がわからない場合でも落胆しないでください。このトピックでは、J2MEのアプリケーション開発に関する少しの理論について説明します。



Anatomy J2MEアプリケーション



一般に、J2MEのアプリケーションはMIDletと呼ばれます。 なぜそうなのか、あなたはさらに学ぶでしょう。



javax.microedition.midlet.MIDlet


J2MEのアプリケーションは、 javax.microedition.midletパッケージのMIDletクラスから継承されたクラスにすぎません。 このクラスは、MIDlet'aの「ハート」です。 このクラスでは、アプリケーションの機能に必要な3つのメソッドを宣言する必要があります。

public void startApp() { //        } public void pauseApp() { //   ,      , SMS  .. } public void destroyApp(boolean unconditional) { //    ,   . //  ... }
      
      





実際には、この方法は実装に必要であると示されていますが、実用的な利点はありません。 startApp()およびpauseApp()メソッドはAMS自体によって使用されますが、 destroyApp()は使用されません。 確立された伝統によると、通常、この機能のブロックは次のとおりです。

 public void destroyApp(boolean unconditional) { notifyDestroyed(); //      }
      
      





ご覧のとおり、アプリケーションのライフサイクルの終了はdestroyApp()ではなくnotifyDestroyed()関数によって制御されます。 さて、大丈夫、後者の目的は謎のままです。 気が散ることはありませんが、先に進みます。



javax.microedition.lcdui.Display


アプリケーションの実装の次のステップは、 javax.microedition.lcduiパッケージのDisplayオブジェクトへの参照を取得することです。 ご想像のとおり、これは、画面、フォーム( javax.microedition.lcdui.Form )またはキャンバス( javax.microedition.lcdui.Canvas )を操作し、それらを切り替える機会を得るために行われます。 次のようにリンクを取得できます。

 Display dsp = Display.getDisplay(this); //  ...
      
      





完了、次のステップに進みます。



javax.microedition.lcdui.game.GameCanvas


GameCanvasクラスの出現により、「すぐに使用できる」ダブルバッファリングが不可能であるため、通常のCanvasに取って代わり始めました。 したがって、キャンバスとして、 特にGameCanvasを使用することをお勧めします。 すぐに言ってやった。

GameCanvasCanvasの違いは2つだけです。1つ目は既に指定されています(これはダブルバッファリングです)。2つ目は後者でpaintメソッドを宣言する必要があります。 わかりやすくするために、 Canvasを使用して次のキャンバス実装コードを提供します。

 import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class OurCanvas extends Canvas { //   Canvas public void paint(Graphics g) { int w = getWidth(); //    int h = getHeight(); //      g.setColor(0xffffff); //    g.fillRect(0,0,w,h); //      } }
      
      





paint()メソッドでは、グラフィックプリミティブのすべてのレンダリングを行います。 このアプローチは、多くの理由で特に効果的ではありません。その理由の1つは、ロジックを共有することです。

GameCanvasでは、ロジックを他のメソッド、クラスなどに取り込むことができます 。 このように:

 import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class OurCanvas extends GameCanvas implements Runnable { //   GameCanvas    Runnable,    Thread public void run() { Graphics g = getGraphics(); //     Graphics //           int w = getWidth(); //    int h = getHeight(); //      g.setColor(0xffffff); //    g.fillRect(0,0,w,h); //      } }
      
      





それから私は間違いを犯しました:私はグラフィックスオブジェクトの宣言をクラス自体の宣言内のどこかで変数の宣言の場所に持ち出しませんでした、すなわち コードは次のようになります。

 import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; public class OurCanvas extends GameCanvas implements Runnable { Graphics g = getGraphics(); int w = getWidth(); int h = getHeight(); public void run() { g.setColor(0xffffff); g.fillRect(0,0,w,h); isSomethingDone(); } public void isSomethingDone() { g.setColor(0xababab); g.drawLine(25,25,125,125); } }
      
      





そのようなもの。 それだけです-計画の実施に必要な知識ベースがあります。 行こう!



開発に渡します



アプリケーションはいくつかのクラスで構成されます。

会いましょう! midlet.java:

 import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.*; import java.util.Timer; public class midlet extends MIDlet { Timer timer; midletTimerTask task; midletCanvas canvas; public midlet () { canvas = new midletCanvas(this); //   timer = new Timer (); task = new midletTimerTask (canvas); //  ,    timer.scheduleAtFixedRate(task,10,10); //  10  // 10  -  .    repaint  , //     ,    in } protected void startApp() { //     Display.getDisplay(this).setCurrent (canvas); } protected void pauseApp() {} protected void destroyApp(boolean unconditional) {} public void exitMIDlet() { notifyDestroyed(); } }
      
      





さらに、キャンバス自体はmidletCanvas.javaです。

 import javax.microedition.lcdui.*; class midletCanvas extends Canvas { midlet midlet; random Random; static int [] PlasmaTab = { //   - 256  32,32,33,34,35,35,36,37,38,39,39,40,41,42,42,43, 44,45,45,46,47,47,48,49,49,50,51,51,52,52,53,54, 54,55,55,56,56,57,57,58,58,59,59,59,60,60,60,61, 61,61,62,62,62,62,63,63,63,63,63,63,63,63,63,63, 63,63,63,63,63,63,63,63,63,63,62,62,62,62,62,61, 61,61,60,60,60,59,59,58,58,58,57,57,56,56,55,54, 54,53,53,52,52,51,50,50,49,48,48,47,46,46,45,44, 43,43,42,41,40,40,39,38,37,37,36,35,34,33,33,32, 31,30,30,29,28,27,26,26,25,24,23,23,22,21,20,20, 19,18,17,17,16,15,15,14,13,13,12,11,11,10,10, 9, 9, 8, 7, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,11,11,12,12,13,14,14,15,16,16,17,18,18,19, 20,21,21,22,23,24,24,25,26,27,28,28,29,30,31,31 }; //,      ,   //  32* (1+ sin (x*(2*pi/255)),      static int Delta = 6; //     static int Yold_pos=0, Yold_asp=0, Xold_pos=0, Xold_asp=0; int Ynew_pos, Ynew_asp, Xnew_pos, Xnew_asp, x, y, Color; static int Width, Height; //    static boolean in = false; //  Graphics gbuffer; //   Image screen; //  public midletCanvas (midlet midlet) { this.midlet = midlet; Random = new random (); setFullScreenMode (true); //   MIDP 2.0 Width = getWidth (); Height = getHeight (); screen=Image.createImage(Width,Height); gbuffer=screen.getGraphics(); //   gbuffer, draw (gbuffer); //      ! } void draw (Graphics g) { //      in = true; Ynew_pos = Yold_pos; Ynew_asp = Yold_asp; for (y=0; y<Height; y+=Delta) { Xnew_pos = Xold_pos; Xnew_asp = Xold_asp; for (x=0; x<Width; x+=Delta) { Color = PlasmaTab[Ynew_pos]+ PlasmaTab[Ynew_asp]+ PlasmaTab[Xnew_pos]+ PlasmaTab[Xnew_asp]; g.setColor(((255-Color)<<16 | Color<<8 | 128+(Color>>1))); g.fillRect (x,y,Delta,Delta); Xnew_pos += 1; if (Xnew_pos > 255) Xnew_pos=0; Xnew_asp += 7; if (Xnew_asp > 255) Xnew_asp=0; } Ynew_pos += 2; if (Ynew_pos > 255) Ynew_pos=0; Ynew_asp += 1; if (Ynew_asp > 255) Ynew_asp=0; } Xold_pos -= 2; if (Xold_pos<0) Xold_pos=255; Xold_asp += Random.get(8); if (Xold_asp > 255) Xold_asp=0; Yold_pos += 4; if (Yold_pos > 255) Yold_pos=0; Yold_asp -= Random.get(6); if (Yold_asp<0) Yold_asp=255; in = false; } protected void paint (Graphics g) { if (in == true) return; //      g.drawImage(screen,0,0,0); draw (gbuffer); } public void keyPressed(int keyCode) { switch (keyCode) { //   # case Canvas.KEY_POUND: midlet.exitMIDlet(); break; } } }
      
      





次の行はタイマーです-midletTimerTask.java:

 import java.util.TimerTask; import javax.microedition.midlet.MIDlet; class midletTimerTask extends TimerTask { midletCanvas canvas; public midletTimerTask (midletCanvas canvas) { this.canvas = canvas; } public final void run() { canvas.repaint(); } }
      
      





そして最後に、乱数を選択する実装-random.java

 import java.util.Date; import java.util.Random; class random { //-    private Random r; private Date d; public random () { d = new Date (); r = new Random (d.getTime()); } public int get (int max) { //    [0,max-1] int n=r.nextInt()%max; return (n<0 ? -n : n); } }
      
      







スキャンダル、陰謀、調査



私のソースはコンパイルしたくない。 むしろ、それらはコンパイルされますが、私がしたいことは行われません。 深夜なので、あなたの謙虚な僕は彼の源を奪う必要がありませんでした。 コードのフォーマットをおaびします-明日修正します。



技術のさらなる問題



コンパイルと検証。 このステップはあなたのために残します。



MANIFEST.MF



このファイルを変更することをお勧めしますが、このファイルはMETA-INFディレクトリにあります。 結局のところ、スクリーンセーバーを作成する場合、それに応じて動作するはずです。 残念ながら、この動作はSony Ericssonの電話でのみ使用できます。 次の行を追加してみましょう。

  SEMC-StandbyApplication:Y 




私たちは何をしましたか



スクリーンセーバーを壁紙としてダウンロードできるようにしました。 これを行うには、MIDletを電話にドロップする必要があります。 次に、「アプリケーション」に進んでください。 次のアクションは、右のソフトキーを押して「背景のように。 描画」。 選択してください-食べてください。 以下が表示されます



それが起こったことです











必要なものはすべて



Pastebinでソースコードを取得できます。 ここにあります:

midlet.java

midletCanvas.java

midletTimerTask.java

random.java



おわりに



以上です。 ほんの数ステップで、MIDletを作成しました。 現在、J2MEは次第にどこにも行かず、おそらくそのようなチューブは残っていませんが、Oracleがそれをサポートしている間-誰もがまだ存在します。 あなたが興味を持っていたことを願っています。



じゃあね!



All Articles