рдиреЛрд╕реНрдЯреИрд▓реНрдЬрд┐рдпрд╛ рдкреЛрд╕реНрдЯ: j2me, Gravity Defied, 64kb

рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдХреНрд╖реНрдп рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд▓рдЧрднрдЧ 15 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЙрд╕ рд╕рдордп рдХреЗ рдХрдордЬреЛрд░ рдлреЛрди рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдЧреЗрдо рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреАред



  • рдЕрдЧрд░ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдореБрдЭреЗ рдЗрд╕ рдЦреЗрд▓ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

, floating-point , . "3" тАФ fixed-point . , . , j2me Android.


, j2me тАФ java (, 1.3), .jar PC. тАФ . , - тАФ API j2me .


.


, , , .


Nokia 5200, " " :


  • 2006
  • 128x160 1.8
  • 262 . ( , 6 R, G, B ).
  • - bluetooth .
  • ( , 7 )
  • microSd , , , 256 .
  • - opera mini (, , )
  • 640x480 .
  • MIDP 2.0 (wiki)
  • usb
  • -
  • , , тАФ 100 , , floating-point . , - .

, тАФ , 50-200 .


Write once, run everywhere


java . , . , platform- , .


, тАФ . тАФ . . , .jar j2me .class java. , Canvas, MIDlet javax.microedition.


, . Android : .class , .dex ( , .. dex 65 ), apk, ART.


, . , . , . , Vector synchronized. Vector , ArrayList ArrayList , .


тАФ java . (int, boolean, ...) . Vector Object, .


, go , java 1.3. go - , java 2004 1.5 . 1.3.


j2me тАФ .jar .class ( 1.3, 20 ), Gravity defied PC. "" java javax.microedition , . , : , java.awt.Image javax.microedition.lcdui.Image.


J2ME



javax.microedition. , - , , - , , тАФ . javax.microedition.lcdui.


MIDlet.


startApp().
тАФ pauseApp() startApp() . destroyApp().


, notifyPaused() notifyDestroyed() тАФ , .
, " " resumeRequest()


, notifyPaused(), , .


, lifecycle .


, Runnable - :


Thread thread;
boolean isRunning;
boolean needToDestroy = false;

public void startApp() {
    isRunning = true;
    if (thread != null) {
        thread = new Thread(this);
        thread.start();
    }
}

public void pauseApp() {
    isRunning = false;
}

public void destroyApp(boolean unconditional) {
    needToDestroy = true;
}

, .


void run(){
    while(!needToDestroy) {
        //   
        //     - .
        while (!isRunning) {
            Thread.sleep(100);
        }
    }
    notifyDestroyed();
}

, 100 тАФ , . , pauseApp() startApp()


Canvas


тАФ Canvas. Canvas java.


repaint(), , . UI- paint(Graphics g). , - , Canvas тАФ . тАФ repaint() paint(...) .


, :
hasPointerEvents(), hasPointerMotionEvents(), hasRepeatEvents(), true. pointerDragged(int x, int y) ( ), pressed( ) released( ).
тАФ , .



, тАФ , . . , , . , 240360 . тАФ тАФ .


- , "" , . j2me - , , .., . , nokia 5800 , .


MIDlet Pascal


- , . java2me , , MIDlet pascal . j2me тАФ , , java.


?


, , , Gravity Defied 64 .


-, .jar тАФ zip , 122.1 kB


  • META-INF MANIFEST.MF 3.8 kB, SHA-1 MD5 . .
  • levels.mrg 5.1 kB 30 . 170 . .
  • 11 . 10.8 kB.
  • .class , 98.3 kB, 15 . тАФ 127 , 24.3 kB. :
    • , (4 ), 127 174 .
    • тАФ 470 .
    • 9 тАФ 1.6 6 kB.
    • god-like :


. fernflower тАФ , intelliJ IDEA. тАФ , . .


IDEA тАФ , .


: /gradlew jar, build .jar
: mkdir decompiled && java -jar fernflower.jar -ren=1 GravityDefied_java decompiled


ren , if for. , java . ren=1 field_42 method_135 тАФ , .


2004 тАФ , , :


  • - , . .class .
  • else, int ..
  • . "" Micro, .
  • , fixed-point , . , (int)((long)a * b >> 16)
  • , , .


тАФ , . , , -. , .


- Netbeans, j2me SDK. , , ant. .


, Linux. gradle . тАФ javax.microedition.*. тАФ PC- java. . , .


watch ./gradlew run . ctrl+S .


.
19 :


  • 8 javax.microedition.rms.
  • 10 .lcdui, , , Canvas ..).
  • MIDlet тАФ , .

, .


Micro, . - , startApp MIDlet .


:


protected void pauseApp() {
    c = true;
    if (!b) {
        this.gameToMenu();
    }
    System.gc();
}

, c isPaused.


"" :


public void a() {
    if (this.recordStore != null) {
        try {
            this.e.closeRecordStore();
            return;
        } catch (RecordStoreException var1) {
        }
    }
}

- closeMethodStore.


, intelliJ IDEA - . тАФ , , Image.loadImage(name):


this.p = Image.createImage("/splash.png");

, p splashImage.


- тАФ , . , тАж Jetbrains тАФ , тАФ . , , .


- . тАФ loadImage()тАж null . .


: , Image:


public class Image {
    public final java.awt.Image image;

    private Image(java.at.Image image) {
        this.image = image;
    }

    public Graphics getGraphics() {
        throw new RuntimeException();
    }

    public int getWidth() {
        return image.getWidth(null);
    }

    public static Image createImage(int w, int h) {
        return new Image(new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB));
    }
    ...
}

, API , .


CanvasImpl, JPanel. Canvas.
, c :


public void paintComponent(Graphics g) {
    if (upscale == 1) {
        canvas.paint(new javax.microedition.lcdui.Graphics(g));
    } else {
        canvas.paint(new javax.microedition.lcdui.Graphics(screen.getGraphics()));
        g.drawImage(screen, 0, 0, width * upscale, height * upscale, Color.WHITE, null);
    }
}

javax.microedition.lcdui.Graphics(g) тАФ awt.Graphics, .


, . "" , .


, , , , тАФ . PC. ? - 64 * 64, , 1 * 1 , 240 * 320 . , , , , .


, . , , , , , .


, , j2me PC. тАФ 2010 -, - . - - тАФ .


!


, .


.jar . . , , . - Alert Canvas Displayable , Canvas. , .


gradle :


  • emulator , , . , , .
  • app-original, .jar
  • app-from-sources - . .


, , . "" , , .


, .


Fixed-point physics


. , 16 тАФ . , , -32768.0 32767.999984 c 1.0 / 65536.


тАФ .


int.


: int, , "". long. 64 32 . 16 16- int.


: . long, 16 . - , 32 тАФ 16.


sin, cos atan2.


тАФ 64 тАФ 0 90 . , тАФ . . , .




, . Canvas.hasPointerEvents() true, , . тАФ " ", " ", " " - "" . , , .


Level format


, тАФ 170 . ? тАФ .


, тАФ / .., . . 0xff, int , , тАФ dx , dy.


for (int i = 1; i < pointsCount; ++i) {
    byte modeOrDx;
    if ((modeOrDx = var1.readByte()) == -1) {
        offsetY = 0;
        offsetX = 0;
        pointX = var1.readInt();
        pointY = var1.readInt();
    } else {
        pointX = modeOrDx;
        pointY = var1.readByte();
    }
    offsetX += pointX;
    offsetY += pointY;
    this.addPointSimple(offsetX, offsetY);
}


.



GPU full hd , (128*160 240*320). 3 - , api . , тАФ 90-180-270 .


, тАФ .
, 32 16 . 48*48 1091 .


, , - API 3 3 - 3-. , - .


тАФ 2 3.



. тАФ 100 "23" "64".


if (time10MsToStringCache[time10MsPart] == null) {
    String zeroPadding;
    if (time10MsPart >= 10) {
        zeroPadding = "";
    } else {
        zeroPadding = "0";
    }
    time10MsToStringCache[time10MsPart] = zeroPadding + time10Ms % 100L;
}

, , . , -.


No-MVP


MenuManager ( ) . - , тАФ - , .


, - , . : Android:


  • layout . .
  • stings.txt.
  • Activity, .
  • LifecycleObserver, Adapter , Activity .
  • Adapter DataSource.
  • " ", Bundle DataSource .
  • DataSouce SQLite .

: , ? , .



, TimerOrMotoPartOrMenuElem .
, , :


  • -
  • , " "

, , , тАФ .


, , 64 . , - , "" .



, , , , . ", " тАФ .


:


public void init() {
    long timeToLoading = 3000L;
    Thread.yield();
    this.gameCanvas = new GameCanvas(this);
    Display.getDisplay(this).setCurrent(this.gameCanvas);
    this.gameCanvas.requestRepaint(1);

    while (!this.gameCanvas.isShown()) {
        this.goLoadingStep();
    }

    long deltaTimeMs;
    while (timeToLoading > 0L) {
        deltaTimeMs = this.goLoadingStep();
        timeToLoading -= deltaTimeMs;
    }

    this.gameCanvas.requestRepaint(2);

    for (timeToLoading = 3000L; timeToLoading > 0L; timeToLoading -= deltaTimeMs) {
        deltaTimeMs = this.goLoadingStep();
    }

    while (gameLoadingStateStage < 10) {
        this.goLoadingStep();
    }

    this.gameCanvas.requestRepaint(0);
    this.isInited = true;
}

goLoadingStep() . goLoadingStep(). goLoadingStep , .


goLoadingStep() :


private long goLoadingStep() {
    ++gameLoadingStateStage;
    this.gameCanvas.repaint();
    long startTimeMillis = System.currentTimeMillis();
    switch (gameLoadingStateStage) {
        case 1:
            this.levelLoader = new LevelLoader();
            break;
        case 2:
            this.gamePhysics = new GamePhysics(this.levelLoader);
            this.gameCanvas.init(this.gamePhysics);
            break;
        case 3:
            this.menuManager = new MenuManager(this);
            this.menuManager.initPart(1);
            break;
            .... ///   5-8
        case 9:
            this.menuManager.initPart(7);
            break;
        case 10:
            this.gameCanvas.setMenuManager(this.menuManager);
            this.gameCanvas.setViewPosition(-50, 150);
            this.setMode(1);
            break;
        default:
            --gameLoadingStateStage;

            try {
                Thread.sleep(100L);
            } catch (InterruptedException var3) {
            }
    }

    return System.currentTimeMillis() - startTimeMillis;
}

MenuManager.initPart() switch case .


, , . , .



2004 . Excitera Mobile Awards 2004 (EMA04) best-in-show. Codebrew Software :


  • Tors Bj├╢rn Henrik Johansson тАФ system/game logic/interface, testing, levels design
  • Set Elis Norman тАФ graphics/physics/mathematics/system/tools programming, levels design
  • Per David Jacobsson тАФ physics programming, game graphics, levels design

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рд╣рдорд╡рддрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЧреЗрдо рдХрд╛ рдПрдХ рдкреЛрд░реНрдЯ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╕ рдПрдХ рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдЪреВрдВрдХрд┐ рдкрд╛рдБрдЪ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдЖрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдЖрд╡реЗрджрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдореЗрд░реА рдХреЛрд╢рд┐рд╢ рдХреЛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдм рдпрд╣ рдЦреЗрд▓ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реБрдЪрд┐ рдХрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рд╕реНрдорд╛рд░реНрдЯрдлрд╝реЛрди рдХреЗ рдпреБрдЧ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗред


All Articles