Java-Gaming.org    
Featured games (91)
games approved by the League of Dukes
Games in Showcase (581)
games submitted by our members
Games in WIP (500)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Camera/Movement Starting Point  (Read 369 times)
0 Members and 1 Guest are viewing this topic.
Offline Troncoso

JGO Coder


Medals: 20



« Posted 2013-04-03 00:03:35 »

I hate being that guy starting a thread that's been started a million times, but none of the threads seem to have very good answers.

Anyway, I'm looking for some sort of learning materials, so I can understand and implement the camera/movement systems needed for a side scrolling game. I'm using slick2D, though, for general purpose learning, I guess it doesn't have to be slick2D material (Not that I could find any, regardless).

The biggest thing is that I'm not using tiles. That seems to be where the search attempts fail. If I ever do find examples or tutorials, it's for tile based games.

Any references would be greatly appreciated. Thanks!
Offline Troncoso

JGO Coder


Medals: 20



« Reply #1 - Posted 2013-04-03 03:24:33 »

Welp. Turns out it wasn't as hard as I thought. I found a simple Camera class for use with TileMaps, and modified it to work with a background image instead. Here it is for anyone that wants to use it:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125  
126  
127  
128  
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Image;

public class Camera
{
   // Image to draw
  protected Image bg;

   // Position of the camera
  protected float camX, camY;

   // Width and height of image
  protected float bgWidth, bgHeight;

   // Game container to get screen width/height
  protected GameContainer gc;

   /**
    * Create new Camera
    *
    * @param gc the game container
    * @param bg the background image
    */

   public Camera(GameContainer gc, Image bg)
   {
      this.bg = bg;

      bgWidth =  bg.getWidth();
      bgHeight = bg.getHeight();

      camX = camY = 0;

      this.gc = gc;
   }

   /**
    * Centers on the x, y coordinate given. If the camera comes to
    * an edge of the image, the camera stops
    *
    * @param x x position to center on
    * @param y y position to center on
    */

   public void centerOn(float x, float y)
   {
      camX = x - gc.getWidth()  / 2;
      camY = y - gc.getHeight() / 2;

      if(camX < 0)
         camX = 0;
      if(camX + gc.getWidth() > bgWidth)
         camX = bgWidth - gc.getWidth();

      if(camY < 0)
         camY = 0;
      if(camY + gc.getHeight() > bgHeight)
         camY = bgHeight - gc.getHeight();
   }
   
   /**
    * Centers on the x coordinate given. Use so the camera
    * only accounts for horizontal movement
    *
    * @param x x position to center on
    */

   public void centerOnX(float x)
   {
      camX = x - gc.getWidth()  / 2;

      if(camX < 0)
         camX = 0;
      if(camX + gc.getWidth() > bgWidth)
         camX = bgWidth - gc.getWidth();

   }
   
   /**
    * Centers on the y coordinate given. Use so the camera
    * only accounts for vertical movement
    *
    * @param y y position to center on
    */

   public void centerOnY(float y)
   {
      camY = y - gc.getHeight() / 2;

      if(camY < 0)
         camY = 0;
      if(camY + gc.getHeight() > bgHeight)
         camY = bgHeight - gc.getHeight();
   }
   
   /**
    * Draw the background
    */

   public void draw()
   {
      this.draw(camX, camY);
   }
   
   /**
    * Draw the background using an offset separate of the camera
    *
    * @param offsetX x offset to use
    * @param offsetY y offset to use
    */

   public void draw(float offsetX, float offsetY)
   {
      gc.getGraphics().drawImage(bg, 0, 0, offsetX, offsetY,
            offsetX + gc.getWidth(), offsetY + gc.getHeight());
   }
   
   /**
    * Translates all graphics relative to the camera
    */

   public void translateGraphics()
   {
      gc.getGraphics().translate(-camX, -camY);
   }
   
   /**
    * Undoes translateGraphics(). Use before drawing anything
    * that is independent of camera position, like HUD's.
    */

   public void untranslateGraphics()
   {
      gc.getGraphics().translate(camX, camY);
   }
}


An example of using it in the render() method:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
Camera cam;
Image bg;
Image player;
float px, py;   // Player coordinates

public void init(GameContainer gc)
{
    bg = new Image("Image path");
    player = new Image("Image path");
    cam = new Camera(gc, bg);

    px = py = 0;
}

public void render(GameContainer gc, Graphics g)
{
    cam.centerOn(x, py);
    cam.draw();
    cam.translateGraphics();

    g.drawImage(player, x, y);
}

public void update(GameContainer gc, int delta)
{
    // Move player and stuff
}
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

xsi3rr4x (62 views)
2014-04-15 18:08:23

BurntPizza (60 views)
2014-04-15 03:46:01

UprightPath (73 views)
2014-04-14 17:39:50

UprightPath (56 views)
2014-04-14 17:35:47

Porlus (73 views)
2014-04-14 15:48:38

tom_mai78101 (99 views)
2014-04-10 04:04:31

BurntPizza (159 views)
2014-04-08 23:06:04

tom_mai78101 (254 views)
2014-04-05 13:34:39

trollwarrior1 (208 views)
2014-04-04 12:06:45

CJLetsGame (215 views)
2014-04-01 02:16:10
List of Learning Resources
by SHC
2014-04-18 03:17:39

List of Learning Resources
by Longarmx
2014-04-08 03:14:44

Good Examples
by matheus23
2014-04-05 13:51:37

Good Examples
by Grunnt
2014-04-03 15:48:46

Good Examples
by Grunnt
2014-04-03 15:48:37

Good Examples
by matheus23
2014-04-01 18:40:51

Good Examples
by matheus23
2014-04-01 18:40:34

Anonymous/Local/Inner class gotchas
by Roquen
2014-03-11 15:22:30
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!