рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдХреНрд╖реНрдп рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд▓рдЧрднрдЧ 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
, , . тАФ " ", " ", " " - "" . , , .
, тАФ 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;
....
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
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рд╣рдорд╡рддрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЧреЗрдо рдХрд╛ рдПрдХ рдкреЛрд░реНрдЯ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╕ рдПрдХ рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рдкрд╛рдБрдЪ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдЖрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдЖрд╡реЗрджрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдореЗрд░реА рдХреЛрд╢рд┐рд╢ рдХреЛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдм рдпрд╣ рдЦреЗрд▓ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реБрдЪрд┐ рдХрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рд╕реНрдорд╛рд░реНрдЯрдлрд╝реЛрди рдХреЗ рдпреБрдЧ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗред