J2ME
Game Concept
หัวใจหลักของการสร้างเกมส์
 การออกแบบการเล่นของเกมส์ให้ง่ายต่อความเข้าใจ
 ขนาดของรูปภาพที่แสดงผลบนหน้าจอ
 ขนาดของ files เสียง หรือ รูปภาพต่างๆที่นำามาใช้
  ต้องไม่มีขนาดใหญ่จนเกินไป
 จัดลำาดับของ game loop ให้มีรูปแบบ
 การเขียน Thread และใช้ runnable ให้คำานึงถึง
Memory และ condition ของเกมส์
หลักการออกแบบเกมส์
   อุปกรณ์ใช้ในการพัฒนาตามความต้องการของเกมส์
    –   ความละเอียดของหน้าจอ
    –   ขนาดของ jar file
    –   เลือกรุ่นหรือซีรีส์ของอุปกรณ์
   เป้าหมายของเกมส์
    –   จะทำายังไงให้ผู้เล่นเกิดความสนุกและท้าทาย
    –   ทำาไม่ให้เกิดความเบื่อเมื่อเล่นบ่อยๆ
    –   สร้างความน่าสนใจในเกมส์
    –   สร้างเนื่อเรื่องให้กับเกมส์


     เกมส์จะต้องไม่เล่นยากหรือเร็วเกินไป
           แต่ต้องสร้างความท้าทาย
Classic Game Loop
      Start

     getInput


      Moving


      check
     Collision


      Repent



     Process        End Games
Category Game
 Action Game
 Puzzle Game
 Strategy Game
 Others Game
Apple Tree
import java.io.*;
import java.util.Random;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.media.*;
import javax.microedition.midlet.*;

public class appletree extends MIDlet {
  AppleCanvas canvas = new AppleCanvas();
public appletree() {}
protected void destroyApp(boolean arg0) throws
  MIDletStateChangeException {}
protected void pauseApp() {}
protected void startApp() throws MIDletStateChangeException {
               Display display = Display.getDisplay(this);
               canvas.start();
               display.setCurrent(canvas);
       }
}
class AppleCanvas extends GameCanvas implements
  Runnable {
           boolean running;
           int cx, cy, w, h;
           int delay = 20;
           Sprite cowboy;
           Sprite appletree_bg;
           LayerManager layerManager;
           Apple apple[]= new Apple[8];
           Random position_x = new Random();
           int score = 0;
protected AppleCanvas() {
       super(true);
       w = getWidth();
       h = getHeight();
       cx = w/2;
       cy = h/2;

        Image img_cowboy =null;
        Image img_appleTree = null;

        try {
                img_cowboy = Image.createImage("/image/cowboy.png");
                img_appleTree = Image.createImage("/image/appletree.png");
         } catch (IOException e) {}
    cowboy = new Sprite(img_cowboy,32,48);
    appletree_bg = new Sprite(img_appleTree);
    layerManager = new LayerManager();
    layerManager.append(cowboy);
    new_Apple();
    layerManager.append(appletree_bg);
}
public void new_Apple(){
        for(int i=0;i<apple.length;i++){
                 apple[i] = new Apple();
                 apple[i].setW(w);
                 apple[i].setH(h);
                 layerManager.append(apple[i].getTumbleweed());
        }
}
public void run() {
        Graphics g = getGraphics();
        while(running){
                 input();
                 drawScreen(g);
                 for(int i=0;i<apple.length;i++){
                           if(apple[i].getTumbleweed().collidesWith(cowboy, false)){
                           apple[i].setY(h+1);
                           score++;
                           playBgSound("/sound/power_sound.wav");
                           }
                 }
        try {Thread.sleep(delay);} catch (InterruptedException e) {}
        }

}
protected void playBgSound(final String a) {
  Runnable r = new Runnable()
     {
     public void run() {
     try {
     InputStream in =
  getClass().getResourceAsStream(a);
    Player player = Manager.createPlayer(in, "audio/x-wav");
        player.start();
        }catch (Exception e) {}
        }
    };
    new Thread(r).start();
}
private void input() {
     int keyState = getKeyStates();
     if(keyState== LEFT_PRESSED){
           cx = cx - 5;
           cx = Math.max(0, cx);
           cowboy.setTransform(2);
           cowboy.nextFrame();
     } else if(keyState== RIGHT_PRESSED){
                 cx = cx + 5;
                 cx = Math.min(cx, w-32);
                 cowboy.setTransform(0);
                 cowboy.nextFrame();
     }
}
public void start() {
     running = true;
     Thread t = new Thread(this);
     t.start();
  for(int i=0;i<apple.length;i++) {
     apple[i].start_thread();
  }
}
void drawScreen(Graphics g){
        String score_string = "Score = "+score+"";
        g.setColor(255,255,255);
        g.fillRect(0, 0, w, h);
        cowboy.setPosition(cx, h - 48);
        for(int i=0;i<apple.length;i++) {
apple[i].getTumbleweed().setPosition(apple[i].getX(),apple[i].getY());
        }
        appletree_bg.setPosition(15, 0);
        layerManager.paint(g, 0, 0);
        g.setColor(0,0,0);
        g.drawString(score_string,0,10,0);
        flushGraphics();
    }

}
แนะนำำรูปแบบ
        game
   Game boy scout
รูปแบบการทำางานของเกมส์
    – เราทำาหน้าที่เป็นลูกเสือ พาคนแก่ ข้ามถนนไปส่งที่
      จุดหมาย
    – โดย จะต้องพาไปโดยไม่โดนรถชน
    – และพาไปส่งให้ถกจุดด้วยถึงจะได้คะแนน
                       ู
-1   +2     -1          -1   -1             +5


                                       Random
                 หยุดเวลา



          เกำะกลำงถนน



                                  +1
แนะนำำรูปแบบ game
   ทุบตัวตุ่น
    รูปแบบการทำางานของเกมส์
    – ต้องทุบหัวตัวที่ขึ้นมาจากหลุมโดยจะมีหลุมอยู่
    9 หลุม โดยจะกดตีโดยใช้ เลย 1 - 9
1             2       3
                                         ตัวหลอก
                                      ถ้ำไปตกดตีจะ
 4             5        6               เสียคะแนน



 7             8        9

ถ้ำกดตีทันจะ
  ได้คะแนน
                   การเพิ่งความสนุกของเกมส์ทำาได้โดย
                   • เพิ่งความเร็ว
                   • เพิ่ง Sprite ให้มีรูปแบบการแสดงต่างกัน
                   • เพิ่งเสียงที่ดตื่นเต้น
                                   ู
                   • เพิ่มหรือลด หลุมเช่นเริ่มต้นที่ 3 หลุมก่อน
                   ต่อจากนันจึงเพิ่มไปเลือยๆจนถึง 9 หลุม
                             ้              ่
                   • ถ้าผ่านแต่ละด่านจะมีภาพ animation
                   ให้ดูพร้อมเสียงเพลง
WEB
 http://www.java2s.com/
 http://www.developer.com/
 http://www.dbarnes.com/
 http://www.j2mecodex.com/
 http://developers.sun.com/mobility/midp/

J2ME Game Concept

  • 1.
  • 2.
    หัวใจหลักของการสร้างเกมส์  การออกแบบการเล่นของเกมส์ให้ง่ายต่อความเข้าใจ  ขนาดของรูปภาพที่แสดงผลบนหน้าจอ ขนาดของ files เสียง หรือ รูปภาพต่างๆที่นำามาใช้ ต้องไม่มีขนาดใหญ่จนเกินไป  จัดลำาดับของ game loop ให้มีรูปแบบ  การเขียน Thread และใช้ runnable ให้คำานึงถึง Memory และ condition ของเกมส์
  • 3.
    หลักการออกแบบเกมส์  อุปกรณ์ใช้ในการพัฒนาตามความต้องการของเกมส์ – ความละเอียดของหน้าจอ – ขนาดของ jar file – เลือกรุ่นหรือซีรีส์ของอุปกรณ์  เป้าหมายของเกมส์ – จะทำายังไงให้ผู้เล่นเกิดความสนุกและท้าทาย – ทำาไม่ให้เกิดความเบื่อเมื่อเล่นบ่อยๆ – สร้างความน่าสนใจในเกมส์ – สร้างเนื่อเรื่องให้กับเกมส์ เกมส์จะต้องไม่เล่นยากหรือเร็วเกินไป แต่ต้องสร้างความท้าทาย
  • 4.
    Classic Game Loop Start getInput Moving check Collision Repent Process End Games
  • 5.
    Category Game  ActionGame  Puzzle Game  Strategy Game  Others Game
  • 6.
    Apple Tree import java.io.*; importjava.util.Random; import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; import javax.microedition.media.*; import javax.microedition.midlet.*; public class appletree extends MIDlet { AppleCanvas canvas = new AppleCanvas(); public appletree() {} protected void destroyApp(boolean arg0) throws MIDletStateChangeException {} protected void pauseApp() {} protected void startApp() throws MIDletStateChangeException { Display display = Display.getDisplay(this); canvas.start(); display.setCurrent(canvas); } }
  • 7.
    class AppleCanvas extendsGameCanvas implements Runnable { boolean running; int cx, cy, w, h; int delay = 20; Sprite cowboy; Sprite appletree_bg; LayerManager layerManager; Apple apple[]= new Apple[8]; Random position_x = new Random(); int score = 0;
  • 8.
    protected AppleCanvas() { super(true); w = getWidth(); h = getHeight(); cx = w/2; cy = h/2; Image img_cowboy =null; Image img_appleTree = null; try { img_cowboy = Image.createImage("/image/cowboy.png"); img_appleTree = Image.createImage("/image/appletree.png"); } catch (IOException e) {} cowboy = new Sprite(img_cowboy,32,48); appletree_bg = new Sprite(img_appleTree); layerManager = new LayerManager(); layerManager.append(cowboy); new_Apple(); layerManager.append(appletree_bg); }
  • 9.
    public void new_Apple(){ for(int i=0;i<apple.length;i++){ apple[i] = new Apple(); apple[i].setW(w); apple[i].setH(h); layerManager.append(apple[i].getTumbleweed()); } } public void run() { Graphics g = getGraphics(); while(running){ input(); drawScreen(g); for(int i=0;i<apple.length;i++){ if(apple[i].getTumbleweed().collidesWith(cowboy, false)){ apple[i].setY(h+1); score++; playBgSound("/sound/power_sound.wav"); } } try {Thread.sleep(delay);} catch (InterruptedException e) {} } }
  • 10.
    protected void playBgSound(finalString a) { Runnable r = new Runnable() { public void run() { try { InputStream in = getClass().getResourceAsStream(a); Player player = Manager.createPlayer(in, "audio/x-wav"); player.start(); }catch (Exception e) {} } }; new Thread(r).start(); }
  • 11.
    private void input(){ int keyState = getKeyStates(); if(keyState== LEFT_PRESSED){ cx = cx - 5; cx = Math.max(0, cx); cowboy.setTransform(2); cowboy.nextFrame(); } else if(keyState== RIGHT_PRESSED){ cx = cx + 5; cx = Math.min(cx, w-32); cowboy.setTransform(0); cowboy.nextFrame(); } }
  • 12.
    public void start(){ running = true; Thread t = new Thread(this); t.start(); for(int i=0;i<apple.length;i++) { apple[i].start_thread(); } }
  • 13.
    void drawScreen(Graphics g){ String score_string = "Score = "+score+""; g.setColor(255,255,255); g.fillRect(0, 0, w, h); cowboy.setPosition(cx, h - 48); for(int i=0;i<apple.length;i++) { apple[i].getTumbleweed().setPosition(apple[i].getX(),apple[i].getY()); } appletree_bg.setPosition(15, 0); layerManager.paint(g, 0, 0); g.setColor(0,0,0); g.drawString(score_string,0,10,0); flushGraphics(); } }
  • 14.
    แนะนำำรูปแบบ  game Game boy scout รูปแบบการทำางานของเกมส์ – เราทำาหน้าที่เป็นลูกเสือ พาคนแก่ ข้ามถนนไปส่งที่ จุดหมาย – โดย จะต้องพาไปโดยไม่โดนรถชน – และพาไปส่งให้ถกจุดด้วยถึงจะได้คะแนน ู
  • 15.
    -1 +2 -1 -1 -1 +5 Random หยุดเวลา เกำะกลำงถนน +1
  • 16.
    แนะนำำรูปแบบ game  ทุบตัวตุ่น รูปแบบการทำางานของเกมส์ – ต้องทุบหัวตัวที่ขึ้นมาจากหลุมโดยจะมีหลุมอยู่ 9 หลุม โดยจะกดตีโดยใช้ เลย 1 - 9
  • 17.
    1 2 3 ตัวหลอก ถ้ำไปตกดตีจะ 4 5 6 เสียคะแนน 7 8 9 ถ้ำกดตีทันจะ ได้คะแนน การเพิ่งความสนุกของเกมส์ทำาได้โดย • เพิ่งความเร็ว • เพิ่ง Sprite ให้มีรูปแบบการแสดงต่างกัน • เพิ่งเสียงที่ดตื่นเต้น ู • เพิ่มหรือลด หลุมเช่นเริ่มต้นที่ 3 หลุมก่อน ต่อจากนันจึงเพิ่มไปเลือยๆจนถึง 9 หลุม ้ ่ • ถ้าผ่านแต่ละด่านจะมีภาพ animation ให้ดูพร้อมเสียงเพลง
  • 18.
    WEB  http://www.java2s.com/  http://www.developer.com/ http://www.dbarnes.com/  http://www.j2mecodex.com/  http://developers.sun.com/mobility/midp/