[Gambas-user] gb3: sorting an array-like structure

Kevin Fishburne kevinfishburne at ...1887...
Tue May 10 02:27:53 CEST 2011


On 05/05/2011 07:50 AM, Fabien Bodard wrote:
> 2011/5/5 Kevin Fishburne<kevinfishburne at ...1887...>:
>> On 05/05/2011 06:31 AM, Fabien Bodard wrote:
>>> We use that to sort icons in the iconview component
>>>
>>> take a look in the source
>>>
>>> trunk/comp/gb.form
>>>
>>> IconView.class
>>>
>
>
> it depend what you want to  sort !!!
>
> say us please
>
> and more simply
>

Alright. Basically I have an array of structures. Each structure 
represents an object in the game world. Each frame/loop I examine all 
the objects' coordinates to determine which ones are inside the 
rendering area. Finally the visible objects' positions are rotated to 
match the orientation of the player and rendered to the screen.

I need to maintain an index of the objects' rotated y coordinates and 
sort it. It will only be sorted when the player changes orientation (or 
if an object is moved by another player or physics). I need to know the 
order that each object should be rendered in so that they overlap 
properly. Rendering them in order by their post-rotated y coordinate 
should accomplish this.

Right now objects are drawn in the order they appear in the array of 
object structures (random relative to their world coordinates). It needs 
to change dynamically based on player orientation and each object's 
coordinates. You can see the results of unsorted object rendering in 
this video:

http://www.youtube.com/watch?v=HpvIcGYHVLY

Sometimes rocks are behind the trees, sometimes they are in front. It's 
a mess.

The player and other players' positions will also have to be added into 
this array of object numbers and y coordinates. I'd prefer to maintain a 
separate array, which will hopefully be faster than sorting the entire 
array of object structures. The hypothetical array to be sorted would 
look something like this:

Public RenderOrder[32767, 2] As Single ' [ObjectsTotal, 0 = 
ObjectNumber, 1 = ObjectY]

The array would be sorted by ObjectY, or RenderOrder[x, 1]. An example 
of before/after values would look like this:

Unsorted/Before:
RenderOrder[0, 0] = 10   ' Object 10
RenderOrder[0, 1] = 6000 ' Object 10 Y coordinate
RenderOrder[1, 0] = 20   ' Object 20
RenderOrder[1, 1] = 2000 ' Object 20 Ycoordinate

Sorted/After:
RenderOrder[0, 0] = 20   ' Object 20
RenderOrder[0, 1] = 2000 ' Object 20 Y coordinate
RenderOrder[1, 0] = 10   ' Object 10
RenderOrder[1, 1] = 6000 ' Object 10 Ycoordinate

Think of it like a spreadsheet instead of an array. I need each "row" 
sorted by the value in a "column". The two column values are 
ObjectNumber and ObjectY and the row represents the array index.

There's got to be something like this in GAMBAS, but if not I can start 
Google searching sort algorithms and make a procedure.

-- 
Kevin Fishburne
Eight Virtues
www: http://sales.eightvirtues.com
e-mail: sales at ...1887...
phone: (770) 853-6271





More information about the User mailing list