From 5bc7239e49c5fa79b33169dfb0ce2d77c8e5af10 Mon Sep 17 00:00:00 2001 From: badlogicgames Date: Fri, 4 Feb 2011 21:38:06 +0000 Subject: [PATCH] [changed] metagun is working :p --- demos/metagun/metagun-desktop/res/background.png | Bin 35708 -> 38873 bytes demos/metagun/metagun-desktop/res/exposition.txt | 85 +++ demos/metagun/metagun-desktop/res/levels.png | Bin 9320 -> 9307 bytes demos/metagun/metagun-desktop/res/titlescreen.png | Bin 12751 -> 18277 bytes demos/metagun/metagun-desktop/res/winscreen1.png | Bin 5209 -> 6236 bytes demos/metagun/metagun-desktop/res/winscreen2.png | Bin 5557 -> 6751 bytes .../src/com/mojang/metagun/Art.java | 156 ++--- .../src/com/mojang/metagun/Input.java | 48 +- .../src/com/mojang/metagun/Metagun.java | 30 +- .../src/com/mojang/metagun/entity/Boss.java | 25 +- .../src/com/mojang/metagun/entity/BossNeck.java | 11 +- .../src/com/mojang/metagun/entity/BossPart.java | 5 +- .../src/com/mojang/metagun/entity/Bullet.java | 57 +- .../src/com/mojang/metagun/entity/Entity.java | 6 +- .../src/com/mojang/metagun/entity/Explosion.java | 10 +- .../src/com/mojang/metagun/entity/Gore.java | 10 +- .../src/com/mojang/metagun/entity/Gremlin.java | 24 +- .../src/com/mojang/metagun/entity/Gunner.java | 13 +- .../src/com/mojang/metagun/entity/Hat.java | 20 +- .../src/com/mojang/metagun/entity/HeadGore.java | 10 +- .../src/com/mojang/metagun/entity/Jabberwocky.java | 24 +- .../src/com/mojang/metagun/entity/Player.java | 23 +- .../src/com/mojang/metagun/entity/PlayerGore.java | 10 +- .../src/com/mojang/metagun/entity/Sign.java | 13 +- .../src/com/mojang/metagun/entity/Spark.java | 10 +- .../src/com/mojang/metagun/level/Level.java | 627 +++++++++++---------- .../mojang/metagun/screen/ExpositionScreen.java | 25 +- .../src/com/mojang/metagun/screen/GameScreen.java | 169 +++--- .../metagun/screen/LevelTransitionScreen.java | 84 +-- .../src/com/mojang/metagun/screen/PauseScreen.java | 18 +- .../src/com/mojang/metagun/screen/Screen.java | 95 ++-- .../com/mojang/metagun/screen/SignReadScreen.java | 14 +- .../src/com/mojang/metagun/screen/TitleScreen.java | 17 +- .../src/com/mojang/metagun/screen/WinScreen.java | 40 +- 34 files changed, 949 insertions(+), 730 deletions(-) create mode 100644 demos/metagun/metagun-desktop/res/exposition.txt diff --git a/demos/metagun/metagun-desktop/res/background.png b/demos/metagun/metagun-desktop/res/background.png index 21b3b50da402d676bf22f18e6f7cfd16ab4f3be0..a7c1f004db097f8ea78ed529f71c1f29db678be2 100644 GIT binary patch literal 38873 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𝔵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 V9_)9N0|BS&zMipe>1~^^{{XTv^wR(U literal 35708 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 Ef-YH9c>n+a diff --git a/demos/metagun/metagun-desktop/res/exposition.txt b/demos/metagun/metagun-desktop/res/exposition.txt new file mode 100644 index 000000000..6fbbd03cf --- /dev/null +++ b/demos/metagun/metagun-desktop/res/exposition.txt @@ -0,0 +1,85 @@ + METAGUN + + + + ABOUT + +METAGUN WAS MADE BY MARKUS PERSSON IN +AUGUST 2010 FOR LUDUM DARE 18, +A COMPETITION WHERE YOU MAKE A GAME +DURING A SINGLE WEEKEND. + + +THE THEME OF THE COMPETITION WAS +"ENEMIES AS WEAPONS". + + + + + + THE STORY SO FAR + +RECENTLY, THE POLITICAL CLIMATE HAS +GROWN WEIRD. SEVERAL COUNTRIES HAVE +DECLARED THEMSELVES ROADLESS, AND +SOMETHING SOMETHING IN THE MONTH OF MAY. +ANYWAY, YOU FIND THIS TOTALLY AWESOME +GUN THAT SHOOTS SMALLER PEOPLE WITH GUNS +WHO IN TURN SHOOT YOU! + + +AWESOME! + + + + + + CONTROLS + +USE THE ARROWS KEYS TO MOVE +PRESS Z, A, C OR D TO JUMP +PRESS X OR S TO FIRE +PRESS ESCAPE TO PAUSE THE GAME + + +ONCE YOU GET THE GUN, YOU CAN AIM UP +AND DOWN BY PRESSING UP AND DOWN + + + + + SELECTED WORDS STARTING WITH F + +FISH, FREEDOM, FIGURE, FOOT, FORK, +FLOOD, FATAL, FUNGUS, FAX, FILM, FOG, +FATTY, FOOT AGAIN, FELT, GNOME, F'TANG, + + +NO WAIT GNOME STARTS WITH G, I WILL +START OVER! + + +FISH, FREEDOM, FIGURE, FOOT, FORK, +FLOOD, FATAL, FUNGUS, FAX, FILM, FOG, +FATTY, FOOT AGAIN, FELT, F'TANG, +FONE BONE, FADE, FORCE, FURBISH, FELONY, +FEDORA. + + + + + THANK YOU + +ELIN <3 + +POV AND THE REST OF THE LD TEAM + +EVERYONE PARTICIPATING IN LD18 + +EVERY SINGLE ONE WHO WASTED TIME +WATCHING ME DEVELOP THIS GAME LIVE, +AND EVERYONE WHO CAME WITH FEEDBACK + +DRPETTER FOR SFXR + +VALVE FOR TOTALLY RELEASING EP3 SOON \ No newline at end of file diff --git a/demos/metagun/metagun-desktop/res/levels.png b/demos/metagun/metagun-desktop/res/levels.png index f14d18d5934b34c18f54889e467d581a141efc68..aa173b68cc4ca693d8187dfd92a05ae14d9509bb 100644 GIT binary patch delta 61 zcmaFiaob~p%0xp6{X+~4e1{lCHM|-a7#Ji=Tq8H831Me6w3er delta 44 zcmV+{0Mq~5Na#qABnkm@Qb$4nuFf3kks%uj!vFvd!vV){sAQ2wAO$r^iu~ZQYw#m? Cr4gS1 diff --git a/demos/metagun/metagun-desktop/res/titlescreen.png b/demos/metagun/metagun-desktop/res/titlescreen.png index c5672191785ec8c4da53383db6b69bcfce793517..186456b88ad89e379cb1ddb22fb515bff470c142 100644 GIT binary patch literal 18277 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 literal 12751 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 N)7LiAdZ|GO{2#6{>RkW; diff --git a/demos/metagun/metagun-desktop/res/winscreen1.png b/demos/metagun/metagun-desktop/res/winscreen1.png index 1c1da3dddf90dadd8a8a1b2537a8b5ec77b52838..9d7eadbfbff7fd4cb1db49005e1eacb7caeb9b71 100644 GIT binary patch literal 6236 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 literal 5209 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 H;MD&Cf2F7V diff --git a/demos/metagun/metagun-desktop/res/winscreen2.png b/demos/metagun/metagun-desktop/res/winscreen2.png index 2cb20220885cc32340252081a49c537ff14463e0..b235270435ceb4991066d5dbf8b5c2f76f7be756 100644 GIT binary patch literal 6751 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 literal 5557 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 0) { buttons[button] = down; @@ -55,4 +52,19 @@ public class Input { buttons[i] = false; } } + + @Override public boolean keyDown (int keycode) { + set(keycode, true); + return false; + } + + @Override public boolean keyUp (int keycode) { + set(keycode, false); + return false; + } + + @Override public boolean keyTyped (char character) { + // TODO Auto-generated method stub + return false; + } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/Metagun.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/Metagun.java index 1b905ea9f..c552a53cc 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/Metagun.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/Metagun.java @@ -1,17 +1,14 @@ package com.mojang.metagun; -import java.applet.Applet; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.io.IOException; - -import javax.imageio.ImageIO; -import javax.swing.JFrame; +import java.awt.event.KeyEvent; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; -import com.mojang.metagun.screen.*; +import com.badlogic.gdx.graphics.GL10; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.mojang.metagun.screen.GameScreen; +import com.mojang.metagun.screen.Screen; public class Metagun implements ApplicationListener { public static final int GAME_WIDTH = 320; @@ -25,10 +22,17 @@ public class Metagun implements ApplicationListener { private Input input = new Input(); private boolean started = false; private float accum = 0; + BitmapFont font; + SpriteBatch batch; public void create() { + Art.load(); + Gdx.input.setInputProcessor(input); running = true; - setScreen(new TitleScreen()); +// setScreen(new TitleScreen()); + setScreen(new GameScreen()); + font = new BitmapFont(); + batch = new SpriteBatch(); } public void pause() { @@ -48,13 +52,17 @@ public class Metagun implements ApplicationListener { } public void render() { + Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); accum += Gdx.graphics.getDeltaTime(); while(accum > 1.0f / 60.0f) { screen.tick(input); input.tick(); accum -= 1.0f / 60.0f; } - screen.render(); + screen.render(); + batch.begin(); + font.draw(batch, "fps: " + Gdx.graphics.getFramesPerSecond(), 10, 30); + batch.end(); } public void keyPressed(KeyEvent ke) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Boss.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Boss.java index 13c4077c8..99250dbf2 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Boss.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Boss.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.screen.Screen; public class Boss extends BossPart { private static final int MAX_TEMPERATURE = 80 * 5; @@ -51,16 +51,17 @@ public class Boss extends BossPart { } } - public void render(Graphics g, Camera camera) { + public void render(Screen screen, Camera camera) { int xp = (int) x - 2; int yp = (int) y - 2; - g.drawImage(Art.gremlins[3][1], xp, yp, null); - g.setColor(Color.BLACK); - yp += 2; - xp -= 7; - g.fillRect(xp + 5, yp - 8, 20, 3); - g.setColor(Color.RED); - g.fillRect(xp + 5, yp - 8, 20 - (20 * temperature / MAX_TEMPERATURE), 2); + screen.draw(Art.gremlins[3][1], xp, yp); + //FIXME +// g.setColor(Color.BLACK); +// yp += 2; +// xp -= 7; +// g.fillRect(xp + 5, yp - 8, 20, 3); +// g.setColor(Color.RED); +// g.fillRect(xp + 5, yp - 8, 20 - (20 * temperature / MAX_TEMPERATURE), 2); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossNeck.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossNeck.java index fa26a527a..308a03e74 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossNeck.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossNeck.java @@ -1,9 +1,8 @@ package com.mojang.metagun.entity; -import java.awt.*; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.screen.Screen; public class BossNeck extends BossPart { public int slamTime = 0; @@ -47,10 +46,10 @@ public class BossNeck extends BossPart { baseRot = rot; } - public void render(Graphics g, Camera camera) { + public void render(Screen screen, Camera camera) { int xp = (int) x - 1; int yp = (int) y - 1; - g.drawImage(Art.gremlins[4][1], xp, yp, null); + screen.draw(Art.gremlins[4][1], xp, yp); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossPart.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossPart.java index 53891207b..32c04dd1f 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossPart.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/BossPart.java @@ -1,11 +1,12 @@ package com.mojang.metagun.entity; -public class BossPart extends Entity { + +public abstract class BossPart extends Entity { public int dieIn = 0; public void setRot(double rot) { } public void outOfBounds() { - } + } } \ No newline at end of file diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Bullet.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Bullet.java index 16844d1dd..f20095133 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Bullet.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Bullet.java @@ -1,8 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; +import com.mojang.metagun.Art; import com.mojang.metagun.level.*; +import com.mojang.metagun.screen.Screen; public class Bullet extends Entity { public Entity source; @@ -47,33 +48,35 @@ public class Bullet extends Entity { remove(); } - public void render(Graphics g, Camera camera) { - if (tick % 2 == 0) { - g.setColor(Color.YELLOW); - int x1 = (int) (x + w / 2 - xa * 3); - int y1 = (int) (y + h / 2 - ya * 3); - int x2 = (int) (x + w / 2); - int y2 = (int) (y + h / 2); - - g.drawLine(x1, y1, x2, y2); - g.setColor(Color.WHITE); - - x1 = (int) (x + w / 2 - xa); - y1 = (int) (y + h / 2 - ya); - x2 = (int) (x + w / 2 + xa); - y2 = (int) (y + h / 2 + ya); - - g.drawLine(x1, y1, x2, y2); - } else { - g.setColor(Color.YELLOW); - int x1 = (int) (x + w / 2 - xa); - int y1 = (int) (y + h / 2 - ya); - int x2 = (int) (x + w / 2 + xa); - int y2 = (int) (y + h / 2 + ya); - - g.drawLine(x1, y1, x2, y2); - } + public void render(Screen g, Camera camera) { + // FIXME +// if (tick % 2 == 0) { +// g.setColor(Color.YELLOW); +// int x1 = (int) (x + w / 2 - xa * 3); +// int y1 = (int) (y + h / 2 - ya * 3); +// int x2 = (int) (x + w / 2); +// int y2 = (int) (y + h / 2); +// +// g.drawLine(x1, y1, x2, y2); +// g.setColor(Color.WHITE); +// +// x1 = (int) (x + w / 2 - xa); +// y1 = (int) (y + h / 2 - ya); +// x2 = (int) (x + w / 2 + xa); +// y2 = (int) (y + h / 2 + ya); +// +// g.drawLine(x1, y1, x2, y2); +// } else { +// g.setColor(Color.YELLOW); +// int x1 = (int) (x + w / 2 - xa); +// int y1 = (int) (y + h / 2 - ya); +// int x2 = (int) (x + w / 2 + xa); +// int y2 = (int) (y + h / 2 + ya); +// +// g.drawLine(x1, y1, x2, y2); +// } + g.draw(Art.shot, (int)x, (int)y); // g.fillRect(xp, yp, w, h); } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Entity.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Entity.java index a80d37677..fedb7317e 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Entity.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Entity.java @@ -4,8 +4,9 @@ import java.awt.Graphics; import java.util.Random; import com.mojang.metagun.level.*; +import com.mojang.metagun.screen.Screen; -public class Entity { +public abstract class Entity { protected boolean onGround = false; protected static Random random = new Random(); @@ -71,8 +72,7 @@ public class Entity { public void tick() { } - public void render(Graphics g, Camera camera) { - } + public abstract void render(Screen screen, Camera camera); public boolean shot(Bullet bullet) { return false; diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Explosion.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Explosion.java index 58be7f9ee..7ada851c0 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Explosion.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Explosion.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Explosion extends Entity { private int life, delay, color; @@ -56,9 +56,9 @@ public class Explosion extends Entity { this.ya *= 0.4; } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; - g.drawImage(Art.guys[(life - 1) * 8 / duration][4 + color], xp - 3, yp - 3, null); + g.draw(Art.guys[(life - 1) * 8 / duration][4 + color], xp - 3, yp - 3); } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gore.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gore.java index a189d0bdf..728c19187 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gore.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gore.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Gore extends Entity { private int life; @@ -35,9 +35,9 @@ public class Gore extends Entity { this.ya *= 0.4; } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; - g.drawImage(Art.guys[7][1], xp, yp, null); + g.draw(Art.guys[7][1], xp, yp); } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gremlin.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gremlin.java index 608727570..638ed958b 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gremlin.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gremlin.java @@ -1,9 +1,10 @@ package com.mojang.metagun.entity; -import java.awt.*; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Gremlin extends Entity { private static final int MAX_TEMPERATURE = 80 * 5; @@ -60,18 +61,19 @@ public class Gremlin extends Entity { } } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; if (onGround) { - g.drawImage(Art.gremlins[0][power], xp, yp, null); + g.draw(Art.gremlins[0][power], xp, yp); } else { - g.drawImage(Art.gremlins[ya > 0 ? 2 : 1][power], xp, yp, null); + g.draw(Art.gremlins[ya > 0 ? 2 : 1][power], xp, yp); } - g.setColor(Color.BLACK); - g.fillRect(xp + 5, yp - 8, 20, 3); - g.setColor(Color.RED); - g.fillRect(xp + 5, yp - 8, 20 - (20 * temperature / MAX_TEMPERATURE), 2); + // FIXME +// g.setColor(Color.BLACK); +// g.fillRect(xp + 5, yp - 8, 20, 3); +// g.setColor(Color.RED); +// g.fillRect(xp + 5, yp - 8, 20 - (20 * temperature / MAX_TEMPERATURE), 2); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gunner.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gunner.java index 036fc1750..48921756a 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gunner.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Gunner.java @@ -1,9 +1,10 @@ package com.mojang.metagun.entity; -import java.awt.*; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Gunner extends Entity { public static final int CHARGE_DURATION = 100; @@ -58,7 +59,7 @@ public class Gunner extends Entity { } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { // g.setColor(Color.red); int xp = (int) x; int yp = (int) y; @@ -99,7 +100,7 @@ public class Gunner extends Entity { } - g.drawImage(Art.guys[xFrame][yFrame], xp, yp, null); + g.draw(Art.guys[xFrame][yFrame], xp, yp); java.util.List entities = level.getEntities((int) x, (int) y, 1, 1); for (int i = 0; i < entities.size(); i++) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Hat.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Hat.java index 8c23ef423..df2ce001e 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Hat.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Hat.java @@ -1,10 +1,11 @@ package com.mojang.metagun.entity; -import java.awt.*; -import java.awt.image.BufferedImage; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Hat extends Entity { double time = 0; @@ -51,7 +52,8 @@ public class Hat extends Entity { player.hatCount++; if (xPos >= 0 && yPos >= 0) { - Art.level.setRGB(xPos, yPos, 0); + Art.level.setColor(0, 0, 0, 0); + Art.level.drawPixel(xPos, yPos); } Sound.gethat.play(); remove(); @@ -60,16 +62,16 @@ public class Hat extends Entity { } } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int dir = 1; int xp = (int) x - (16 - w) / 2; int yp = (int) y - 2; - BufferedImage[][] sheet = dir == 1 ? Art.player1 : Art.player2; + TextureRegion[][] sheet = dir == 1 ? Art.player1 : Art.player2; int xFrame = (int) (xa * 10); if (xFrame < -1) xFrame = -1; if (xFrame > +1) xFrame = +1; - g.drawImage(sheet[1 + xFrame][1], xp, yp, null); + g.draw(sheet[1 + xFrame][1], xp, yp); } public boolean shot(Bullet bullet) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/HeadGore.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/HeadGore.java index 5bf1a9ff2..4b5c2993e 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/HeadGore.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/HeadGore.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class HeadGore extends Entity { private int life; @@ -36,10 +36,10 @@ public class HeadGore extends Entity { this.ya *= 0.8; } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; - g.drawImage(Art.guys[6][1], xp, yp, null); + g.draw(Art.guys[6][1], xp, yp); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Jabberwocky.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Jabberwocky.java index 2ef81af75..32f2efdae 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Jabberwocky.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Jabberwocky.java @@ -1,9 +1,10 @@ package com.mojang.metagun.entity; -import java.awt.*; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Jabberwocky extends Entity { private static final int MAX_TEMPERATURE = 80 * 5; @@ -48,15 +49,16 @@ public class Jabberwocky extends Entity { } } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y-10; - g.drawImage(Art.gremlins[3+(slamTime/10%5==2?1:0)][0], xp, yp, null); - g.setColor(Color.BLACK); - yp+=10; - g.fillRect(xp + 5, yp - 8, 20, 3); - g.setColor(Color.RED); - g.fillRect(xp + 5, yp - 8, (20 * temperature / MAX_TEMPERATURE), 2); + g.draw(Art.gremlins[3+(slamTime/10%5==2?1:0)][0], xp, yp); + // FIXME +// g.setColor(Color.BLACK); +// yp+=10; +// g.fillRect(xp + 5, yp - 8, 20, 3); +// g.setColor(Color.RED); +// g.fillRect(xp + 5, yp - 8, (20 * temperature / MAX_TEMPERATURE), 2); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Player.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Player.java index c37ccf356..bb96fe093 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Player.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Player.java @@ -1,10 +1,13 @@ package com.mojang.metagun.entity; -import java.awt.*; -import java.awt.image.BufferedImage; - -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; +import com.mojang.metagun.Sound; +import com.mojang.metagun.Stats; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Player extends Entity { private int dir = 1; @@ -28,7 +31,7 @@ public class Player extends Entity { public void tick() { } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { // g.setColor(Color.GREEN); int xp = (int) x - (16 - w) / 2; int yp = (int) y - 2; @@ -36,19 +39,19 @@ public class Player extends Entity { int stepFrame = frame / 4 % 4; - BufferedImage[][] sheet = dir == 1 ? Art.player1 : Art.player2; + TextureRegion[][] sheet = dir == 1 ? Art.player1 : Art.player2; if (!onGround) { int yya = (int) Math.round(-ya); stepFrame = 4; if (yya < -1) stepFrame = 5; yp += yya; } - g.drawImage(sheet[3 + stepFrame][hatCount > 0 ? 0 : 1], xp, yp, null); + g.draw(sheet[3 + stepFrame][hatCount > 0 ? 0 : 1], xp, yp); yp += (stepFrame == 3 ? 1 : 0); for (int i = 1; i < hatCount; i++) { - g.drawImage(sheet[0][1], xp, yp - i * 2, null); + g.draw(sheet[0][1], xp, yp - i * 2); } if (gunLevel > 0) { @@ -58,7 +61,7 @@ public class Player extends Entity { if (yya > 1) yya = 1; yp += yya; } - g.drawImage(sheet[1 + yAim][(gunLevel - 1) * 2], xp, yp, null); + g.draw(sheet[1 + yAim][(gunLevel - 1) * 2], xp, yp); } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/PlayerGore.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/PlayerGore.java index c3149346a..c970637f1 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/PlayerGore.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/PlayerGore.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class PlayerGore extends Entity { private int life; @@ -36,10 +36,10 @@ public class PlayerGore extends Entity { this.ya *= 0.9; } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; - g.drawImage(Art.guys[6][1], xp, yp, null); + g.draw(Art.guys[6][1], xp, yp); } public void hitSpikes() { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Sign.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Sign.java index 3d3d7fb84..0aa9783a1 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Sign.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Sign.java @@ -1,9 +1,8 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.screen.Screen; public class Sign extends Entity { public int id; @@ -34,15 +33,15 @@ public class Sign extends Entity { } } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { if (id==6 && level.player.gunLevel>=1) return; if (id==15 && level.player.gunLevel>=2) return; if (id==6) { - g.drawImage(Art.walls[5][0], (int)x, (int)y, null); + g.draw(Art.walls[5][0], (int)x, (int)y); } else if (id==15) { - g.drawImage(Art.walls[6][0], (int)x, (int)y, null); + g.draw(Art.walls[6][0], (int)x, (int)y); } else { - g.drawImage(Art.walls[4][0], (int)x, (int)y, null); + g.draw(Art.walls[4][0], (int)x, (int)y); } } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Spark.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Spark.java index 89e6abfab..f40adf9e2 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Spark.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/entity/Spark.java @@ -1,9 +1,9 @@ package com.mojang.metagun.entity; -import java.awt.*; - import com.mojang.metagun.Art; -import com.mojang.metagun.level.*; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; +import com.mojang.metagun.screen.Screen; public class Spark extends Entity { private int life; @@ -35,9 +35,9 @@ public class Spark extends Entity { this.ya *= 0.4; } - public void render(Graphics g, Camera camera) { + public void render(Screen g, Camera camera) { int xp = (int) x; int yp = (int) y; - g.drawImage(Art.guys[9][1], xp, yp, null); + g.draw(Art.guys[9][1], xp, yp); } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/level/Level.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/level/Level.java index 62ad73d8d..fe0c0a2d5 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/level/Level.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/level/Level.java @@ -1,330 +1,365 @@ + package com.mojang.metagun.level; -import java.awt.*; -import java.util.*; +import java.util.ArrayList; import java.util.List; +import java.util.Random; -import com.mojang.metagun.*; -import com.mojang.metagun.entity.*; +import com.badlogic.gdx.math.Matrix4; +import com.mojang.metagun.Art; +import com.mojang.metagun.Sound; +import com.mojang.metagun.entity.Boss; +import com.mojang.metagun.entity.BossNeck; +import com.mojang.metagun.entity.BossPart; +import com.mojang.metagun.entity.Entity; +import com.mojang.metagun.entity.Explosion; +import com.mojang.metagun.entity.Gremlin; +import com.mojang.metagun.entity.Gunner; +import com.mojang.metagun.entity.Hat; +import com.mojang.metagun.entity.Jabberwocky; +import com.mojang.metagun.entity.Player; +import com.mojang.metagun.entity.Sign; import com.mojang.metagun.screen.GameScreen; +import com.mojang.metagun.screen.Screen; public class Level { - public static final double FRICTION = 0.99; - public static final double GRAVITY = 0.10; - public List entities = new ArrayList(); - public byte[] walls; - public List[] entityMap; - private int width, height; - public Player player; - public int xSpawn, ySpawn; - private Random random = new Random(1000); - private GameScreen screen; - private int respawnTime = 0; - // private int xo, yo; - private int tick; + public static final double FRICTION = 0.99; + public static final double GRAVITY = 0.10; + public List entities = new ArrayList(); + public byte[] walls; + public List[] entityMap; + private int width, height; + public Player player; + public int xSpawn, ySpawn; + private Random random = new Random(1000); + private GameScreen screen; + private int respawnTime = 0; + // private int xo, yo; + private int tick; - @SuppressWarnings("unchecked") - public Level(GameScreen screen, int w, int h, int xo, int yo, int xSpawn, int ySpawn) { - this.screen = screen; - int[] pixels = new int[32 * 24]; - this.xSpawn = xSpawn; - this.ySpawn = ySpawn; + @SuppressWarnings("unchecked") public Level (GameScreen screen, int w, int h, int xo, int yo, int xSpawn, int ySpawn) { + this.screen = screen; +// int[] pixels = new int[32 * 24]; + this.xSpawn = xSpawn; + this.ySpawn = ySpawn; - Art.level.getRGB(xo * 31, yo * 23, 32, 24, pixels, 0, 32); + +// Art.level.getRGB(xo * 31, yo * 23, 32, 24, pixels, 0, 32); - walls = new byte[w * h]; - entityMap = new ArrayList[w * h]; - this.width = w; - this.height = h; + walls = new byte[w * h]; + entityMap = new ArrayList[w * h]; + this.width = w; + this.height = h; - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - entityMap[x + y * w] = new ArrayList(); + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + entityMap[x + y * w] = new ArrayList(); - int col = pixels[x + y * w] & 0xffffff; - byte wall = 0; +// int col = pixels[x + y * w] & 0xffffff; + int col = (Art.level.getPixel(x + xo * 31, y + yo * 23) & 0xffffff00) >>> 8; + byte wall = 0; - if (col == 0xffffff) wall = 1; - else if (col == 0xFF00FF) wall = 2; - else if (col == 0xffff00) wall = 3; - else if (col == 0xff0000) wall = 4; - else if (col == 0xB7B7B7) wall = 5; - else if (col == 0xFF5050) wall = 6; - else if (col == 0xFF5051) wall = 7; - else if (col == 0x383838) wall = 8; - else if (col == 0xA3FFFF) wall = 9; - else if (col == 0x83FFFF) { - BossPart prev = new Boss(x * 10 - 2, y * 10 - 2); - int timeOffs = random.nextInt(60); - ((Boss)prev).time = timeOffs; - add(prev); - for (int i = 0; i < 10; i++) { - BossNeck b = new BossNeck(x * 10 - 1, y * 10 - 1, prev); - b.time = i * 10 + timeOffs; - prev = b; - add(prev); - } - } else if (col == 0x80FFFF) { - Gremlin g = new Gremlin(0, x * 10 - 10, y * 10 - 20); - g.jumpDelay = random.nextInt(50); - add(g); - } else if (col == 0x81FFFF) { - Gremlin g = new Gremlin(1, x * 10 - 10, y * 10 - 20); - g.jumpDelay = random.nextInt(50); - add(g); - } else if (col == 0x82FFFF) { - Jabberwocky g = new Jabberwocky(x * 10 - 10, y * 10 - 10); - g.slamTime = random.nextInt(30); - add(g); - } else if (col == 0xFFADF8) { - add(new Hat(x * 10 + 1, y * 10 + 5, xo * 31 + x, yo * 23 + y)); - } else if ((col & 0x00ffff) == 0x00ff00 && (col & 0xff0000) > 0) { - add(new Sign(x * 10, y * 10, (col >> 16) & 0xff)); - } else if (col == 0x0000ff) { - // if (xSpawn == 0 && ySpawn == 0) { - this.xSpawn = x * 10 + 1; - this.ySpawn = y * 10 - 8; - // } - } else if (col == 0x00FFFF) { - Gunner e = new Gunner(x * 10 + 2, y * 10 + 10 - 6, 0, 0); - e.chargeTime = random.nextInt(Gunner.CHARGE_DURATION / 2); - e.xa = e.ya = 0; + if (col == 0xffffff) + wall = 1; + else if (col == 0xFF00FF) + wall = 2; + else if (col == 0xffff00) + wall = 3; + else if (col == 0xff0000) + wall = 4; + else if (col == 0xB7B7B7) + wall = 5; + else if (col == 0xFF5050) + wall = 6; + else if (col == 0xFF5051) + wall = 7; + else if (col == 0x383838) + wall = 8; + else if (col == 0xA3FFFF) + wall = 9; + else if (col == 0x83FFFF) { + BossPart prev = new Boss(x * 10 - 2, y * 10 - 2); + int timeOffs = random.nextInt(60); + ((Boss)prev).time = timeOffs; + add(prev); + for (int i = 0; i < 10; i++) { + BossNeck b = new BossNeck(x * 10 - 1, y * 10 - 1, prev); + b.time = i * 10 + timeOffs; + prev = b; + add(prev); + } + } else if (col == 0x80FFFF) { + Gremlin g = new Gremlin(0, x * 10 - 10, y * 10 - 20); + g.jumpDelay = random.nextInt(50); + add(g); + } else if (col == 0x81FFFF) { + Gremlin g = new Gremlin(1, x * 10 - 10, y * 10 - 20); + g.jumpDelay = random.nextInt(50); + add(g); + } else if (col == 0x82FFFF) { + Jabberwocky g = new Jabberwocky(x * 10 - 10, y * 10 - 10); + g.slamTime = random.nextInt(30); + add(g); + } else if (col == 0xFFADF8) { + add(new Hat(x * 10 + 1, y * 10 + 5, xo * 31 + x, yo * 23 + y)); + } else if ((col & 0x00ffff) == 0x00ff00 && (col & 0xff0000) > 0) { + add(new Sign(x * 10, y * 10, (col >> 16) & 0xff)); + } else if (col == 0x0000ff) { + // if (xSpawn == 0 && ySpawn == 0) { + this.xSpawn = x * 10 + 1; + this.ySpawn = y * 10 - 8; + // } + } else if (col == 0x00FFFF) { + Gunner e = new Gunner(x * 10 + 2, y * 10 + 10 - 6, 0, 0); + e.chargeTime = random.nextInt(Gunner.CHARGE_DURATION / 2); + e.xa = e.ya = 0; - add(e); - } - walls[x + y * w] = wall; - } - } + add(e); + } + walls[x + y * w] = wall; + } + } + player = new Player(this.xSpawn, this.ySpawn); + add(player); + } - player = new Player(this.xSpawn, this.ySpawn); - add(player); - } + public void add (Entity e) { + entities.add(e); + e.init(this); - public void add(Entity e) { - entities.add(e); - e.init(this); + e.xSlot = (int)((e.x + e.w / 2.0) / 10); + e.ySlot = (int)((e.y + e.h / 2.0) / 10); + if (e.xSlot >= 0 && e.ySlot >= 0 && e.xSlot < width && e.ySlot < height) { + entityMap[e.xSlot + e.ySlot * width].add(e); + } + } - e.xSlot = (int) ((e.x + e.w / 2.0) / 10); - e.ySlot = (int) ((e.y + e.h / 2.0) / 10); - if (e.xSlot >= 0 && e.ySlot >= 0 && e.xSlot < width && e.ySlot < height) { - entityMap[e.xSlot + e.ySlot * width].add(e); - } - } + public void tick () { + tick++; + if (player.removed) { + respawnTime++; + if (respawnTime == 20) { + screen.mayRespawn = true; + } + } + for (int i = 0; i < entities.size(); i++) { + Entity e = entities.get(i); + int xSlotOld = e.xSlot; + int ySlotOld = e.ySlot; + if (!e.removed) e.tick(); + e.xSlot = (int)((e.x + e.w / 2.0) / 10); + e.ySlot = (int)((e.y + e.h / 2.0) / 10); + if (e.removed) { + if (xSlotOld >= 0 && ySlotOld >= 0 && xSlotOld < width && ySlotOld < height) { + entityMap[xSlotOld + ySlotOld * width].remove(e); + } + entities.remove(i--); + } else { + if (e.xSlot != xSlotOld || e.ySlot != ySlotOld) { + if (xSlotOld >= 0 && ySlotOld >= 0 && xSlotOld < width && ySlotOld < height) { + entityMap[xSlotOld + ySlotOld * width].remove(e); + } + if (e.xSlot >= 0 && e.ySlot >= 0 && e.xSlot < width && e.ySlot < height) { + entityMap[e.xSlot + e.ySlot * width].add(e); + } else { + e.outOfBounds(); + } - public void tick() { - tick++; - if (player.removed) { - respawnTime++; - if (respawnTime == 20) { - screen.mayRespawn = true; - } - } - for (int i = 0; i < entities.size(); i++) { - Entity e = entities.get(i); - int xSlotOld = e.xSlot; - int ySlotOld = e.ySlot; - if (!e.removed) e.tick(); - e.xSlot = (int) ((e.x + e.w / 2.0) / 10); - e.ySlot = (int) ((e.y + e.h / 2.0) / 10); - if (e.removed) { - if (xSlotOld >= 0 && ySlotOld >= 0 && xSlotOld < width && ySlotOld < height) { - entityMap[xSlotOld + ySlotOld * width].remove(e); - } - entities.remove(i--); - } else { - if (e.xSlot != xSlotOld || e.ySlot != ySlotOld) { - if (xSlotOld >= 0 && ySlotOld >= 0 && xSlotOld < width && ySlotOld < height) { - entityMap[xSlotOld + ySlotOld * width].remove(e); - } - if (e.xSlot >= 0 && e.ySlot >= 0 && e.xSlot < width && e.ySlot < height) { - entityMap[e.xSlot + e.ySlot * width].add(e); - } else { - e.outOfBounds(); - } + } + } + } + } - } - } - } - } + private List hits = new ArrayList(); - private List hits = new ArrayList(); + public List getEntities (double xc, double yc, double w, double h) { + hits.clear(); + int r = 20; + int x0 = (int)((xc - r) / 10); + int y0 = (int)((yc - r) / 10); + int x1 = (int)((xc + w + r) / 10); + int y1 = (int)((yc + h + r) / 10); + for (int x = x0; x <= x1; x++) + for (int y = y0; y <= y1; y++) { + if (x >= 0 && y >= 0 && x < width && y < height) { + List es = entityMap[x + y * width]; + for (int i = 0; i < es.size(); i++) { + Entity e = es.get(i); + double xx0 = e.x; + double yy0 = e.y; + double xx1 = e.x + e.w; + double yy1 = e.y + e.h; + if (xx0 > xc + w || yy0 > yc + h || xx1 < xc || yy1 < yc) continue; - public List getEntities(double xc, double yc, double w, double h) { - hits.clear(); - int r = 20; - int x0 = (int) ((xc - r) / 10); - int y0 = (int) ((yc - r) / 10); - int x1 = (int) ((xc + w + r) / 10); - int y1 = (int) ((yc + h + r) / 10); - for (int x = x0; x <= x1; x++) - for (int y = y0; y <= y1; y++) { - if (x >= 0 && y >= 0 && x < width && y < height) { - List es = entityMap[x + y * width]; - for (int i = 0; i < es.size(); i++) { - Entity e = es.get(i); - double xx0 = e.x; - double yy0 = e.y; - double xx1 = e.x + e.w; - double yy1 = e.y + e.h; - if (xx0 > xc + w || yy0 > yc + h || xx1 < xc || yy1 < yc) continue; + hits.add(e); + } + } + } + return hits; + } - hits.add(e); - } - } - } - return hits; - } + Matrix4 matrix = new Matrix4(); - public void render(Graphics g, Camera camera) { - g.translate(-camera.x, -camera.y); + public void render (Screen screen, Camera camera) { + matrix.idt(); + matrix.setToTranslation(camera.x, camera.y, 0); + screen.spriteBatch.setTransformMatrix(matrix); + screen.spriteBatch.begin(); + //g.translate(-camera.x, -camera.y); - int xo = camera.x / 10; - int yo = camera.y / 10; - for (int x = xo; x <= xo + camera.width / 10; x++) { - for (int y = yo; y <= yo + camera.height / 10; y++) { - if (x >= 0 && y >= 0 && x < width && y < height) { - int ximg = 0; - int yimg = 0; - byte w = walls[x + y * width]; - if (w == 0) yimg = 1; - if (w == 1) ximg = 0; - if (w == 2) ximg = 2; - if (w == 3) ximg = 1; - if (w == 9) ximg = 7; - if (w == 8) { - ximg = 4; - yimg = 1; - } - if (w == 5) { - ximg = 1; - yimg = 1; - } - if (w == 6) { - ximg = (tick / 4 + x * 2) & 3; - yimg = 2; - } - if (w == 7) { - ximg = (-tick / 4 + x * 2) & 3; - yimg = 3; - } - if (w == 4) { - if (walls[x + (y - 1) * width] == 1) { - yimg++; - } - ximg = 3; - } + int xo = 0; + int yo = 0; + for (int x = xo; x <= xo + camera.width / 10; x++) { + for (int y = yo; y <= yo + camera.height / 10; y++) { + if (x >= 0 && y >= 0 && x < width && y < height) { + int ximg = 0; + int yimg = 0; + byte w = walls[x + y * width]; + if (w == 0) yimg = 1; + if (w == 1) ximg = 0; + if (w == 2) ximg = 2; + if (w == 3) ximg = 1; + if (w == 9) ximg = 7; + if (w == 8) { + ximg = 4; + yimg = 1; + } + if (w == 5) { + ximg = 1; + yimg = 1; + } + if (w == 6) { + ximg = (tick / 4 + x * 2) & 3; + yimg = 2; + } + if (w == 7) { + ximg = (-tick / 4 + x * 2) & 3; + yimg = 3; + } + if (w == 4) { + if (walls[x + (y - 1) * width] == 1) { + yimg++; + } + ximg = 3; + } - g.drawImage(Art.walls[ximg][yimg], x * 10, y * 10, null); - } - } - } - for (int i = entities.size() - 1; i >= 0; i--) { - Entity e = entities.get(i); - e.render(g, camera); - } - } + if(w == 0) + continue; + + screen.draw(Art.walls[ximg][yimg], x * 10, y * 10); + } + } + } + for (int i = entities.size() - 1; i >= 0; i--) { + Entity e = entities.get(i); + e.render(screen, camera); + } + + screen.spriteBatch.end(); + } - public boolean isFree(Entity ee, double xc, double yc, int w, int h, double xa, double ya) { - if (ee.interactsWithWorld) { - return isBulletFree(ee, xc, yc, w, h); - } - double e = 0.1; - int x0 = (int) (xc / 10); - int y0 = (int) (yc / 10); - int x1 = (int) ((xc + w - e) / 10); - int y1 = (int) ((yc + h - e) / 10); - boolean ok = true; - for (int x = x0; x <= x1; x++) - for (int y = y0; y <= y1; y++) { - if (x >= 0 && y >= 0 && x < width && y < height) { - byte ww = walls[x + y * width]; - if (ww != 0) ok = false; - if (ww == 8) ok = true; - if (ww == 4 && ya != 0) ee.hitSpikes(); - if (ww == 6) { - ee.xa += 0.12; - } - if (ww == 7) { - ee.xa -= 0.12; - } - } - } + public boolean isFree (Entity ee, double xc, double yc, int w, int h, double xa, double ya) { + if (ee.interactsWithWorld) { + return isBulletFree(ee, xc, yc, w, h); + } + double e = 0.1; + int x0 = (int)(xc / 10); + int y0 = (int)(yc / 10); + int x1 = (int)((xc + w - e) / 10); + int y1 = (int)((yc + h - e) / 10); + boolean ok = true; + for (int x = x0; x <= x1; x++) + for (int y = y0; y <= y1; y++) { + if (x >= 0 && y >= 0 && x < width && y < height) { + byte ww = walls[x + y * width]; + if (ww != 0) ok = false; + if (ww == 8) ok = true; + if (ww == 4 && ya != 0) ee.hitSpikes(); + if (ww == 6) { + ee.xa += 0.12; + } + if (ww == 7) { + ee.xa -= 0.12; + } + } + } - return ok; - } + return ok; + } - public boolean isBulletFree(Entity bullet, double xc, double yc, int w, int h) { - double e = 0.1; - int x0 = (int) (xc / 10); - int y0 = (int) (yc / 10); - int x1 = (int) ((xc + w - e) / 10); - int y1 = (int) ((yc + h - e) / 10); - boolean ok = true; - for (int x = x0; x <= x1; x++) - for (int y = y0; y <= y1; y++) { - if (x >= 0 && y >= 0 && x < width && y < height) { - byte ww = walls[x + y * width]; - if (ww != 0) ok = false; - if (ww == 5) ok = true; - if (ww == 2) { - int xPush = 0; - int yPush = 0; + public boolean isBulletFree (Entity bullet, double xc, double yc, int w, int h) { + double e = 0.1; + int x0 = (int)(xc / 10); + int y0 = (int)(yc / 10); + int x1 = (int)((xc + w - e) / 10); + int y1 = (int)((yc + h - e) / 10); + boolean ok = true; + for (int x = x0; x <= x1; x++) + for (int y = y0; y <= y1; y++) { + if (x >= 0 && y >= 0 && x < width && y < height) { + byte ww = walls[x + y * width]; + if (ww != 0) ok = false; + if (ww == 5) ok = true; + if (ww == 2) { + int xPush = 0; + int yPush = 0; - if (Math.abs(bullet.xa) > Math.abs(bullet.ya)) { - if (bullet.xa < 0) xPush = -1; - if (bullet.xa > 0) xPush = 1; - } else { - if (bullet.ya < 0) yPush = -1; - if (bullet.ya > 0) yPush = 1; - } - double r = 0.5; - if (walls[(x + xPush) + (y + yPush) * width] == 0 && getEntities((x + xPush) * 10 + r, (y + yPush) * 10 + r, 10 - r * 2, 10 - r * 2).size() == 0) { - walls[x + y * width] = 0; - walls[(x + xPush) + (y + yPush) * width] = 2; - } - bullet.remove(); - } - if (ww == 3) { - Sound.boom.play(); - for (int i = 0; i < 16; i++) { - double dir = i * Math.PI * 2 / 8.0; - double xa = Math.sin(dir); - double ya = Math.cos(dir); - double dist = (i / 8) + 1; - add(new Explosion(1, i * 3, x * 10 + 5 + xa * dist, y * 10 + 5 + ya * dist, xa, ya)); - } - bullet.remove(); - walls[x + y * width] = 0; - } - if (ww == 9) { - if ((bullet instanceof Explosion) && ((Explosion)bullet).power > 0) { - Sound.boom.play(); - for (int i = 0; i < 16; i++) { - double dir = i * Math.PI * 2 / 8.0; - double xa = Math.sin(dir); - double ya = Math.cos(dir); - double dist = (i / 8) + 1; - add(new Explosion(1, i * 3, x * 10 + 5 + xa * dist, y * 10 + 5 + ya * dist, xa, ya)); - } - bullet.remove(); - walls[x + y * width] = 0; - } - } - } - } + if (Math.abs(bullet.xa) > Math.abs(bullet.ya)) { + if (bullet.xa < 0) xPush = -1; + if (bullet.xa > 0) xPush = 1; + } else { + if (bullet.ya < 0) yPush = -1; + if (bullet.ya > 0) yPush = 1; + } + double r = 0.5; + if (walls[(x + xPush) + (y + yPush) * width] == 0 + && getEntities((x + xPush) * 10 + r, (y + yPush) * 10 + r, 10 - r * 2, 10 - r * 2).size() == 0) { + walls[x + y * width] = 0; + walls[(x + xPush) + (y + yPush) * width] = 2; + } + bullet.remove(); + } + if (ww == 3) { + Sound.boom.play(); + for (int i = 0; i < 16; i++) { + double dir = i * Math.PI * 2 / 8.0; + double xa = Math.sin(dir); + double ya = Math.cos(dir); + double dist = (i / 8) + 1; + add(new Explosion(1, i * 3, x * 10 + 5 + xa * dist, y * 10 + 5 + ya * dist, xa, ya)); + } + bullet.remove(); + walls[x + y * width] = 0; + } + if (ww == 9) { + if ((bullet instanceof Explosion) && ((Explosion)bullet).power > 0) { + Sound.boom.play(); + for (int i = 0; i < 16; i++) { + double dir = i * Math.PI * 2 / 8.0; + double xa = Math.sin(dir); + double ya = Math.cos(dir); + double dist = (i / 8) + 1; + add(new Explosion(1, i * 3, x * 10 + 5 + xa * dist, y * 10 + 5 + ya * dist, xa, ya)); + } + bullet.remove(); + walls[x + y * width] = 0; + } + } + } + } - return ok; - } + return ok; + } - public void readSign(Sign sign) { - screen.readSign(sign.id - 1); - } + public void readSign (Sign sign) { + screen.readSign(sign.id - 1); + } - public void transition(int x, int y) { - screen.transition(x, y); - } + public void transition (int x, int y) { + screen.transition(x, y); + } - public void getGun(int level) { - screen.getGun(level); - } + public void getGun (int level) { + screen.getGun(level); + } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/ExpositionScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/ExpositionScreen.java index a4b110bdb..63ede5529 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/ExpositionScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/ExpositionScreen.java @@ -1,10 +1,13 @@ package com.mojang.metagun.screen; -import java.awt.Graphics; -import java.io.*; -import java.util.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; -import com.mojang.metagun.*; +import com.badlogic.gdx.Gdx; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; public class ExpositionScreen extends Screen { private int time = 0; @@ -15,7 +18,7 @@ public class ExpositionScreen extends Screen { public ExpositionScreen() { try { - BufferedReader br = new BufferedReader(new InputStreamReader(ExpositionScreen.class.getResourceAsStream("exposition.txt"))); + BufferedReader br = new BufferedReader(new InputStreamReader(Gdx.files.internal("res/exposition.txt").read())); String line = ""; while ((line = br.readLine()) != null) { @@ -28,18 +31,20 @@ public class ExpositionScreen extends Screen { } - public void render(Graphics g) { - int w = Art.bg.getHeight(); - g.drawImage(Art.bg, 0, -(time / 8 % w), null); - g.drawImage(Art.bg, 0, -(time / 8 % w) + w, null); + public void render() { + int w = -Art.bg.getRegionHeight(); + spriteBatch.begin(); + draw(Art.bg, 0, -(time / 8 % w)); + draw(Art.bg, 0, -(time / 8 % w) + w); int yo = time / 4; for (int y = 0; y <= 240 / 6; y++) { int yl = yo / 6 - 240 / 6+y; if (yl >= 0 && yl < lines.size()) { - drawString(lines.get(yl), g, (320 - 40 * 6)/2, y * 6 - yo % 6); + drawString(lines.get(yl), (320 - 40 * 6)/2, y * 6 - yo % 6); } } + spriteBatch.end(); } public void tick(Input input) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/GameScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/GameScreen.java index 3af9374b6..a135c8ec9 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/GameScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/GameScreen.java @@ -1,95 +1,104 @@ -package com.mojang.metagun.screen; -import java.awt.Graphics; +package com.mojang.metagun.screen; -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; +import com.mojang.metagun.Metagun; +import com.mojang.metagun.Stats; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; public class GameScreen extends Screen { - public static final int MAX_HATS = 7; - - private static final boolean DEBUG_MODE = false; - private int xLevel = DEBUG_MODE?8:0; - private int yLevel = DEBUG_MODE?4:0; + public static final int MAX_HATS = 7; + + private static final boolean DEBUG_MODE = false; + private int xLevel = DEBUG_MODE ? 8 : 0; + private int yLevel = DEBUG_MODE ? 4 : 0; - Level level = new Level(this, 32, 24, xLevel, yLevel, 0, 0); - private Camera camera = new Camera(Metagun.GAME_WIDTH, Metagun.GAME_HEIGHT); + Level level = new Level(this, 32, 24, xLevel, yLevel, 0, 0); + private Camera camera = new Camera(Metagun.GAME_WIDTH, Metagun.GAME_HEIGHT); - public boolean mayRespawn = false; - private int gunLevel = DEBUG_MODE?2:0; - private int hatCount = 1; + public boolean mayRespawn = false; + private int gunLevel = DEBUG_MODE ? 2 : 0; + private int hatCount = 1; - public GameScreen() { - Art.level = Art.load("/levels.png"); - Stats.reset(); + public GameScreen () { + Stats.reset(); - level.player.gunLevel = gunLevel; - level.player.hatCount = hatCount; - } + level.player.gunLevel = gunLevel; + level.player.hatCount = hatCount; + } - public void tick(Input input) { - Stats.instance.time++; - if (!input.oldButtons[Input.ESCAPE] && input.buttons[Input.ESCAPE]) { - setScreen(new PauseScreen(this)); - return; - } - if (!level.player.removed) level.player.tick(input); - else if (mayRespawn) { - if (input.buttons[Input.SHOOT] && !input.oldButtons[Input.SHOOT]) { - respawnRoom(); - mayRespawn = false; - } - } - level.tick(); - Stats.instance.hats = level.player.hatCount; - } + public void tick (Input input) { + Stats.instance.time++; + if (!input.oldButtons[Input.ESCAPE] && input.buttons[Input.ESCAPE]) { + setScreen(new PauseScreen(this)); + return; + } + if (!level.player.removed) + level.player.tick(input); + else if (mayRespawn) { + if (input.buttons[Input.SHOOT] && !input.oldButtons[Input.SHOOT]) { + respawnRoom(); + mayRespawn = false; + } + } + level.tick(); + Stats.instance.hats = level.player.hatCount; + } - public void transition(int xa, int ya) { - Stats.instance.hats = level.player.hatCount; - xLevel += xa; - yLevel += ya; - if (yLevel>10) { - setScreen(new WinScreen()); - return; - } - level.player.x -= xa * 300; - level.player.y -= ya * 220; - hatCount = level.player.hatCount; - if (ya != 0) level.player.y -= 10; - Level newLevel = new Level(this, 32, 24, xLevel, yLevel, (int) (level.player.x), (int) (level.player.y + ya * 5)); - newLevel.player.remove(); - newLevel.player = level.player; - newLevel.add(newLevel.player); - setScreen(new LevelTransitionScreen(this, xLevel-xa, yLevel-ya, level, newLevel, xa, ya)); - this.level = newLevel; - level.player.gunLevel = gunLevel; - level.player.hatCount = hatCount; - level.player.damage = 0; - } + public void transition (int xa, int ya) { + Stats.instance.hats = level.player.hatCount; + xLevel += xa; + yLevel += ya; + if (yLevel > 10) { + setScreen(new WinScreen()); + return; + } + level.player.x -= xa * 300; + level.player.y -= ya * 220; + hatCount = level.player.hatCount; + if (ya != 0) level.player.y -= 10; + Level newLevel = new Level(this, 32, 24, xLevel, yLevel, (int)(level.player.x), (int)(level.player.y + ya * 5)); + newLevel.player.remove(); + newLevel.player = level.player; + newLevel.add(newLevel.player); + setScreen(new LevelTransitionScreen(this, xLevel - xa, yLevel - ya, level, newLevel, xa, ya)); + this.level = newLevel; + level.player.gunLevel = gunLevel; + level.player.hatCount = hatCount; + level.player.damage = 0; + } - public void render(Graphics g) { - g.drawImage(Art.bg, -xLevel*160, -yLevel*120, null); - level.render(g, camera); - if (mayRespawn) { - String msg = "PRESS X TO TRY AGAIN"; - drawString(msg, g, 160 - msg.length() * 3, 120 - 3); - } - } + public void render () { + spriteBatch.begin(); +// draw(Art.bg, -xLevel * 160, -yLevel * 120); + draw(Art.bg, 0, 0); + spriteBatch.end(); + level.render(this, camera); + + spriteBatch.begin(); + if (mayRespawn) { + String msg = "PRESS X TO TRY AGAIN"; + drawString(msg, 160 - msg.length() * 3, 120 - 3); + } + spriteBatch.end(); + } - public void readSign(int id) { - setScreen(new SignReadScreen(this, id)); - } + public void readSign (int id) { + setScreen(new SignReadScreen(this, id)); + } - public void respawnRoom() { - Level newLevel = new Level(this, 32, 24, xLevel, yLevel, level.xSpawn, level.ySpawn); - this.level = newLevel; - level.player.gunLevel = gunLevel; - if (hatCount<1) hatCount = 1; - level.player.hatCount = hatCount; - level.player.damage = 0; - } + public void respawnRoom () { + Level newLevel = new Level(this, 32, 24, xLevel, yLevel, level.xSpawn, level.ySpawn); + this.level = newLevel; + level.player.gunLevel = gunLevel; + if (hatCount < 1) hatCount = 1; + level.player.hatCount = hatCount; + level.player.damage = 0; + } - public void getGun(int level) { - gunLevel = level; - } + public void getGun (int level) { + gunLevel = level; + } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/LevelTransitionScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/LevelTransitionScreen.java index 9c84dfe2f..c63a5f320 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/LevelTransitionScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/LevelTransitionScreen.java @@ -1,45 +1,53 @@ -package com.mojang.metagun.screen; -import java.awt.Graphics; +package com.mojang.metagun.screen; -import com.mojang.metagun.*; -import com.mojang.metagun.level.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; +import com.mojang.metagun.level.Camera; +import com.mojang.metagun.level.Level; public class LevelTransitionScreen extends Screen { - private static final int TRANSITION_DURATION = 20; - private Level level1; - private Level level2; - private int time = 0; - private Screen parent; - private int xa, ya; - private int xLevel, yLevel; - - public LevelTransitionScreen(Screen parent, int xLevel, int yLevel, Level level1, Level level2, int xa, int ya) { - this.level1 = level1; - this.level2 = level2; - this.xLevel = xLevel; - this.yLevel = yLevel; - this.parent = parent; - this.xa = xa; - this.ya = ya; - } + private static final int TRANSITION_DURATION = 20; + private Level level1; + private Level level2; + private int time = 0; + private Screen parent; + private int xa, ya; + private int xLevel, yLevel; - public void tick(Input input) { - time++; - if (time == TRANSITION_DURATION) { - setScreen(parent); - } - } + public LevelTransitionScreen (Screen parent, int xLevel, int yLevel, Level level1, Level level2, int xa, int ya) { + this.level1 = level1; + this.level2 = level2; + this.xLevel = xLevel; + this.yLevel = yLevel; + this.parent = parent; + this.xa = xa; + this.ya = ya; + } - public void render(Graphics g) { - Camera c = new Camera(320, 240); - double pow = time / (double) TRANSITION_DURATION; - - g.drawImage(Art.bg, -xLevel*160-(int)(xa*160*pow), -yLevel*120-(int)(ya*120*pow), null); - - g.translate((int) (-xa * 310 * pow), (int) (-ya * 230 * pow)); - level1.render(g, c); - g.translate(xa * 310, ya * 230); - level2.render(g, c); - } + public void tick (Input input) { + time++; + if (time == TRANSITION_DURATION) { + setScreen(parent); + } + } + + Camera c = new Camera(320, 240); + public void render () { + double pow = time / (double)TRANSITION_DURATION; + + spriteBatch.getTransformMatrix().idt(); + spriteBatch.begin(); +// draw(Art.bg, -xLevel * 160 - (int)(xa * 160 * pow), -yLevel * 120 - (int)(ya * 120 * pow)); + draw(Art.bg, 0, 0); + spriteBatch.end(); + + c.x = (int)(-xa * 320 * pow); + c.y = (int)(-ya * 240 * pow); + level1.render(this, c); + + c.x = (int)(xa * 320 * (1-pow)); + c.y = (int)(ya * 240 * (1-pow)); + level2.render(this, c); + } } diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/PauseScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/PauseScreen.java index bd220c054..9aa9ccfa7 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/PauseScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/PauseScreen.java @@ -1,8 +1,7 @@ package com.mojang.metagun.screen; -import java.awt.Graphics; - -import com.mojang.metagun.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; public class PauseScreen extends Screen { private GameScreen parent; @@ -14,8 +13,10 @@ public class PauseScreen extends Screen { this.parent = parent; } - public void render(Graphics g) { - parent.render(g); + public void render() { + parent.render(); + + spriteBatch.begin(); int xs = 0; int ys = options.length; for (int y = 0; y < options.length; y++) { @@ -33,15 +34,16 @@ public class PauseScreen extends Screen { if (y < 0) yf--; if (x >= xs) xf++; if (y >= ys) yf++; - g.drawImage(Art.guys[xf][yf], xp + x * 6, yp + y * 6, null); + draw(Art.guys[xf][yf], xp + x * 6, yp + y * 6); } } for (int y = 0; y < options.length; y++) { if (y == selected) { - drawString("+", g, xp, yp + y * 6); + drawString("+", xp, yp + y * 6); } - drawString(options[y], g, xp + 6, yp + y * 6); + drawString(options[y], xp + 6, yp + y * 6); } + spriteBatch.end(); } public void tick(Input input) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/Screen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/Screen.java index 71032e28e..a99fde9d7 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/Screen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/Screen.java @@ -1,49 +1,60 @@ + package com.mojang.metagun.screen; -import java.awt.Graphics; import java.util.Random; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.mojang.metagun.*; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Matrix4; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; +import com.mojang.metagun.Metagun; public abstract class Screen { - protected static Random random = new Random(); - private Metagun metagun; - protected SpriteBatch spriteBatch = new SpriteBatch(100); - - public void removed() { - spriteBatch.dispose(); - } - - public final void init(Metagun metagun) { - this.metagun = metagun; - } - - protected void setScreen(Screen screen) { - metagun.setScreen(screen); - } - - String[] chars = { - "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", - ".,!?:;\"'+-=/\\< " - }; - - public void drawString(String string, Graphics g, int x, int y) { - // FIXME -// string = string.toUpperCase(); -// for (int i=0; i=0) { -// g.drawImage(Art.guys[xs][ys+9], x+i*6, y, null); -// } -// } -// } - } - - public abstract void render(); - - public void tick(Input input) { - } -} \ No newline at end of file + protected static Random random = new Random(); + private Metagun metagun; + public SpriteBatch spriteBatch; + + public void removed () { + spriteBatch.dispose(); + } + + public final void init (Metagun metagun) { + this.metagun = metagun; + Matrix4 projection = new Matrix4(); + projection.setToOrtho(0, 320, 240, 0, -1, 1); + + spriteBatch = new SpriteBatch(100); + spriteBatch.setProjectionMatrix(projection); + } + + protected void setScreen (Screen screen) { + metagun.setScreen(screen); + } + + String[] chars = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", ".,!?:;\"'+-=/\\< "}; + + public void draw (TextureRegion region, int x, int y) { + int width = region.getRegionWidth(); + if(width <0) width = -width; + spriteBatch.draw(region, x, y, width, -region.getRegionHeight()); + } + + public void drawString (String string, int x, int y) { + string = string.toUpperCase(); + for (int i = 0; i < string.length(); i++) { + char ch = string.charAt(i); + for (int ys = 0; ys < chars.length; ys++) { + int xs = chars[ys].indexOf(ch); + if (xs >= 0) { + draw(Art.guys[xs][ys + 9], x + i * 6, y); + } + } + } + } + + public abstract void render (); + + public void tick (Input input) { + } +} diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/SignReadScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/SignReadScreen.java index 675deaf80..bdfef9d2a 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/SignReadScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/SignReadScreen.java @@ -1,8 +1,7 @@ package com.mojang.metagun.screen; -import java.awt.Graphics; - -import com.mojang.metagun.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; public class SignReadScreen extends Screen { private Screen parent; @@ -164,6 +163,7 @@ public class SignReadScreen extends Screen { public void render() { parent.render(); + spriteBatch.begin(); int xs = 0; int ys = signs[id].length+3; for (int y=0; y=xs) xf++; if (y>=ys) yf++; - // FIXME - // g.drawImage(Art.guys[xf][yf], xp+x*6, yp+y*6, null); + draw(Art.guys[xf][yf], xp+x*6, yp+y*6); } } for (int y=0; y 240) { String msg = "PRESS X TO START"; - drawString(msg, g, 160 - msg.length() * 3, 140 - 3 - (int) (Math.abs(Math.sin(time * 0.1) * 10))); + drawString(msg, 160 - msg.length() * 3, 140 - 3 - (int) (Math.abs(Math.sin(time * 0.1) * 10))); } if (time >=0) { String msg = "COPYRIGHT MOJANG 2010"; - drawString(msg, g, 2, 240-6-2); + drawString(msg, 2, 240-6-2); } + spriteBatch.end(); } public void tick(Input input) { diff --git a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/WinScreen.java b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/WinScreen.java index 37d81b48d..9bb3579d1 100644 --- a/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/WinScreen.java +++ b/demos/metagun/metagun-desktop/src/com/mojang/metagun/screen/WinScreen.java @@ -1,16 +1,17 @@ package com.mojang.metagun.screen; -import java.awt.*; - -import com.mojang.metagun.*; +import com.mojang.metagun.Art; +import com.mojang.metagun.Input; +import com.mojang.metagun.Stats; public class WinScreen extends Screen { private int time = 0; - public void render(Graphics g) { - int w = Art.bg.getHeight(); - g.drawImage(Art.bg, 0, -(time*2%w), null); - g.drawImage(Art.bg, 0, -(time*2%w)+w, null); + public void render() { + spriteBatch.begin(); + int w = 240 * 8; //Art.bg.getHeight(); + draw(Art.bg, 0, -(time*2%w)); + draw(Art.bg, 0, -(time*2%w)+w); int offs0 = 500-time*10; if (offs0<0) offs0=0; @@ -19,29 +20,30 @@ public class WinScreen extends Screen { int yOffs = 600-time*5; if (yOffs<-120) yOffs = -120; if (yOffs>0) yOffs = 0; - g.drawImage(Art.winScreen1, offs0, yOffs+30, null); - g.drawImage(Art.winScreen2, -offs1, yOffs*2/3+30, null); + draw(Art.winScreen1, offs0, yOffs+30); + draw(Art.winScreen2, -offs1, yOffs*2/3+30); int tt = time-(60*2+30); int yo = 130; int xo = 120-8*3; if (tt>=0) { - drawString(" TIME: "+Stats.instance.getTimeString(), g, xo, yo+0*6); - drawString(" DEATHS: "+Stats.instance.deaths, g, xo, yo+1*6); - drawString(" FEDORAS: "+Stats.instance.hats+"/"+7, g, xo, yo+2*6); - drawString("SHOTS FIRED: "+Stats.instance.shots, g, xo, yo+3*6); - drawString("FINAL SCORE: "+timeScale(Stats.instance.getFinalScore(), tt-30*5), g, xo, yo+5*6); + drawString(" TIME: "+Stats.instance.getTimeString(), xo, yo+0*6); + drawString(" DEATHS: "+Stats.instance.deaths, xo, yo+1*6); + drawString(" FEDORAS: "+Stats.instance.hats+"/"+7, xo, yo+2*6); + drawString("SHOTS FIRED: "+Stats.instance.shots, xo, yo+3*6); + drawString("FINAL SCORE: "+timeScale(Stats.instance.getFinalScore(), tt-30*5), xo, yo+5*6); - drawString(timeHideScale(Stats.instance.getSpeedScore(), tt-30*1), g, xo+20*6, yo+0*6); - drawString(timeHideScale(Stats.instance.getDeathScore(), tt-30*2), g, xo+20*6, yo+1*6); - drawString(timeHideScale(Stats.instance.getHatScore(), tt-30*3), g, xo+20*6, yo+2*6); - drawString(timeHideScale(Stats.instance.getShotScore(), tt-30*4), g, xo+20*6, yo+3*6); + drawString(timeHideScale(Stats.instance.getSpeedScore(), tt-30*1), xo+20*6, yo+0*6); + drawString(timeHideScale(Stats.instance.getDeathScore(), tt-30*2), xo+20*6, yo+1*6); + drawString(timeHideScale(Stats.instance.getHatScore(), tt-30*3), xo+20*6, yo+2*6); + drawString(timeHideScale(Stats.instance.getShotScore(), tt-30*4), xo+20*6, yo+3*6); } if (time>60*7 && (time/30%2==0)) { String msg = "PRESS X TO RESET THE GAME"; - drawString(msg, g, 160-msg.length()*3, yo+10*6); + drawString(msg, 160-msg.length()*3, yo+10*6); } + spriteBatch.end(); } private String timeHideScale(int val, int time) { -- 2.11.0