better console command parsing (now you can use quots), font support for Latin Extension A, now you can draw Runics also

Former-commit-id: 76aef3e704f171e23d6f0a6f78b051717e0f3212
Former-commit-id: 03373859fb5d858afbf4e92528dceb2dc118c763
This commit is contained in:
Song Minjae
2016-02-07 14:17:51 +09:00
parent b25a6f5e98
commit 954076d944
57 changed files with 280 additions and 703 deletions

View File

@@ -1,8 +1,5 @@
package com.Torvald.ImageFont;
import com.Torvald.Terrarum.MapDrawer.LightmapRenderer;
import com.Torvald.Terrarum.Terrarum;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.*;
import java.util.Arrays;
@@ -16,28 +13,34 @@ public class GameFontBase implements Font {
static SpriteSheet asciiSheet;
static SpriteSheet asciiSheetEF;
static SpriteSheet runicSheet;
static SpriteSheet extASheet;
static SpriteSheet extASheetEF;
static final int JUNG_COUNT = 21;
static final int JONG_COUNT = 28;
static final int W_CJK = 10;
static final int W_CJK_DRAW = 11;
static final int W_EM = 9; // width of regular letters, including m
static final int W_EF = 5; // width of letter f, t, i, l
static final int W_LATIN_WIDE = 9; // width of regular letters, including m
static final int W_LATIN_NARROW = 5; // width of letter f, t, i, l
static final int H = 20;
static final int H_CJK = 16;
static final int SHEET_EM = 0;
static final int SHEET_EF = 1;
static final int SHEET_HANGUL = 3;
static final int SHEET_CJKPUNCT = 4;
static final int SHEET_KANA = 5;
static final int SHEET_RUNIC = 6;
static final int SHEET_ASCII_EM = 0;
static final int SHEET_ASCII_EF = 1;
static final int SHEET_HANGUL = 2;
static final int SHEET_RUNIC = 3;
static final int SHEET_EXTA_EM = 4;
static final int SHEET_EXTA_EF = 5;
static SpriteSheet[] sheetKey;
static final Character[] EFlist = {
' ','!','"','\'',',','.','(',')',':',';','I','[',']','`','f','i'
,'j','l','t','{','|','}'
static final Character[] asciiEFList = {
' ','!','"','\'','(',')','I','[',']','`','f','i','j','l','t','{'
,'|','}',0xA1,'Ì',','Î','Ï','ì','í','î','ï','
};
static final Character[] extAEFList = {
0x12E, 0x12F, 0x130, 0x131, 0x135, 0x13A, 0x13C, 0x142, 0x163, 0x167, 0x17F
};
/**
@@ -65,8 +68,12 @@ public class GameFontBase implements Font {
return ret;
}
private boolean isEF(char c) {
return (Arrays.asList(EFlist).contains(c));
private boolean isAsciiEF(char c) {
return (Arrays.asList(asciiEFList).contains(c));
}
private boolean isExtAEF(char c) {
return (Arrays.asList(extAEFList).contains(c));
}
private boolean isHangul(char c) {
@@ -79,12 +86,24 @@ public class GameFontBase implements Font {
return (Arrays.asList(runicList).contains(c));
}
private int EFindexX(char c) {
return (Arrays.asList(EFlist).indexOf(c) % 16);
private boolean isExtA(char c) {
return (c >= 0x100 && c < 0x180);
}
private int EFindexY(char c) {
return (Arrays.asList(EFlist).indexOf(c) / 16);
private int asciiEFindexX(char c) {
return (Arrays.asList(asciiEFList).indexOf(c) % 16);
}
private int asciiEFindexY(char c) {
return (Arrays.asList(asciiEFList).indexOf(c) / 16);
}
private int extAEFindexX(char c) {
return (Arrays.asList(extAEFList).indexOf(c) % 16);
}
private int extAEFindexY(char c) {
return (Arrays.asList(extAEFList).indexOf(c) / 16);
}
private int runicIndexX(char c) {
@@ -101,12 +120,12 @@ public class GameFontBase implements Font {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (getSheetType(c)) {
case SHEET_EF:
len += W_EF; break;
case SHEET_ASCII_EF:
len += W_LATIN_NARROW; break;
case SHEET_HANGUL:
len += W_CJK_DRAW; break;
default:
len += W_EM;
len += W_LATIN_WIDE;
}
}
return len;
@@ -153,7 +172,7 @@ public class GameFontBase implements Font {
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (isAscii(ch)) {
if (!isHangul(ch)) {
// if not init, enduse first
if (prevInstance != -1) {
@@ -165,11 +184,22 @@ public class GameFontBase implements Font {
int sheetX;
int sheetY;
switch (prevInstance) {
case SHEET_EF:
sheetX = EFindexX(ch);
sheetY = EFindexY(ch);
case SHEET_ASCII_EF:
sheetX = asciiEFindexX(ch);
sheetY = asciiEFindexY(ch);
break;
case SHEET_EXTA_EF:
sheetX = extAEFindexX(ch);
sheetY = extAEFindexY(ch);
break;
case SHEET_RUNIC:
sheetX = runicIndexX(ch);
sheetY = runicIndexY(ch);
break;
case SHEET_EXTA_EM:
sheetX = (ch - 0x100) % 16;
sheetY = (ch - 0x100) / 16;
break;
case SHEET_EM:
default:
sheetX = ch % 16;
sheetY = ch / 16;
@@ -194,18 +224,12 @@ public class GameFontBase implements Font {
}
private int getSheetType(char c) {
if (isEF(c)) {
return SHEET_EF;
}
else if (isHangul(c)) {
return SHEET_HANGUL;
}
else if (isRunic(c)) {
return SHEET_RUNIC;
}
else {
return SHEET_EM;
}
if (isAsciiEF(c)) return SHEET_ASCII_EF;
else if (isHangul(c)) return SHEET_HANGUL;
else if (isRunic(c)) return SHEET_RUNIC;
else if (isExtA(c)) return SHEET_EXTA_EM;
else if (isExtAEF(c)) return SHEET_EXTA_EF;
else return SHEET_ASCII_EM;
}
@Override

View File

@@ -13,24 +13,36 @@ public class GameFontBlack extends GameFontBase {
hangulSheet = new SpriteSheet(
"./res/graphics/fonts/han_atlas_black.png"
, W_CJK
, H_CJK
, W_CJK, H_CJK
);
asciiSheet = new SpriteSheet(
"./res/graphics/fonts/ascii_majuscule_black.png"
, W_EM
, H
, W_LATIN_WIDE, H
);
asciiSheetEF = new SpriteSheet(
"./res/graphics/fonts/ascii_special_ef_black.png"
, W_EF
, H
, W_LATIN_NARROW, H
);
runicSheet = new SpriteSheet(
"./res/graphics/fonts/futhark_black.png"
, W_LATIN_WIDE, H
);
extASheet = new SpriteSheet(
"./res/graphics/fonts/LatinExtA_majuscule_black.png"
, W_LATIN_WIDE, H
);
extASheetEF = new SpriteSheet(
"./res/graphics/fonts/LatinExtA_ef_black.png"
, W_LATIN_NARROW, H
);
SpriteSheet[] shk = {
asciiSheet
, asciiSheetEF
, hangulSheet
, runicSheet
, extASheet
, extASheetEF
};
sheetKey = shk;
}

View File

@@ -1,12 +1,7 @@
package com.Torvald.ImageFont;
import com.Torvald.Terrarum.MapDrawer.LightmapRenderer;
import com.Torvald.Terrarum.Terrarum;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.*;
import java.util.Arrays;
/**
* Created by minjaesong on 16-01-20.
*/
@@ -17,24 +12,36 @@ public class GameFontWhite extends GameFontBase {
hangulSheet = new SpriteSheet(
"./res/graphics/fonts/han_atlas.png"
, W_CJK
, H_CJK
, W_CJK, H_CJK
);
asciiSheet = new SpriteSheet(
"./res/graphics/fonts/ascii_majuscule.png"
, W_EM
, H
, W_LATIN_WIDE, H
);
asciiSheetEF = new SpriteSheet(
"./res/graphics/fonts/ascii_special_ef.png"
, W_EF
, H
, W_LATIN_NARROW, H
);
runicSheet = new SpriteSheet(
"./res/graphics/fonts/futhark.png"
, W_LATIN_WIDE, H
);
extASheet = new SpriteSheet(
"./res/graphics/fonts/LatinExtA_majuscule.png"
, W_LATIN_WIDE, H
);
extASheetEF = new SpriteSheet(
"./res/graphics/fonts/LatinExtA_ef.png"
, W_LATIN_NARROW, H
);
SpriteSheet[] shk = {
asciiSheet
, asciiSheetEF
, hangulSheet
, runicSheet
, extASheet
, extASheetEF
};
sheetKey = shk;
}

View File

@@ -1,41 +1,13 @@
package com.Torvald.Terrarum.Actors;
import com.Torvald.Terrarum.KVHashtable;
import java.util.Hashtable;
import java.util.Set;
/**
* Created by minjaesong on 16-01-03.
*/
public class ActorValue {
private Hashtable<String, Object> configTable;
public ActorValue() {
configTable = new Hashtable<>();
}
/**
* Add key-value pair to the configuration table.
*
* @param key case insensitive
* @param value
*/
public void set(String key, Object value){
configTable.put(key.toLowerCase(), value);
}
/**
* Get value using key from configuration table.
*
* @param key case insensitive
* @return Object value
*/
public Object get(String key){
return configTable.get(key.toLowerCase());
}
public Set getKeySet() {
return configTable.keySet();
}
public class ActorValue extends KVHashtable {
}

View File

@@ -1,7 +1,6 @@
package com.Torvald.Terrarum.Actors;
import com.Torvald.Rand.HighQualityRandom;
import com.Torvald.Terrarum.Game;
import com.Torvald.Terrarum.MapDrawer.MapDrawer;
import com.Torvald.Terrarum.Terrarum;
import com.Torvald.spriteAnimation.SpriteAnimation;
@@ -65,8 +64,8 @@ public class ActorWithBody implements Actor, Visible, Glowing {
* meter to pixel : 24/FPS
*/
private final float METER = 24f;
private final float SI_TO_GAME_ACC = METER / (Terrarum.game.TARGET_FPS * Terrarum.game.TARGET_FPS);
private final float SI_TO_GAME_VEL = METER / Terrarum.game.TARGET_FPS;
private final float SI_TO_GAME_ACC = METER / (Terrarum.TARGET_FPS * Terrarum.TARGET_FPS);
private final float SI_TO_GAME_VEL = METER / Terrarum.TARGET_FPS;
private float gravitation;
private final float DRAG_COEFF = 1f;

View File

@@ -50,6 +50,8 @@ public class PBFSigrid {
p.actorValue.set("strength", 1250);
p.actorValue.set("encumbrance", 1000);
p.actorValue.set("name", "Sigrid");
p.setHitboxDimension(20, 47, 7, 0);
p.inventory = new ActorInventory((int) p.actorValue.get("encumbrance"), true);

View File

@@ -68,16 +68,16 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
}
private void updatePhysicalInfos() {
super.setScale((float) actorValue.get("scale"));
super.setMass((float) actorValue.get("basemass")
super.setScale(actorValue.getAsFloat("scale"));
super.setMass(actorValue.getAsFloat("basemass")
* FastMath.pow(super.getScale(), 3));
}
private void walkHorizontal(boolean left) {
readonly_totalX = super.getVeloX()
+
(float) actorValue.get("accel")
* (float) actorValue.get("accelmult")
actorValue.getAsFloat("accel")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
* applyAccelRealism(walkPowerCounter)
* (left ? -1 : 1);
@@ -91,8 +91,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
// Clamp veloX
super.setVeloX(
absClamp(super.getVeloX()
, (float) actorValue.get("speed")
* (float) actorValue.get("speedmult")
, actorValue.getAsFloat("speed")
* actorValue.getAsFloat("speedmult")
* FastMath.sqrt(super.getScale())
));
@@ -133,8 +133,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
private void walkVertical(boolean up) {
super.setVeloY(super.getVeloY()
+
(float) actorValue.get("accel")
* (float) actorValue.get("accelmult")
actorValue.getAsFloat("accel")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
* applyAccelRealism(walkPowerCounter)
* (up ? -1 : 1)
@@ -147,8 +147,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
// Clamp veloX
super.setVeloY(
absClamp(super.getVeloY()
, (float) actorValue.get("speed")
* (float) actorValue.get("speedmult")
, actorValue.getAsFloat("speed")
* actorValue.getAsFloat("speedmult")
* FastMath.sqrt(super.getScale())
)
);
@@ -158,8 +158,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
if (super.getVeloX() > 0) {
super.setVeloX(super.getVeloX()
-
(float) actorValue.get("accel")
* (float) actorValue.get("accelmult")
actorValue.getAsFloat("accel")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
);
@@ -170,8 +170,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
else if (super.getVeloX() < 0) {
super.setVeloX(super.getVeloX()
+
(float) actorValue.get("accel")
* (float) actorValue.get("accelmult")
actorValue.getAsFloat("accel")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
);
@@ -191,7 +191,7 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
super.setVeloY(super.getVeloY()
-
WALK_STOP_ACCEL
* (float) actorValue.get("accelmult")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
);
@@ -203,7 +203,7 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
super.setVeloY(super.getVeloY()
+
WALK_STOP_ACCEL
* (float) actorValue.get("accelmult")
* actorValue.getAsFloat("accelmult")
* FastMath.sqrt(super.getScale())
);
@@ -342,8 +342,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed {
}
private void jump() {
float len = (float) actorValue.get("jumplength");
float pwr = (float) actorValue.get("jumppower");
float len = actorValue.getAsFloat("jumplength");
float pwr = actorValue.getAsFloat("jumppower");
//if (jumping) {
// // Limit increment of jumpPowerCounter

View File

@@ -1,8 +1,11 @@
package com.Torvald.Terrarum.ConsoleCommand;
import com.Torvald.Terrarum.Game;
import com.Torvald.Terrarum.LangPack.Lang;
import com.Torvald.Terrarum.UserInterface.ConsoleWindow;
import java.util.Formatter;
/**
* Created by minjaesong on 16-01-16.
*/
@@ -18,7 +21,14 @@ public class CodexEdictis implements ConsoleCommand {
commandObj.printUsage();
}
catch (NullPointerException e) {
new Echo().execute("Codex: Unknown command: " + args[1]);
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
new Echo().execute("Codex: "
+ formatter.format(Lang.get("DEV_MESSAGE_CONSOLE_COMMAND_UNKNOWN")
, args[1]
).toString()
);
}
}
}
@@ -33,13 +43,8 @@ public class CodexEdictis implements ConsoleCommand {
private void printList() {
Echo echo = new Echo();
echo.execute("Available commands");
echo.execute("--------------------------------");
CommandDict.dict.keySet().forEach((s) -> echo.execute(s));
echo.execute("--------------------------------");
echo.execute(Lang.get("DEV_MESSAGE_CONSOLE_AVAILABLE_COMMANDS"));
CommandDict.dict.keySet().forEach((s) -> echo.execute("] " + s));
}
}

View File

@@ -1,7 +1,11 @@
package com.Torvald.Terrarum.ConsoleCommand;
import com.Torvald.Terrarum.Game;
import com.Torvald.Terrarum.UserInterface.ConsoleWindow;
import com.Torvald.Terrarum.LangPack.Lang;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by minjaesong on 16-01-15.
@@ -17,41 +21,70 @@ public class CommandInterpreter {
commandObj.execute(single_command.toStringArray());
}
catch (NullPointerException e) {
new Echo().execute("Unknown command: " + single_command.getName());
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
new Echo().execute(
formatter.format(Lang.get("DEV_MESSAGE_CONSOLE_COMMAND_UNKNOWN")
, single_command.getName()
).toString()
);
}
}
}
private static CommandInput[] parse(String input) {
String[] commands = input.split(";[ ]?"); // split multiple commands (e.g. respawn player; setav player speed 5)
Pattern patternCommands = Pattern.compile("[^;]+");
Pattern patternTokensInCommand = Pattern.compile("[\"'][^;]+[\"']|[^ ]+");
ArrayList<String> commands = new ArrayList<>();
// split multiple commands
Matcher m = patternCommands.matcher(input);
while (m.find()) commands.add(m.group());
// split command tokens from a command
CommandInput[] parsedCommands = new CommandInput[commands.size()];
for (int i = 0; i < parsedCommands.length; i++) {
ArrayList<String> tokens = new ArrayList<>();
m = patternTokensInCommand.matcher(commands.get(i));
while (m.find()) {
String regexGroup = m.group().replaceAll("[\"\']", "");
tokens.add(regexGroup);
}
// create new command
parsedCommands[i] = new CommandInput(tokens.toArray());
CommandInput[] ret = new CommandInput[commands.length];
for (int i = 0; i < commands.length; i++) {
ret[i] = new CommandInput(commands[i].split(" "));
}
return ret;
return parsedCommands;
}
}
class CommandInput {
private String[] args;
private int argsCount = 0;
private String[] tokens;
CommandInput(String[] s) {
args = s;
CommandInput(Object[] o) {
tokens = new String[o.length];
for (int i = 0; i < o.length; i++) {
tokens[i] = (String) o[i];
}
}
String[] toStringArray() {
return args;
return tokens;
}
String getName() {
return args[0];
return tokens[0];
}
int getArgsCount() {
return argsCount;
return tokens.length;
}
}

View File

@@ -25,13 +25,11 @@ class SetAV implements ConsoleCommand {
printUsage();
}
else if (args.length == 3) {
float val;
try {
val = new Float(args[2]);
}
Object val;
try { val = new Float(args[2]); } // try for number
catch (NumberFormatException e) {
new Echo().execute("Wrong number input.");
return;
val = new String(args[2]); // string if not number
}
Terrarum.game.getPlayer().getActorValue().set(args[1], val);

View File

@@ -1,7 +1,5 @@
package com.Torvald.Terrarum;
import com.Torvald.ImageFont.GameFontWhite;
import com.Torvald.Rand.HighQualityRandom;
import com.Torvald.Terrarum.Actors.*;
import com.Torvald.Terrarum.ConsoleCommand.CommandDict;
import com.Torvald.Terrarum.GameControl.GameController;
@@ -32,13 +30,6 @@ import java.util.LinkedList;
*/
public class Game extends BasicGameState {
public static final int TARGET_FPS = 50;
/**
* To be used with render, to achieve smooth frame drawing
*
* TARGET_INTERNAL_FPS > TARGET_FPS for smooth frame drawing
*/
public static final int TARGET_INTERNAL_FPS = 100;
public static long memInUse;
public static long totalVMMem;
int game_mode = 0;
@@ -76,7 +67,7 @@ public class Game extends BasicGameState {
gameConfig = new GameConfig();
gameConfig.addKey("smoothlighting", true);
gameConfig.set("smoothlighting", true);
shader12BitCol = Shader.makeShader("./res/4096.vrt", "./res/4096.frg");
shaderBlurH = Shader.makeShader("./res/blurH.vrt", "./res/blur.frg");
@@ -177,7 +168,7 @@ public class Game extends BasicGameState {
Terrarum.appgc.setTitle(
"Simple Slick Game — FPS: "
+ Terrarum.appgc.getFPS() + " ("
+ String.valueOf(TARGET_INTERNAL_FPS)
+ String.valueOf(Terrarum.TARGET_INTERNAL_FPS)
+ ") — "
+ String.valueOf(memInUse) + "M / "
+ String.valueOf(totalVMMem) + "M"

View File

@@ -5,31 +5,6 @@ import java.util.Hashtable;
/**
* Created by minjaesong on 15-12-30.
*/
public class GameConfig {
public class GameConfig extends KVHashtable{
private Hashtable<String, Object> configTable;
public GameConfig() {
this.configTable = new Hashtable<String, Object>();
}
/**
* Add key-value pair to the configuration table.
*
* @param key
* @param value
*/
public void addKey(String key, Object value){
configTable.put(key, value);
}
/**
* Get value using key from configuration table.
*
* @param key
* @return Object value
*/
public Object get(String key){
return configTable.get(key);
}
}

View File

@@ -0,0 +1,55 @@
package com.Torvald.Terrarum;
import java.util.Hashtable;
import java.util.Set;
/**
* Created by minjaesong on 15-12-30.
*/
public class KVHashtable {
private Hashtable<String, Object> hashtable;
public KVHashtable() {
hashtable = new Hashtable<>();
}
/**
* Add key-value pair to the configuration table.
* If key does not exist on the table, new key will be generated.
* If key already exists, the value will be overwritten.
*
* @param key case insensitive
* @param value
*/
public void set(String key, Object value){
hashtable.put(key.toLowerCase(), value);
}
/**
* Get value using key from configuration table.
*
* @param key case insensitive
* @return Object value
*/
public Object get(String key){
return hashtable.get(key.toLowerCase());
}
public float getAsFloat(String key) {
return (float) get(key);
}
public String getAsString(String key) {
return (String) get(key);
}
public boolean getAsBoolean(String key) {
return (boolean) get(key);
}
public Set getKeySet() {
return hashtable.keySet();
}
}

View File

@@ -12,15 +12,24 @@ import java.util.Properties;
public class Lang {
private static Properties lang;
private static Properties langFallback;
private static final String FALLBACK_LANG_CODE = "en";
public Lang() throws IOException {
lang = new Properties();
lang.load(new BufferedReader(new InputStreamReader(new FileInputStream(
"res/locales/" + Terrarum.gameLocale + ".lang"), StandardCharsets.UTF_8)));
langFallback = new Properties();
langFallback.load(new BufferedReader(new InputStreamReader(new FileInputStream(
"res/locales/" + FALLBACK_LANG_CODE + ".lang"), StandardCharsets.UTF_8)));
}
public static String get(String key) {
return lang.getProperty(key, key);
return lang.getProperty(key
,langFallback.getProperty(key
, key)
);
}
}

View File

@@ -2,13 +2,10 @@ package com.Torvald.Terrarum;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.Torvald.ImageFont.GameFontWhite;
import com.Torvald.Terrarum.GameControl.GameController;
import com.Torvald.Terrarum.GameControl.KeyMap;
import com.Torvald.Terrarum.LangPack.Lang;
import org.newdawn.slick.*;
import org.newdawn.slick.state.StateBasedGame;
@@ -18,6 +15,20 @@ import org.newdawn.slick.state.StateBasedGame;
*/
public class Terrarum extends StateBasedGame {
/**
* To be used with physics simulator
*/
public static final int TARGET_FPS = 50;
/**
* To be used with render, to achieve smooth frame drawing
*
* TARGET_INTERNAL_FPS > TARGET_FPS for smooth frame drawing
*
* Must choose a value so that 1000 / VAL is still integer
*/
public static final int TARGET_INTERNAL_FPS = 100;
public static AppGameContainer appgc;
public static final int WIDTH = 960;
public static final int HEIGHT = 720;
@@ -64,11 +75,11 @@ public class Terrarum extends StateBasedGame {
{
appgc = new AppGameContainer(new Terrarum("Terrarum"));
appgc.setDisplayMode(WIDTH, HEIGHT, false);
appgc.setTargetFrameRate(Game.TARGET_INTERNAL_FPS);
appgc.setTargetFrameRate(TARGET_INTERNAL_FPS);
appgc.setVSync(true);
appgc.setShowFPS(false);
appgc.setUpdateOnlyWhenVisible(false);
appgc.setMaximumLogicUpdateInterval(1000 / Game.TARGET_INTERNAL_FPS);
appgc.setMaximumLogicUpdateInterval(1000 / TARGET_INTERNAL_FPS);
appgc.start();
}
catch (SlickException ex)