Dynamically load class

Ok, first off, I’m new here, so sorry if this is in the wrong place :frowning: if it is, let me know, and i’ll re-post it in the right place

now that’s out the way, down to business.

I’ve just started out on a voxel-engine for making my future 3D games, so i’m not reinventing the wheel (or block as it were), every time i make a game (since most my games have been block based, or as i’ve come to lovingly call them, 3D tile based games, anyway).

What i really want to do, is allow for other people to add “blocks” into my game. so, I’ve decided that the best way to do that, is to dynamically load class’s that match a standard template. And using a Map to hold them, so they can be “called”/identified by name. I’ll also be using a loader, that reduces the risk of conflict, by renaming files that have the same name.

So, what i need to work out is how to dynamically load a class, and then be able to call its methods.

Heres an example of what all the class’s WILL (moders permitting) will look like:
[spoiler]


public class block{
        /*there may or may not be variables stored here, for example, my TNT will have a count down variable stored here when its done*/
	
	public block(float x, float y, float z){
	/*used to set all parameters for the block, will only be passed the x,y,z values. by default, this is the bottom left front corner of the cube*/
	}

        public void interact(){
	/*this is what happens when the player interacts with the block.*/
	}
	
	public void jump(){
	/*this is what happens when the player is stood on top of the block (will probably remain empty)*/
	}
	
	public void bump(){
	/*if the player walks into the side of the block*/
	}
	
	public void update(){
	/*called every game loop, to make any changes, such as movement, or checking for [i]some[/i] collisions*/
	}
	
	public void render(){
	/*called EVERY loop, otherwise the block vanishes*/
	}

[/spoiler]

any hints on how to load and call these class’s would be much appreciated.

if its relevant, all class’s will be .class files.

Thanks in advance

DAN

Im not sure if this is of any help but maybe make a super / sub class thing here. Super class containing everything all blocks have in common (grass, stone, water) and the sub class of specific things (water will have different properties than stone will). You just call the methods of those classes based off of user input.

EDIT: I read your post again now and I’m not sure if I understood what your asking for…

I think this should give you a start: http://stackoverflow.com/questions/8546467/jar-plugins-implementation
You could use the Bukkit api as inspiration. Or maybe load the class files from a file using the URLClassLoader.

You also could define the blocks in a text file in which you define the attributes of each block.
This file could look like this:

-block
name = grass;
texture = grass.png;
solid = true;

Then you just parse the attributes from the file. If you want now a grass Block you create a Block class/object and load the grass attributes in the object.

Or you could create objects which are derived from Block dynamically from their full class name.
This worked for me: http://www.rizzoweb.com/java/dynamicInstantiation.html

I don’t know if it was already metioned, but take a look at the standard ServiceLoader

Thanks everyone for the quick (and supportive) replies :slight_smile:

I’ll have a look through all my options and pick the one that i think will work best for me

THANKYOU :smiley:

dan

Ok, I’m faced with a slight difficulty now.

I’ve changed my mind a bit, and have all my class’s in the main jar, but still want to call them dynamically. any ideas as to how?

explain a bit more what you want to achieve

Isn’t this just using reflection?

Offtopic, your class should start with an Upperclase letter. :point:

Why the heck are player collision with block code in the block? Even as a simple implementation it would be put into the player class, but overall it would be better to put it in your collision manager.

I see your point. Collision detection, and stopping the player walking through the block is handled in the player class, its just block specific collision stuff, like pressure plates, and trip wires, where its handled in the block. In most blocks, this will be left blank, its just some special blocks that will be different. Similarly, to make blocks that aren’t solid, a custom declaration and render would be needed. When i’ve finished, and got some new blocks type (and dynamite lol), i’ll have to show you, then it’ll all make sense (I hope)

It is indeed, I was just getting myself confused. Sorry about that one lol.

Indeed it should. I’ve borrowed and edited a friends class, and just havent got round to renaming it yet lol. I’ll sort it before i finish.

If you are still looking to do this, today I used reflection to do something similar and it worked out fantastically. This is what I did with reflection. Using this mini-library, I was able to get a list of classes in the same package as the class. From there I sorted through their simple names and got rid of some classes that I didn’t need. Then, I looped through the good classes and checked some things before returning one or throwing an error if none met certain criteria. In the end, for my FakeJavaOS console I could input commands and the matcher would dynamically load a class corresponding to the command. Sorry for the lack of comments; if you need some I can put them in tomorrow. Feel free to compile the application using the application’s build.xml if you want to see it in action. I think it would work great for what you are looking for. It is basically what you are trying to do, after all.