Render fonts ourselves with a font spritesheet.
Ensures font looks original to classic pac-man
This commit is contained in:
parent
e4e0d0c1b0
commit
5c227e53d1
BIN
android/assets/sprites/font.png
Normal file
BIN
android/assets/sprites/font.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 862 B |
BIN
android/assets/sprites/font.xcf
Normal file
BIN
android/assets/sprites/font.xcf
Normal file
Binary file not shown.
@ -19,6 +19,7 @@ public class Assets {
|
||||
private Texture levelWinBackground;
|
||||
private Texture menuBackground;
|
||||
|
||||
public TextureRegion[][] font;
|
||||
public TextureRegion[][] level;
|
||||
public TextureRegion[][] deathAnimation;
|
||||
public TextureRegion[][] ghosts;
|
||||
@ -35,8 +36,6 @@ public class Assets {
|
||||
public Sound return_base;
|
||||
public Sound siren, siren_fast, siren_faster, siren_fastest;
|
||||
|
||||
private BitmapFont font;
|
||||
|
||||
public Assets() {
|
||||
this.manager = new AssetManager();
|
||||
}
|
||||
@ -47,6 +46,7 @@ public class Assets {
|
||||
manager.load("menu_background.png", Texture.class);
|
||||
manager.load("logo.png", Texture.class);
|
||||
|
||||
manager.load("sprites/font.png", Texture.class);
|
||||
manager.load("sprites/level.png", Texture.class);
|
||||
manager.load("sprites/death.png", Texture.class);
|
||||
manager.load("sprites/ghosts.png", Texture.class);
|
||||
@ -69,25 +69,15 @@ public class Assets {
|
||||
manager.load("sounds/siren_faster.wav", Sound.class);
|
||||
manager.load("sounds/siren_fastest.wav", Sound.class);
|
||||
|
||||
// Yayyy! all of this to load a font
|
||||
FileHandleResolver resolver = new InternalFileHandleResolver();
|
||||
manager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
|
||||
manager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));
|
||||
FreetypeFontLoader.FreeTypeFontLoaderParameter font = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
|
||||
font.fontFileName = "fonts/joystix.ttf";
|
||||
font.fontParameters.size = 10;
|
||||
font.fontParameters.mono = true;
|
||||
manager.load("fonts/joystix.ttf", BitmapFont.class, font);
|
||||
|
||||
// finish loading assets from disk
|
||||
manager.finishLoading();
|
||||
|
||||
this.font = manager.get("fonts/joystix.ttf", BitmapFont.class);
|
||||
levelBackground = manager.get("level_background.png", Texture.class);
|
||||
levelWinBackground = manager.get("level_background_win.png", Texture.class);
|
||||
menuBackground = manager.get("menu_background.png", Texture.class);
|
||||
|
||||
// cache our texture regions
|
||||
font = TextureRegion.split(manager.get("sprites/font.png", Texture.class), 8, 8);
|
||||
level = TextureRegion.split(manager.get("sprites/level.png", Texture.class), 8, 8);
|
||||
deathAnimation = TextureRegion.split(manager.get("sprites/death.png", Texture.class), 16, 16);
|
||||
ghosts = TextureRegion.split(manager.get("sprites/ghosts.png", Texture.class), 16, 16);
|
||||
@ -128,10 +118,6 @@ public class Assets {
|
||||
return manager.get("logo.png", Texture.class);
|
||||
}
|
||||
|
||||
public BitmapFont getFont() {
|
||||
return font;
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
manager.dispose();
|
||||
}
|
||||
|
48
core/src/com/me/pacman/FontRenderer.java
Normal file
48
core/src/com/me/pacman/FontRenderer.java
Normal file
@ -0,0 +1,48 @@
|
||||
package com.me.pacman;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
|
||||
public class FontRenderer {
|
||||
|
||||
|
||||
private static final char[] CHARS = "abcdefghijklmnopqrstuvwxyz0123456789!?()[]<>$&*:#^~-_/\\".toCharArray();
|
||||
private static final int[] CHAR_TO_INDEX = new int[256];
|
||||
private Color color = Color.WHITE;
|
||||
|
||||
private TextureRegion[][] sprites;
|
||||
|
||||
public FontRenderer(TextureRegion[][] sprites) {
|
||||
this.sprites = sprites;
|
||||
}
|
||||
|
||||
public void setColor(Color color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public void draw(SpriteBatch batch, String str, int x, int y) {
|
||||
float oldColor = batch.getPackedColor();
|
||||
batch.setColor(color);
|
||||
|
||||
for (char c : str.toCharArray()) {
|
||||
if (Character.isWhitespace(c)) {
|
||||
x += 8;
|
||||
continue;
|
||||
}
|
||||
int i = CHAR_TO_INDEX[c];
|
||||
TextureRegion region = sprites[i / 8][i % 8];
|
||||
batch.draw(region, x, y);
|
||||
x += 8;
|
||||
}
|
||||
|
||||
batch.setPackedColor(oldColor);
|
||||
}
|
||||
|
||||
static {
|
||||
for (int i = 0; i < CHARS.length; i++) {
|
||||
CHAR_TO_INDEX[CHARS[i]] = i;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -23,6 +23,7 @@ public class PacDude extends Game {
|
||||
public Sound sound;
|
||||
|
||||
public SpriteBatch batch;
|
||||
public FontRenderer fontRenderer;
|
||||
|
||||
public OrthographicCamera cam;
|
||||
public Viewport viewport;
|
||||
@ -38,6 +39,7 @@ public class PacDude extends Game {
|
||||
sound = new Sound(this);
|
||||
|
||||
batch = new SpriteBatch();
|
||||
fontRenderer = new FontRenderer(assets.font);
|
||||
|
||||
Gdx.gl.glClearColor(0, 0, 0, 1);
|
||||
setScreen(new MenuState(this));
|
||||
@ -49,7 +51,7 @@ public class PacDude extends Game {
|
||||
|
||||
batch.begin();
|
||||
if (DEBUG) {
|
||||
assets.getFont().draw(batch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 152, 287);
|
||||
fontRenderer.draw(batch, "fps:" + Gdx.graphics.getFramesPerSecond(), 19 * 8, 34 * 8);
|
||||
}
|
||||
super.render();
|
||||
batch.end();
|
||||
|
@ -1,12 +1,10 @@
|
||||
package com.me.pacman.state;
|
||||
|
||||
import com.badlogic.gdx.Application;
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.Input;
|
||||
import com.badlogic.gdx.InputAdapter;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.me.pacman.PacDude;
|
||||
import com.me.pacman.Sound;
|
||||
@ -15,7 +13,6 @@ public class MenuState extends LevelState {
|
||||
|
||||
private Texture levelBackground;
|
||||
private Texture logo;
|
||||
private BitmapFont font;
|
||||
|
||||
|
||||
public static final int NEW_GAME = 0;
|
||||
@ -24,17 +21,7 @@ public class MenuState extends LevelState {
|
||||
private BoundingBox NEW_GAME_BOX = new BoundingBox(88, 66, 136, 84);
|
||||
private BoundingBox HIGH_SCORE_BOX = new BoundingBox(88, 42, 136, 60);
|
||||
|
||||
|
||||
private static final int MENU_PADDING = 24;
|
||||
private static final int MENU_X = 84;
|
||||
private static final int MENU_Y = 85;
|
||||
|
||||
private int selectedOption;
|
||||
private static final String[] options = {
|
||||
"New Game",
|
||||
"High Scores",
|
||||
};
|
||||
|
||||
|
||||
public MenuState(PacDude game) {
|
||||
super(game);
|
||||
@ -45,7 +32,6 @@ public class MenuState extends LevelState {
|
||||
levelBackground = game.assets.getMenuBackground();
|
||||
logo = game.assets.getLogo();
|
||||
logo.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
|
||||
font = game.assets.getFont();
|
||||
|
||||
Gdx.input.setInputProcessor(this.new Controller());
|
||||
game.sound.play(Sound.Effect.BEGINNING);
|
||||
@ -65,11 +51,14 @@ public class MenuState extends LevelState {
|
||||
game.batch.draw(levelBackground, 0, 16);
|
||||
game.batch.draw(logo, 0, 140, 224, 120);
|
||||
|
||||
for (int i = 0; i < options.length; i++) {
|
||||
font.setColor(i == selectedOption? Color.BLUE : Color.WHITE);
|
||||
|
||||
font.draw(game.batch, options[i], MENU_X, MENU_Y - (i * MENU_PADDING), 56, 1, true);
|
||||
}
|
||||
game.fontRenderer.setColor(selectedOption == 0 ? Color.BLUE : Color.WHITE);
|
||||
game.fontRenderer.draw(game.batch, "new", (12 * 8) + 4, (9 * 8) + 4);
|
||||
game.fontRenderer.draw(game.batch, "game", 12 * 8, (8 * 8) + 4);
|
||||
|
||||
game.fontRenderer.setColor(selectedOption == 1 ? Color.BLUE : Color.WHITE);
|
||||
game.fontRenderer.draw(game.batch, "high", (12 * 8), (6 * 8) + 4);
|
||||
game.fontRenderer.draw(game.batch, "scores", (11 * 8), (5 * 8) + 4);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -81,11 +70,11 @@ public class MenuState extends LevelState {
|
||||
public boolean keyDown(int keycode) {
|
||||
switch (keycode) {
|
||||
case Input.Keys.UP:
|
||||
selectedOption = selectedOption > 0 ? --selectedOption : options.length - 1;
|
||||
selectedOption = selectedOption > 0 ? --selectedOption : 1;
|
||||
game.sound.play(Sound.Effect.CHOMP_1);
|
||||
break;
|
||||
case Input.Keys.DOWN:
|
||||
selectedOption = selectedOption < options.length - 1 ? ++selectedOption : 0;
|
||||
selectedOption = selectedOption < 1 ? ++selectedOption : 0;
|
||||
game.sound.play(Sound.Effect.CHOMP_2);
|
||||
break;
|
||||
case Input.Keys.ENTER:
|
||||
|
@ -39,7 +39,6 @@ public class PlayState extends LevelState {
|
||||
|
||||
private Texture levelBackground, winBackground;
|
||||
private TextureRegion lifeSprite;
|
||||
private BitmapFont font;
|
||||
|
||||
public Random random;
|
||||
|
||||
@ -219,7 +218,6 @@ public class PlayState extends LevelState {
|
||||
public void setup() {
|
||||
levelBackground = game.assets.getLevelBackground();
|
||||
winBackground = game.assets.getLevelWinBackground();
|
||||
font = game.assets.getFont();
|
||||
lifeSprite = game.assets.pacman[2][1];
|
||||
Gdx.input.setInputProcessor(new Controller());
|
||||
|
||||
@ -258,12 +256,16 @@ public class PlayState extends LevelState {
|
||||
|
||||
@Override
|
||||
public void render() {
|
||||
game.assets.getFont().setColor(Color.WHITE);
|
||||
game.assets.getFont().draw(game.batch, "" + score, 40, 279);
|
||||
// Draw score
|
||||
game.fontRenderer.setColor(Color.WHITE);
|
||||
game.fontRenderer.draw(game.batch, "" + score, 5 * 8, 34 * 8);
|
||||
|
||||
// Draw remaining lives
|
||||
for (int i = 0; i < lives; i++) {
|
||||
game.batch.draw(lifeSprite, i * 16, 0);
|
||||
}
|
||||
|
||||
// Draw the level tiles
|
||||
level.render(LEVEL_OFFSET_X, LEVEL_OFFSET_Y);
|
||||
|
||||
if (state == GameState.ROUND_WON) {
|
||||
@ -295,19 +297,19 @@ public class PlayState extends LevelState {
|
||||
}
|
||||
|
||||
if (paused) {
|
||||
game.assets.getFont().setColor(Color.YELLOW);
|
||||
game.assets.getFont().draw(game.batch, "paused", 90, 127);
|
||||
game.fontRenderer.setColor(Color.YELLOW);
|
||||
game.fontRenderer.draw(game.batch, "paused", 11 * 8, 15 * 8);
|
||||
} else {
|
||||
switch (state) {
|
||||
case PRE_NEW_GAME:
|
||||
case NEW_ROUND_WAIT:
|
||||
case START_ROUND_WAIT:
|
||||
game.assets.getFont().setColor(Color.YELLOW);
|
||||
game.assets.getFont().draw(game.batch, "ready!", 92, 127);
|
||||
game.fontRenderer.setColor(Color.YELLOW);
|
||||
game.fontRenderer.draw(game.batch, "ready!", 11 * 8, 15 * 8);
|
||||
break;
|
||||
case GAME_OVER:
|
||||
game.assets.getFont().setColor(Color.RED);
|
||||
game.assets.getFont().draw(game.batch, "game over", 78, 127);
|
||||
game.fontRenderer.setColor(Color.RED);
|
||||
game.fontRenderer.draw(game.batch, "game over", (9 * 8) + 4, 15 * 8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user