Server Help

Bot Questions - Racing plug-in... need guidance from gurus

Samapico - Tue Jun 19, 2007 7:41 pm
Post subject: Racing plug-in... need guidance from gurus
I'm making this racing plug-in for F1-type racing.
I want to be able to know the position (1st, 2nd...) of each racer during the race, at any time...

I've just thought of a solution that makes sense, but I was just wondering maybe you more experienced coders out there might have a better, or more efficient idea...

Basically I'll have to put a lot of checkpoints... atleast whenever the road changes angle

I already have code that identifies through which waypoint the player goes, and stacks them. If player goes through his last visited checkpoint (in reverse), it unstacks it.

In the checkpoint structure, I'd put an angle that indicates the angle of the following road segment.

Now to calculate a player's rank...
Pretty simple, basically its in order of number of checkpoints crossed... But if 2 have the same amount, they're in the same road segment. Knowing the angle of the road segment, it would be pretty easy to sort them according to their x,y coordinates.
I'm just not too sure about this part, how to sort them exactly (ideas?)... Since I check player by player, I guess the best thing to do would be a linkedlist, scroll through it, find the desired rank of the current player, delete the old node, and insert a new one where needed...

By the way I'm coding this for Merv

So emmm... Does it all makes sense?

Any help/hints appreciated

Thanks icon_smile.gif
Smong - Wed Jun 20, 2007 5:55 am
Post subject:
Assuming you have checkpoints on all the bends, all you need to do when 2 players are in the same segment is compare their distance from the last checkpoint. No need to directly compare player xy's and use the angle to make some weird rotation.

This solution might not work so well if the track was very wide.

Also I wouldn't count the number of checkpoints passed, simply the current lap # and the last checkpoint #. This means you don't have to worry about removing links when players go in reverse. Of course you would only update the "last checkpoint #" if it was greater than the old value, or the lap # had increased.
Witchie NL - Wed Jun 20, 2007 6:22 am
Post subject:
or add some checkpoints every 20? tiles and the first person to cross it gets position 1 2nd person gets pos 2 etc etc.
Mine GO BOOM - Wed Jun 20, 2007 10:38 am
Post subject:
Another option is to draw a polyline of the course, and find the player's shortest normal to that line. You then know his position on the line, and the line's total length. You now know how far he is in the course and how much is left.

This does fail if the course is soft (can run outside the track), but can correct for that by drawing border lines, and once a user crosses that, you can record his last known position on course. If he reenters the course too far away from where he left, you can know he tried to cheat the course and can warp him back to where he last left the course.
Samapico - Wed Jun 20, 2007 11:05 am
Post subject:
Quote:
Another option is to draw a polyline of the course, and find the player's shortest normal to that line. You then know his position on the line, and the line's total length. You now know how far he is in the course and how much is left.
How would you exactly 'draw a polyline' ? You need like... an array of points or something ?.o

The course is not soft... walls make a big metal crunching noise tongue.gif

I like smong's idea... You're right only the distance would work fine
Though I do have to unstack checkpoints, cause for example, if 2 players cross the same checkpoint... Player A stops there
Player B goes back 100 tiles in reverse
B's distance from 'last checkpoint #' will be greater than A's... So B's last checkpoint should also change when going back in reverse through checkpoints.
Anyways the stacking part for forward/reverse is already done

Only using the distance would be somewhat less accurate than if I know the angle of the road segment though... As you say it depends on the width of the track

Quote:
or add some checkpoints every 20? tiles and the first person to cross it gets position 1 2nd person gets pos 2 etc etc.
That's what I'm trying to avoid... I don't want to add a hundred checkpoints.

thanks, that gave me some more ideas
Mine GO BOOM - Wed Jun 20, 2007 11:46 am
Post subject:
Samapico wrote:
How would you exactly 'draw a polyline' ? You need like... an array of points or something ?.o

Exactly. The first point is the midpoint of the starting line, and each point is the next 'turn' of the course, always using the midpoint of the track. Thus, each set of two adjacent points is a line, including the last/first points.

You create a normal between the player's current position against each line created by the array, and determine the normal's length to that line. The shortest normal is the line the user is closest to.

Now that you know which line section he is at, you can determine his length along that line, because you have a direction that the track goes with that line. That gives you his length of that line, which you can add the length of all the previous lines to get his current distance in the course. Compare to the total length of the whole polyline, and you can determine his percent of the course completed for pretty displays/stats.

Since you are recording each point, you can always name each section as well with the polyline method. And example structure that you can use:
Code: Show/Hide
struct Point
{
   int x, y; //Obviously the X/Y coords of the point
   char name[50]; //The name of this section of the course
   int distance; //The sum of all previous lines (so don't need to recalc)
};
So you have a struct Point polyline[20] defined and filled in. polyline[0] -> polyline[1] would be the first line, with a distance of 0 in polyline[0], and a name of "First leg" or something. polyline[19] -> polyline[0] would have a distance of the total sum of all previous lines in polyline[19] with a name of "starting point" or "finishing line" if the course is looped. If the course isn't looped, polyline[19] would be the end of the course and it wouldn't loop.
Mine GO BOOM - Fri Jun 22, 2007 7:26 pm
Post subject:
Samapico wrote:
thanks, that gave me some more ideas

Give them a try yet? I never actually used the method I suggested, but would be what I would do in your situation. Be interested in knowing how it turned out if you tried it.
All times are -5 GMT
View topic
Powered by phpBB 2.0 .0.11 © 2001 phpBB Group