Jump to content

  • Log In with Google      Sign In   
  • Create Account


Lane Spangler

Member Since 08 Mar 2012
Offline Last Active May 07 2013 04:47 PM

Topics I've Started

Scaling game to different resolutions (LWJGL)

15 May 2012 - 03:34 PM

I have made a pong clone in java using the LWJGL game library. I am not sure how to make it so the game plays the same way in different resolutions. It is kind of hard to explain. I made the game based on a 1920x1080 resolution. When I change the resolution the paddle and ball and everything remains the same size in pixels. So in a lower resolution you are playing in an extremely small space and the paddles and the ball are huge. This is the code that I use to set up the display and stuff:

From main class:
package com.gmail.l5p4ngl312.pong;
import java.awt.Dimension;
import java.awt.Toolkit;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class main {
   static boolean running = true;
   int fps;
   long lastFPS;
   int currentDelta;
   static long lastFrame;
   public void start()
   {
	 game game = new game();
	
   Toolkit toolkit = Toolkit.getDefaultToolkit();
   Dimension screensize = toolkit.getScreenSize();
  
   System.out.println(screensize);
   game.xRes = (int) screensize.getWidth();
   game.yRes = (int) screensize.getHeight();
  
	 try {
	   setDisplayMode(game.xRes, game.yRes, false);
	   Display.create();
	   Display.setVSyncEnabled(true);
	 } catch (LWJGLException e) {
	   e.printStackTrace();
	   System.exit(0);
	 }
	 game.OnInit();
	 this.lastFPS = getTime();
	 while ((!Display.isCloseRequested()) && (running))
	 {
	  currentDelta = getDelta();
	   game.OnEvent(currentDelta);
	   game.OnUpdate(currentDelta);
	   updateFPS();
	   game.OnRender();
	   Display.update();
	   Display.sync(120);
	 }
	 Display.destroy();
   }
   public void setDisplayMode(int width, int height, boolean fullscreen)
   {
	 if ((Display.getDisplayMode().getWidth() == width) &&
	   (Display.getDisplayMode().getHeight() == height) &&
	   (Display.isFullscreen() == fullscreen)) {
	   return;
	 }
	 try
	 {
	   DisplayMode targetDisplayMode = null;
	   if (fullscreen) {
		 DisplayMode[] modes = Display.getAvailableDisplayModes();
		 int freq = 0;
		 for (int i = 0; i < modes.length; i++) {
		   DisplayMode current = modes[i];
		   if ((current.getWidth() == width) && (current.getHeight() == height)) {
			 if (((targetDisplayMode == null) || (current.getFrequency() >= freq)) && (
			   (targetDisplayMode == null) || (current.getBitsPerPixel() > targetDisplayMode.getBitsPerPixel()))) {
			   targetDisplayMode = current;
			   freq = targetDisplayMode.getFrequency();
			 }
			 if ((current.getBitsPerPixel() != Display.getDesktopDisplayMode().getBitsPerPixel()) ||
			   (current.getFrequency() != Display.getDesktopDisplayMode().getFrequency())) continue;
			 targetDisplayMode = current;
			 break;
		   }
		 }
	   }
	   else {
		 targetDisplayMode = new DisplayMode(width, height);
	   }
	   if (targetDisplayMode == null) {
		 System.out.println("Failed to find value mode: " + width + "x" + height + " fs=" + fullscreen);
		 return;
	   }
	   Display.setDisplayMode(targetDisplayMode);
	   Display.setFullscreen(fullscreen);
	 }
	 catch (LWJGLException e) {
	   System.out.println("Unable to setup mode " + width + "x" + height + " fullscreen=" + fullscreen + e);
	 }
   }
   public static long getTime()
   {
	 return Sys.getTime() * 1000L / Sys.getTimerResolution();
   }
   public void updateFPS()
   {
	 if (getTime() - this.lastFPS > 1000L) {
	   this.fps = 0;
	   this.lastFPS += 1000L;
	 }
	 this.fps += 1;
   }
  
   public static int getDelta()
   {
	long time = getTime();
	int delta = (int)(time - lastFrame);
	lastFrame = time;
	return delta;
   }
   public static void main(String[] argv)
   {
	 main display = new main();
	 display.start();
   }

}


From game class:
package com.gmail.l5p4ngl312.pong;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.Stack;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
public class game
{
  static Stack<stateManager> stateStack = new Stack();
  String TITLE = "Pong";
  static int xRes = 0;
  static int yRes = 0;
  public static boolean lmbPressed;
  public static boolean rmbPressed;
  public void OnInit()
  {

	Display.setTitle(this.TITLE);
	GL11.glEnable(GL11.GL_TEXTURE_2D);
	GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
	GL11.glEnable(GL11.GL_BLEND);
	GL11.glBlendFunc(GL11.GL_SRC_ALPHA , GL11.GL_ONE_MINUS_SRC_ALPHA);
	GL11.glLoadIdentity();
	GL11.glViewport(0, 0, xRes, yRes);
	GL11.glMatrixMode(GL11.GL_PROJECTION);
	GL11.glOrtho(0.0D, xRes, 0.0D, yRes, 1.0D, -1.0D);
	GL11.glMatrixMode(GL11.GL_MODELVIEW);
	textures.LoadTextures();
	ChangeState(stateMenu.Instance());
  }
  public void OnEvent(int delta)
  {
	if (Mouse.isButtonDown(0))
	{
	  lmbPressed = true;
	}
	else lmbPressed = false;
	if (Mouse.isButtonDown(1))
	{
	  rmbPressed = true;
	}
	else rmbPressed = false;
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).OnEvent(delta);
	}
  }
  public void OnUpdate(int delta)
  {
	if ((!stateStack.empty()) && (!((stateManager)stateStack.peek()).Paused))
	{
	  ((stateManager)stateStack.peek()).OnUpdate(delta);
	}
  }
  public static void OnRender()
  {
	GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).OnRender();
	}
  }
  public static void OnCleanup()
  {
	while (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).OnCleanup();
	  stateStack.pop();
	}
	main.running = false;
  }
  public static void ChangeState(stateManager state) {
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).OnCleanup();
	  stateStack.pop();
	}
	stateStack.push(state);
	((stateManager)stateStack.peek()).OnInit();
  }
  public static void PopState()
  {
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).OnCleanup();
	  stateStack.pop();
	}
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).Resume();
	}
  }
  public static void PushState(stateManager state)
  {
	if (!stateStack.empty())
	{
	  ((stateManager)stateStack.peek()).Pause();
	}
	stateStack.push(state);
	((stateManager)stateStack.peek()).OnInit();
  }
}

Idea Wanted For Isometric Game

08 March 2012 - 09:54 PM

I am working on a level editor for an isometric game so the idea can be anything as long as it is isometric tile based. Here is what i have planned and accomplished for the editor:
Finished:
Tiles-
Grass
Paved Road
Paved road with lines

Raised Tiles:
Tall Grass
Sidewalk

Tile select and fill tool

Wall tool for placing and deleting walls

Planned:
Any tile or wall type required for idea
Object placement tool
Multi-floor and roofs

Possible:
Diagonal wall placement
Partial tiles

So the fame could be anything that could make use of this kind of level. For example a fantasy action RPG or a zombie survival game or maybe a RTS

Edit heres a screenshot from the editor:
http://imgur.com/6cDBg

PARTNERS