[LWJGL] Tile System: How to makes only certain tiles change

If you look at my projects in my profile, or the newest project in showcase, you’ll see I have a basic tile engine. I spent most of my time trying to debug its’ problems. I have a way of making the tiles load according to their size. The problem is, whenever I call the sizechanger method, it changes the size of all boxes.

Mainly I am asking if you can edit my code so that each rectangle is different when It is called or resized. I just couldn’t think of a good way. Hope you can help on my first project.

Notice
Keep in mind the copyright comment is because I used his set up and basics. I implemented the resizing and location, and how it is arranged.

The code:

* Copyright (c) 2013, Oskar Veerhoek
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those
 * of the authors and should not be interpreted as representing official policies,
 * either expressed or implied, of the FreeBSD Project.
 */

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;



import java.util.ArrayList;
import java.util.List;



import static org.lwjgl.opengl.GL11.*;


/**
 * Shows how to use input to achieve cool results. Thanks to Azziplekkus1337 for the better way of handling the
 * cool-down!
 *
 * @author Oskar
 */
public class InputDemo {


	
    private static final List<Box> shapes = new ArrayList<Box>(16);
    private static boolean somethingIsSelected = false;
    private static long lastColourChange;

    public static void main(String args[]) {
        try {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.setTitle("Input Demo");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            Display.destroy();
            System.exit(1);
        }
        
        glMatrixMode(GL_PROJECTION);
        glOrtho(0, 640, 480, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        while (!Display.isCloseRequested()) {
            glClear(GL_COLOR_BUFFER_BIT);
            while (Keyboard.next()) {
            	//RED
                if (Keyboard.getEventKey() == Keyboard.KEY_1 && Keyboard.getEventKeyState()) {
                	if (Box.size == 0){
                    shapes.add(new Box(0, 463, "r"));
                	}
                	if (Box.size == 1){
                        shapes.add(new Box(0, 448, "r"));
                    }
                	if (Box.size == 2){
                        shapes.add(new Box(0 , 430, "r"));
                    }
                	if (Box.size == 3){
                        shapes.add(new Box(0 , 430, "r"));
                    }
                }
                //BLUE
                if (Keyboard.getEventKey() == Keyboard.KEY_3 && Keyboard.getEventKeyState()) {
                	if (Box.size == 0){
                        shapes.add(new Box(129, 463, "b"));
                    	}
                    	if (Box.size == 1){
                            shapes.add(new Box(129, 448, "b"));
                        }
                    	if (Box.size == 2){
                            shapes.add(new Box(129 , 430, "b"));
                        }
                    	if (Box.size == 3){
                            shapes.add(new Box(129, 430, "b"));
                        }
                }
                //GREEN
                if (Keyboard.getEventKey() == Keyboard.KEY_2 && Keyboard.getEventKeyState()) {
                	if (Box.size == 0){
                        shapes.add(new Box(64, 463, "g"));
                    	}
                    	if (Box.size == 1){
                            shapes.add(new Box(64, 448, "g"));
                        }
                    	if (Box.size == 2){
                            shapes.add(new Box(64, 430, "g"));
                        }
                    	if (Box.size == 3){
                            shapes.add(new Box(64, 430, "g"));
                        }
                }
                //WHITE
                if (Keyboard.getEventKey() == Keyboard.KEY_0 && Keyboard.getEventKeyState()) {
                	if (Box.size == 0){
                        shapes.add(new Box(590, 463, "w"));
                    	}
                    	if (Box.size == 1){
                            shapes.add(new Box(590 - 32, 448, "w"));
                        }
                    	if (Box.size == 2){
                            shapes.add(new Box(590 , 430, "w"));
                        }
                    	if (Box.size == 3){
                            shapes.add(new Box(590 , 430, "w"));
                        }
                }
            }
            if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
                Display.destroy();
                System.exit(0);
            }
            for (final Box box : shapes) {
                if (Mouse.isButtonDown(0) && box.isInBounds(Mouse.getX(), 480 - Mouse.getY()) && !somethingIsSelected) {
                    somethingIsSelected = true;
                    box.selected = true;
                }
                if (Mouse.isButtonDown(2) && box.isInBounds(Mouse.getX(), 480 - Mouse.getY()) && !somethingIsSelected) {
                    if ((System.currentTimeMillis() - lastColourChange) >= 200 /* milliseconds */) {
                        box.addSize();
                        lastColourChange = System.currentTimeMillis();
                    }
                }
                if (Mouse.isButtonDown(1)) {
                    box.selected = false;
                    somethingIsSelected = false;
                }


                if (box.selected) {
                    box.update(Mouse.getDX(), -Mouse.getDY());
                }

                box.checkSize();
                box.draw();
            }


            Display.update();
            Display.sync(60);
        }


        Display.destroy();
    }


    private static class Box {


        
        public static int size = 3;
		public int x, y;
        public boolean selected = false;
        private int colorRed, colorBlue, colorGreen;
        @SuppressWarnings("unused")
		public String color;
        
        


        Box(int x, int y, String color) {
            this.x = x;
            this.y = y;
            


          //  Random randomGenerator = new Random();
            if (color == "r") {
            	colorRed = 255;
            	colorBlue = 0;
            	colorGreen = 0;
            	
            	}
            if (color == "b") {
            	colorBlue = 255;
            	colorRed = 0;
            	colorGreen = 0;
            	}
            
            
            if (color == "g") {
            	colorBlue = 0;
            	colorRed = 0;
            	colorGreen = 255;
            	}
            
            if (color == "w") {
            	colorRed = 255;
            	colorBlue = 255;
            	colorGreen = 255;
            	
            	}
        }


        boolean isInBounds(int mouseX, int mouseY) {
            return mouseX > x && mouseX < x + 50 && mouseY > y && mouseY < y + 50;
        }


        void update(int dx, int dy) {
            x += dx;
            y += dy;
        }
        public void checkSize() {

            if (size > 3) {
            	size = 0;
            }
        }


        void addSize() {
        	size++;
        }


        void draw() {
            glColor3f(colorRed, colorGreen, colorBlue);
            glBegin(GL_QUADS);
            glVertex2f(x, y);
            if(size == 2){
            glVertex2f(x + 32, y);
            glVertex2f(x + 32, y + 32);
            glVertex2f(x, y + 32);
            }
            if(size == 0) {
            	 glVertex2f(x + 8, y);
                 glVertex2f(x + 8, y + 8);
                 glVertex2f(x, y + 8);
            }
            if(size == 1) {
           	 glVertex2f(x + 16, y);
                glVertex2f(x + 16, y + 16);
                glVertex2f(x, y + 16);
           }
            if(size == 3) {
              	 glVertex2f(x + 64, y);
                   glVertex2f(x + 64, y + 64);
                   glVertex2f(x, y + 64);
              }
            glEnd();
        }
    }
}

:point: :point: :point: :point: :point: :point: :point: :point: :point: :point:

We aren’t going to write your code for you. That’s a fact.

However, we can give you suggestions :point:
Your problem is that size is static, which means that it will contain the same value in all instances, among other things.

What a way with words…

Anyways, I actually don’t know the proper meaning of static. I put “Look up static, abstract, etc…” on my TODO list but never did it. Who knew the answer was following my own orders.
Thanks

I did research on static and the int size has to be static when I create it. Is there any other way to call it without static errors/exceptions?

Understanding static is very important to coding in Java, and some other OOP languages for that matter.

Why does size have to be static? With your design, it shouldn’t be static, but be a private variable that you can retrieve with a getSize method. Said method would look like this:


public int getSize() {
return size;
}

So just a basic getter. I don’t know how much experience you have in Java, but from what it looks like, you might want to take some time to learn the language a bit better. That’s not an insult, it’s just a suggestion based on what I’ve seen :slight_smile:
Of course I could be completely wrong, and you could know more about the language than I and others in other areas of it. However knowing the basic keywords is a very important thing.

But could you explain why size must be static?

Thanks for the suggestion, I always took that as an insult XD. I do need to work on java a bit more. I Learned java stubbornly and wouldn’t learn anything unless I needed to which made things confusing. Anyways if you delete the static part from my code it will give an exception where ever you use it in the InputDemo.

EXAMPLE:

if (Keyboard.getEventKey() == Keyboard.KEY_1 && Keyboard.getEventKeyState()) {
                  //Box.size gets an error
                   if (Box.size == 0){
                    shapes.add(new Box(0, 463, "r"));
                   }

I’ll be trying the get size. I tried before but that was when it was very buggy

In that case you’re going to make things called getters and setters, or you can make the variable public (not static). Getters are methods that let you access private variables in a class instance, and setters are methods that let you set private variables in a class instance. Using private variables w/ getters and setters is generally suggested.

So you could have your variable like this:


private int size;

and then create these:


//Getter
public int getSize() {
   return size;
}

//Setter
public void setSize(int size) {
   this.size = size;
}

Now you can have a public static (maybe final?) variable that acts as a default for the size. When variables are static final, we usually uppercase them. So, unless you’re going to be editing the default tile size, you could have something like this in either your tile manager class or tile class itself:


public static final int SIZE = (int) whatever size ya want;

Check out some basic Java tuts to get a good grip on the language, I highly suggest this one as it ranges from very basic to advanced topics: http://www.tutorialspoint.com/java/

I’m familiar with getters and setters but had no idea they access only private variables. Ironically, I use that site you linked.

Oh, they don’t have to only access private variables. It’s just that there’s no point in having them if the variable is public since you can just well, access it with just the instance.
About the site, just read it over a bit and think of small things that you can use the new/reviewed knowledge for. Nothing large or game-related, just a simple 10-50 line program. Or more, depending on what you want to do.

in the if statements, it tells me to use static in the get methods, but I’ll figure something out. :-\

What do you mean in the if statements?

In here:

//RED
                if (Keyboard.getEventKey() == Keyboard.KEY_1 && Keyboard.getEventKeyState()) {
                   if (Box.size == 0){
                    shapes.add(new Box(0, 463, "r"));
                   }
                   if (Box.size == 1){
                        shapes.add(new Box(0, 448, "r"));
                    }
                   if (Box.size == 2){
                        shapes.add(new Box(0 , 430, "r"));
                    }
                   if (Box.size == 3){
                        shapes.add(new Box(0 , 430, "r"));
                    }
                }

I’ll probably have to mess around with the List so each box has its’ own size based on what it is set to.

private static final List<Box> shapes = new ArrayList<Box>(16);

Well first off, why is your list ‘final’? That means you cannot change the object after it is created.

Actually, in Java at least, it means you can’t change the value stored within that field.

Yeah that’s true. There actually is a big difference there… thanks!

The Box.size is where you use the public static final SIZE variable that you literally just talked about right before the List code. However, the way you are talking about it, it sounds like you will just want to accept a size into the constructor and remove the final SIZE variable that I said you may want to add.
And what opiop said.

Actually, before you even do this, you should look up basic language tutorials. You should be comfortable with Java before you try to make any game in it. Therefore, I would suggest looking up tutorials like “beginner java tutorial.” The reason is, most (if not all) good 2d Java game tutorials assume that you know the language already, and therefore, they aren’t going to try to teach you the language.

What I decided to do is look through long java series and select the ones that have something I don’t know about, so I get the knowledge of anything I skipped or didn’t learn properly

Well to be honest with you… it seems like you don’t know the basics at all. I think you really should take the time to go through a language tutorial front to back. It really will help.

Been wondering this for a while…have you actually done basic java? Like, the Sun tutorial, maybe some coding practice over at codingbat.com?