Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 09 Feb 2012
Offline Last Active Aug 14 2014 08:46 AM

Topics I've Started

2D Platformer Technique?

08 July 2014 - 09:20 AM

I'm trying to make AI for my 4-player party game. It's basically a series of minigames. You can see a preview of the gameplay here.


I've been tackling this problem for weeks, but it seems either there's very little information/technical guidance out there, or there's just generally no general solution. (I'm assuming the latter), I'll try to state my problem and the solutions I'm trying as briefly as I can. 


The game uses box2d to simulate its physics, with slightly tweaked physics (for example I re-set the character's velocity every frame to apply my own universal friction independent of everything else)


The Problem


How do I implement efficient path finding in a game like this? 




Attempt #1


My first attempt was to build a sort of "connectivity graph", given any walkable tile, what other walkable tiles the character can reach with one "step" (where step is defined as holding a specific set of keys for a certain time) 


For example, you can see in the image below, he can either walk right, left or jump to these various tiles, or fall down. 




Once that is good enough, it's trivial to run A* and come up with a path. 


And it seems to work well in the general case:




However, this has a few problems.


Since all my nodes are "walkable" tiles. It can never jump up to hit a target in the air if it needed. 


Since the nodes are all based on merely x and y (not taking into account acceleration and speed), it requires a lot of fudging to get it to work (for example, you can see it slows down between jumps, because it has to position itself correctly before making the jump).


It's pretty manual. I have to specify whether it can make the jump based on the tiles around it and whether there are any tiles that would block its path. The more restricting the checks are the more special cases it misses, and the more liberal it is the higher the risk it can get stuck.


It cannot make jumps like this:




Overall, it feels very restricted. 



Attempt #2


So I took a look at the Mario AI  and how it was done, since it seemed very similar to what I was trying to do.


It seems pretty solid, and the way he said it's made is that, instead of taking "steps" between tiles, it takes steps as in, what it should press the next frame, and where it will end up.




from this interview


So I did something like that, predicting the path given the current state and the key input


In this gif, it predicts the path if you keep the buttons pressed held




I thought I could then easily run this through an A*, and it will generate an awesome path.


I can't seem to figure out at all how to design the cost/heuristic for this. My heuristic is a simple euclidean distance of the node to the goal. As for the cost, I just made it a constant 1 for any and every stop, and this is what I'm getting:




This is the path generated by the A*, at every node it knows which key to press to reach the next one. It can jump on that pillar and get to the target. So far so good, works great! However...




It gets stuck for a really really long time. (This is stopped after a fixed time)


It would eventually find a path but the thing is, it's just searching way too many nodes. It keeps trying first to jump directly up, then to jump directly up, but just before hitting the tile, it goes right. That obviously doesn't work, it tries left, that doesn't work. It then tries 2 frames ago to do the same. It keeps doing this, so it never really reaches the goal. 





Does anyone know where to go from here? How to fix this? How does Mario AI do it? Any insight there would be extremely helpful!


Thank you for your time and really sorry the post ended up being so long!

Efficiently Detecting if objects are out of screen?

07 January 2013 - 05:11 AM

I have a small optimization problem in my game. If I have 10,000 objects in-game, but only 10 objects on screen (or no objects on screen), the game will lag, because what I do is I check every single frame, for every object, if the object is inside the screen or not.


So obviously as more objects are added, the slower things get. I thought about using some form of spatial indexing, so that if my camera is at (100,100), then instead of looping through 10k objects to know which are in-screen, I will simply ask my grid if there are any objects at 100,100, and do the same for neighbouring cells to get all objects inside the screen without ever having to loop, no matter if I have a thousand, or a million objects.


The problem, however, was that this doesn't account for moving objects, because if an object moves, I would have to check every frame if it has entered another grid cell or exited its cell.


So how do you detect which objects are inside the screen?

Sending lots of data to the GPU?

01 November 2012 - 04:00 PM

I've got my lighting shader code. And let's say I want to have 10, 20, or 50 lights in my scene. Now the lighting code itself isn't very complex, it should easily be able to handle a lot of lights without too much trouble. However, just by declaring my array to hold 150 vec3's, I just get a black screen, presumably because my graphics card can't handle all that much?

I was thinking a way around this would be to create an image at run time where each pixel represents the XYZ and intensity of the light as RGBA and send that instead to the shader. That way I could theoretically have a thousand lights with no problems. I haven't implemented this yet but I wanted to ask how other people handle stuff like this, or whether I should even be trying to send that much data to my shader. And how you normally optimize such things.

Any tips would be appreciated!


Multiple Lights, adding dot product?

16 October 2012 - 12:01 PM

I know there are a lot of topics asking about multiple lights, but I just have one simple question that I can't seem to find the answer to.

So in order to support multiple lights, I loop over the lights, and add together the intensities of each light source (and things like color etc..)

Now the only thing I'm having trouble with, is how to handle the dot product. I tried adding the dot products, but that just makes the two light sources sort of merge into each other, and when they are far apart the object is completely dark.

How do I handle the angle/dot product for multiple lights? (I'm not sure if code is needed to answer the question, if so I'll upload my shader code).

Thanks in advance!

Simple diffuse light. Weird Behavior.

10 October 2012 - 01:49 AM

So I'm trying to make a simple lighting effect. I have my normal map and my object posted below.

Posted ImagePosted Image

And my code in GLSL is written below:

uniform sampler2D normal;
uniform vec2 mouse;
uniform float Za;
	 vec4 effect(vec4 color,sampler2D tex,vec2 tc,vec2 pc)
	 vec4 img_color = texture2D( tex, tc );
	 vec4 normalColor = texture2D( normal, tc );
	 float X = (mouse.x - pc.x);
	 float Y = (mouse.y - pc.y);
	 float Z = Za;
	 float dotProduct = X * normalColor.r + Y * normalColor.g + Z * normalColor.b;
	 dotProduct /= sqrt(X * X + Y * Y + Z * Z) * sqrt(normalColor.r * normalColor.r + normalColor.g * normalColor.g + normalColor.b * normalColor.b);
	 float factor = dotProduct;
	 img_color.r = img_color.r + factor;
	 img_color.g = img_color.g + factor;
	 img_color.b = img_color.b + factor;
	 return img_color;

So basically I had a few questions:

Is my math correct?
What I'm trying to do is get the vector of the mouse (the light source for now) to the pixel, and the normal of that pixel, and then get the dot product between them, normalize that, and that is the brightness factor. However the angle seems to be a bit off. I just wanted to double check if my questions were all right because debugging on the GPU doesn't seem to be very easy

For the usual lighting methods, do you multiply by a distance factor?
Naturally when a light is further away the object should be dimmer. But this doesn't seem to be the case with this approach. Should I just multiply by some arbitrary distance factor?

Finally, I'm basically using 3D light for a 2D game. Although it seems pretty simple in the implementation though. I'm told the Phong Reflection Model may be better suited in this case. Any thoughts on that?

Thanks in advance! Any help or tips on anything would be appreciated!