diff --git a/src/sig/RabiClone.java b/src/sig/RabiClone.java index d953147..733f59a 100644 --- a/src/sig/RabiClone.java +++ b/src/sig/RabiClone.java @@ -14,7 +14,6 @@ import sig.engine.Point; import sig.map.Maps; import sig.objects.ConfigureControls; import sig.objects.EditorRenderer; -import sig.objects.Erinoah; import sig.objects.LevelRenderer; import sig.objects.Player; import sig.engine.Key; @@ -25,18 +24,19 @@ import sig.engine.PaletteColor; import java.awt.Toolkit; import java.awt.event.KeyEvent; -public class RabiClone{ - public static final String PROGRAM_NAME="RabiClone"; +public class RabiClone { + public static final String PROGRAM_NAME = "RabiClone"; + public static final String BLANK = "\0"; - public static int UPCOUNT=0; + public static int UPCOUNT = 0; public static Panel p; public static JFrame f; public static List<Object> OBJ = new ArrayList<Object>(); - public static int BASE_WIDTH=512; - public static int BASE_HEIGHT=288; - public static int SIZE_MULTIPLIER=1; + public static int BASE_WIDTH = 512; + public static int BASE_HEIGHT = 288; + public static int SIZE_MULTIPLIER = 1; public static Point MOUSE_POS; public static PaletteColor BACKGROUND_COLOR = PaletteColor.DARK_ORCHID; @@ -46,35 +46,35 @@ public class RabiClone{ public static Player player; public static Maps CURRENT_MAP = Maps.WORLD1; - public static Controller[] CONTROLLERS = new Controller[]{}; + public static Controller[] CONTROLLERS = new Controller[] {}; public static long lastControllerScan = System.currentTimeMillis(); - static long lastUpdate=System.nanoTime(); + static long lastUpdate = System.nanoTime(); final static long TARGET_FRAMETIME = 8333333l; - static long lastReportedTime=System.currentTimeMillis(); + static long lastReportedTime = System.currentTimeMillis(); + public static long TIME = 0; public static void main(String[] args) { Key.InitializeKeyConversionMap(); - - f = new JFrame(PROGRAM_NAME); f.setResizable(false); f.setUndecorated(true); - f.setSize(BASE_WIDTH,BASE_HEIGHT); //1024x576 (64x64) + f.setSize(BASE_WIDTH, BASE_HEIGHT); // 1024x576 (64x64) ChooseBestRatio(); p = new Panel(f); - MOUSE_POS=p.mousePos; - + MOUSE_POS = p.mousePos; + p.init(); - + f.add(p); f.addKeyListener(p); - f.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()-f.getWidth())/2), (int)((Toolkit.getDefaultToolkit().getScreenSize().getHeight()-f.getHeight())/2)); + f.setLocation((int) ((Toolkit.getDefaultToolkit().getScreenSize().getWidth() - f.getWidth()) / 2), + (int) ((Toolkit.getDefaultToolkit().getScreenSize().getHeight() - f.getHeight()) / 2)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); @@ -87,13 +87,13 @@ public class RabiClone{ long dt = 0; CONTROLLERS = ControllerEnvironment.getDefaultEnvironment().getControllers(); + while (true) { - dt += System.nanoTime()-lastGameTime; - lastGameTime=System.nanoTime(); + dt += System.nanoTime() - lastGameTime; + lastGameTime = System.nanoTime(); - - while (dt>=(1/244d)*1000000000l) { - final double updateMult = 1/244d; + while (dt >= (1 / 244d) * 1000000000l) { + final double updateMult = 1 / 244d; handleGameControllers(); KeyBind.poll(); @@ -101,7 +101,7 @@ public class RabiClone{ if (Key.isKeyHeld(KeyEvent.VK_F1)) { if (level_renderer instanceof EditorRenderer) { OBJ.remove(level_renderer); - OBJ.add(level_renderer=new LevelRenderer(p)); + OBJ.add(level_renderer = new LevelRenderer(p)); StartGame(); } } @@ -109,73 +109,78 @@ public class RabiClone{ if (!(level_renderer instanceof EditorRenderer)) { OBJ.clear(); ResetGame(); - OBJ.add(level_renderer=new EditorRenderer(p)); + OBJ.add(level_renderer = new EditorRenderer(p)); } } if (Key.isKeyHeld(KeyEvent.VK_F3)) { OBJ.clear(); ResetGame(); - OBJ.add(control_settings_menu=new ConfigureControls(p)); + OBJ.add(control_settings_menu = new ConfigureControls(p)); } - if (Key.isKeyHeld(KeyEvent.VK_F5)&&System.currentTimeMillis()-lastControllerScan>5000) { - CONTROLLERS=ControllerEnvironment.getDefaultEnvironment().rescanControllers(); + if (Key.isKeyHeld(KeyEvent.VK_F5) && System.currentTimeMillis() - lastControllerScan > 5000) { + CONTROLLERS = ControllerEnvironment.getDefaultEnvironment().rescanControllers(); System.out.println(Arrays.toString(CONTROLLERS)); - lastControllerScan=System.currentTimeMillis(); + lastControllerScan = System.currentTimeMillis(); } - for (int i=0;i<OBJ.size();i++) { + for (int i = 0; i < OBJ.size(); i++) { OBJ.get(i).update(updateMult); if (OBJ.get(i).isMarkedForDeletion()) { OBJ.remove(i--); } } - dt-=(1/244d)*1000000000l; + dt -= (1 / 244d) * 1000000000l; + TIME += (1 / 244d) * 1000000000l; + // System.out.println(TIME); } - if (dt<(1/244d)*1000000000l) { - lastReportedTime=System.currentTimeMillis(); - } else - if (System.currentTimeMillis()-lastReportedTime>5000) { - System.out.println("WARNING! Game is lagging behind! Frames Behind: "+(dt/((1/244d)*1000000000l))); - lastReportedTime=System.currentTimeMillis(); + if (dt < (1 / 244d) * 1000000000l) { + lastReportedTime = System.currentTimeMillis(); + } else { + if (System.currentTimeMillis() - lastReportedTime > 5000) { + System.out.println( + "WARNING! Game is lagging behind! Frames Behind: " + (dt / ((1 / 244d) * 1000000000l))); + lastReportedTime = System.currentTimeMillis(); + } } + System.out.print(BLANK); //This is hackish. Removing this slows down the game by about 30%. The timer runs slower. ??? } } - private static void handleGameControllers() { - for (int i=0;i<CONTROLLERS.length;i++) { - if (CONTROLLERS[i].getType()==Controller.Type.KEYBOARD||CONTROLLERS[i].getType()==Controller.Type.MOUSE) { + for (int i = 0; i < CONTROLLERS.length; i++) { + if (CONTROLLERS[i].getType() == Controller.Type.KEYBOARD + || CONTROLLERS[i].getType() == Controller.Type.MOUSE) { continue; } if (!CONTROLLERS[i].poll()) { - Controller[] newArr = new Controller[CONTROLLERS.length-1]; - for (int j=0;j<CONTROLLERS.length;j++) { - if (j!=i) { - newArr[(j>i?j-1:j)]=CONTROLLERS[i]; + Controller[] newArr = new Controller[CONTROLLERS.length - 1]; + for (int j = 0; j < CONTROLLERS.length; j++) { + if (j != i) { + newArr[(j > i ? j - 1 : j)] = CONTROLLERS[i]; } } - CONTROLLERS=newArr; + CONTROLLERS = newArr; } } } private static void ResetGame() { - player=null; - level_renderer=null; - control_settings_menu=null; - //System.gc(); + player = null; + level_renderer = null; + control_settings_menu = null; + // System.gc(); } private static void StartGame() { - //System.gc(); + // System.gc(); OBJ.add(player = new Player(p)); - OBJ.add(new Erinoah(p)); + //OBJ.add(new Erinoah(p)); } private static void ChooseBestRatio() { - while (f.getWidth()*(SIZE_MULTIPLIER+1)<Toolkit.getDefaultToolkit().getScreenSize().getWidth()) { + while (f.getWidth() * (SIZE_MULTIPLIER + 1) < Toolkit.getDefaultToolkit().getScreenSize().getWidth()) { SIZE_MULTIPLIER++; } - f.setSize(f.getWidth()*SIZE_MULTIPLIER,(int)((f.getWidth()*SIZE_MULTIPLIER)/1.77777777778d)); + f.setSize(f.getWidth() * SIZE_MULTIPLIER, (int) ((f.getWidth() * SIZE_MULTIPLIER) / 1.77777777778d)); } } diff --git a/src/sig/objects/LevelRenderer.java b/src/sig/objects/LevelRenderer.java index 114bfed..9016cde 100644 --- a/src/sig/objects/LevelRenderer.java +++ b/src/sig/objects/LevelRenderer.java @@ -42,6 +42,7 @@ public class LevelRenderer extends Object{ if (RabiClone.player!=null) { Draw_Animated_Object(RabiClone.player,RabiClone.player.facing_direction?Transform.HORIZONTAL:Transform.NONE); Draw_Text(4,4,new String(RabiClone.player.x_velocity),Font.PROFONT_12); + Draw_Text(4,4+Font.PROFONT_12.getGlyphHeight(),new String(RabiClone.player.slide_time3),Font.PROFONT_12); } } diff --git a/src/sig/objects/Player.java b/src/sig/objects/Player.java index 4ff3251..3d4bd8f 100644 --- a/src/sig/objects/Player.java +++ b/src/sig/objects/Player.java @@ -10,34 +10,35 @@ import sig.map.Map; import sig.map.Tile; import sig.map.View; import sig.objects.actor.State; +import sig.utils.TimeUtils; public class Player extends AnimatedObject{ - final static double GRAVITY = 2600; - final static double NORMAL_FRICTION = 9600; - final static double NORMAL_JUMP_VELOCITY = -450; + final static double GRAVITY = 1300; + final static double NORMAL_FRICTION = 6400; + final static double NORMAL_JUMP_VELOCITY = -300; final static boolean LEFT = false; final static boolean RIGHT = true; - final static int jump_fall_AnimationWaitTime = 200; - final static int slide_AnimationWaitTime = 100; - final static int slide_duration = 700; + final static long jump_fall_AnimationWaitTime = TimeUtils.millisToNanos(200); + final static long slide_AnimationWaitTime = TimeUtils.millisToNanos(100); + final static long slide_duration = TimeUtils.millisToNanos(700); - final static double WALKING_SPEED_LIMIT = 246; + final static double WALKING_SPEED_LIMIT = 164; double y_acceleration = GRAVITY; - double y_acceleration_limit = 150; + double y_acceleration_limit = 100; double x_acceleration = 0; - double x_acceleration_limit = 150; + double x_acceleration_limit = 100; double x_velocity = 0; - double x_velocity_limit = 369; - double y_velocity = 7.5; - double y_velocity_limit = 750; - double sliding_velocity = 246; - double sliding_acceleration = 180; + double x_velocity_limit = 246; + double y_velocity = 5; + double y_velocity_limit = 500; + double sliding_velocity = 164; + double sliding_acceleration = 120; - double horizontal_drag = 3000; + double horizontal_drag = 2000; double horizontal_friction = NORMAL_FRICTION; - double horizontal_air_drag = 1200; - double horizontal_air_friction = 270; + double horizontal_air_drag = 800; + double horizontal_air_friction = 180; double jump_velocity = NORMAL_JUMP_VELOCITY; @@ -54,12 +55,14 @@ public class Player extends AnimatedObject{ boolean spacebarReleased = true; boolean facing_direction = RIGHT; - long spacebarPressed = System.currentTimeMillis(); + long spacebarPressed = RabiClone.TIME; long jump_slide_fall_StartAnimationTimer = -1; long slide_time = -1; - int jumpHoldTime = 150; + long slide_time2 = -1; + long slide_time3 = 0; + long jumpHoldTime = TimeUtils.millisToNanos(150); - final static int slideBufferTime = 200; + final static long slideBufferTime = TimeUtils.millisToNanos(200); long slidePressed = -1; public Player(Panel panel) { @@ -80,16 +83,16 @@ public class Player extends AnimatedObject{ break; case FALLING: if(prvState!=State.FALLING){ - jump_slide_fall_StartAnimationTimer = System.currentTimeMillis(); + jump_slide_fall_StartAnimationTimer = RabiClone.TIME; setAnimatedSpr(Sprite.ERINA_JUMP_FALL1); } - if(System.currentTimeMillis()-jump_slide_fall_StartAnimationTimer>jump_fall_AnimationWaitTime){ + if(RabiClone.TIME-jump_slide_fall_StartAnimationTimer>jump_fall_AnimationWaitTime){ setAnimatedSpr(Sprite.ERINA_JUMP_FALL); jump_slide_fall_StartAnimationTimer=-1; } break; case IDLE: - if (System.currentTimeMillis()-slidePressed<=slideBufferTime) { + if (RabiClone.TIME-slidePressed<=slideBufferTime) { performSlide(); break; } @@ -116,23 +119,23 @@ public class Player extends AnimatedObject{ //jump_velocity=-500; } if(jump_slide_fall_StartAnimationTimer==-1){ - jump_slide_fall_StartAnimationTimer = System.currentTimeMillis(); + jump_slide_fall_StartAnimationTimer = RabiClone.TIME; setAnimatedSpr(Sprite.ERINA_JUMP_RISE1); } - if(System.currentTimeMillis()-jump_slide_fall_StartAnimationTimer>jump_fall_AnimationWaitTime){ + if(RabiClone.TIME-jump_slide_fall_StartAnimationTimer>jump_fall_AnimationWaitTime){ setAnimatedSpr(Sprite.ERINA_JUMP_RISE); } break; case SLIDE: horizontal_friction=0; if(jump_slide_fall_StartAnimationTimer==-1){ - jump_slide_fall_StartAnimationTimer = System.currentTimeMillis(); + jump_slide_fall_StartAnimationTimer = RabiClone.TIME; setAnimatedSpr(Sprite.ERINA_SLIDE1); } - if(System.currentTimeMillis()-jump_slide_fall_StartAnimationTimer>slide_AnimationWaitTime){ + if(RabiClone.TIME-jump_slide_fall_StartAnimationTimer>slide_AnimationWaitTime){ setAnimatedSpr(Sprite.ERINA_SLIDE); } - if(System.currentTimeMillis()-slide_time>slide_duration){ + if(RabiClone.TIME-slide_time>slide_duration){ if(KeyHeld(Action.MOVE_LEFT)){ facing_direction=LEFT; } @@ -140,6 +143,7 @@ public class Player extends AnimatedObject{ facing_direction=RIGHT; } state=State.IDLE; + slide_time3 = (System.nanoTime()-slide_time2); } if (KeyHeld(Action.MOVE_LEFT)&&!KeyHeld(Action.MOVE_RIGHT)) { if (facing_direction==LEFT&&x_velocity>-sliding_velocity*1.5|| @@ -162,7 +166,7 @@ public class Player extends AnimatedObject{ break; } prvState = state; - if (KeyHeld(Action.JUMP)&&System.currentTimeMillis()-spacebarPressed<jumpHoldTime) { + if (KeyHeld(Action.JUMP)&&RabiClone.TIME-spacebarPressed<jumpHoldTime) { y_velocity=jump_velocity; } } @@ -197,7 +201,7 @@ public class Player extends AnimatedObject{ break; case FALLING: if (a==Action.SLIDE||a==Action.FALL) { - slidePressed=System.currentTimeMillis(); + slidePressed=RabiClone.TIME; //System.out.println("Queue up slide."); } case JUMP: @@ -205,7 +209,7 @@ public class Player extends AnimatedObject{ jumpCount=0; y_velocity = jump_velocity; spacebarReleased=false; - spacebarPressed=System.currentTimeMillis(); + spacebarPressed=RabiClone.TIME; } break; case SLIDE: @@ -223,7 +227,7 @@ public class Player extends AnimatedObject{ jumpCount--; y_velocity = jump_velocity; spacebarReleased=false; - spacebarPressed=System.currentTimeMillis(); + spacebarPressed=RabiClone.TIME; //System.out.println("Jump"); } } @@ -241,7 +245,8 @@ public class Player extends AnimatedObject{ private void performSlide() { - slide_time = System.currentTimeMillis(); + slide_time = RabiClone.TIME; + slide_time2 = System.nanoTime(); if(facing_direction){ x_velocity=sliding_velocity; } diff --git a/src/sig/utils/TimeUtils.java b/src/sig/utils/TimeUtils.java new file mode 100644 index 0000000..83a3b91 --- /dev/null +++ b/src/sig/utils/TimeUtils.java @@ -0,0 +1,7 @@ +package sig.utils; + +public class TimeUtils { + public static long millisToNanos(long millis) { + return millis*1000000L; + } +}