Page 1 of 1
Сортировка тайлов по координатам?
Posted: 20.06.2011 11:20
by SuperPups
Добрый день!
Есть процедура, которая ищет несколько типов деревьев па площади 60х60 квадратов. Не удобность в том, что чар бегает от одного угла к другому, тем самым увеличивая время добычи ресурсов.
Code: Select all
Procedure CheckLumberTiles;
begin
totalSum := 0;
for i:=0 to 5 do begin
CheckTiles := GetStaticTilesArray(LumberX-SqFL, LumberY-SqFL, LumberX+SqFL, LumberY+SqFL, WorldNum, LumberTile[i], a);
if CheckTiles>0 then begin
for k:=0 to CheckTiles-1 do LTCoords[totalSum+k]:=a[k];
end;
totalSum:=totalSum+CheckTiles;
end;
end;
Как посортировать LTCoords, по Х или Y, чтобы чар ходил к ближайшему дереву? Нигде в примерах и мануалах ничего подобного не нашел
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 13:37
by Alex
тебе поможет
сортировка пузырьком, только её нужно модифицировать что бы переворачивал учитывая вторую координату
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 18:30
by shinma
о помню помню учили кадато сто лет назад сортировка матрицы методом пузырька там чото с J замута связана вспоминать лень. и так рубит нормаьно
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 18:34
by Alex
особых замут не должно быть, всего один if добавить надо в эту реализацию сортировки)
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 18:56
by shinma
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 19:30
by grundick
А я как-то иначе делал...Из центра(координаты чара) проверял все тайлы по спирали, нужные метил и уже спиралькой бегал и рубил.
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 20:01
by CFA
я делал массив структур с координатами и таймерами когда этот тайл был вырублен, и когда очередное дерево вырубалось полностью, искал ближайший тайл в котором логи уже реснулись. Впрочем это тоже не самый оптимальный вариант.
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 21:34
by SuperPups
Спасибо за помощь!
Я перебрал все предложенные варианты и даже просчитывал расстояние между двумя точками по цепочке. Но остановился на этом:
Code: Select all
for k:=0 to totalsum do begin
for i:=0 to totalsum-1 do begin
if LTCoords[i].X > LTCoords[i+1].X then begin
a[0].tile := LTCoords[i].tile;
a[0].X := LTCoords[i].X;
a[0].Y := LTCoords[i].Y;
a[0].Z := LTCoords[i].Z;
LTCoords[i].tile := LTCoords[i+1].tile;
LTCoords[i].X := LTCoords[i+1].X;
LTCoords[i].Y := LTCoords[i+1].Y;
LTCoords[i].Z := LTCoords[i+1].Z;
LTCoords[i+1].tile := a[0].tile;
LTCoords[i+1].X := a[0].X;
LTCoords[i+1].Y := a[0].Y;
LTCoords[i+1].Z := a[0].Z;
end;
end;
end;
for k:=0 to totalsum do begin
for i:=0 to totalsum-1 do begin
if LTCoords[i].X = LTCoords[i+1].X then begin
if LTCoords[i].Y > LTCoords[i+1].Y then begin
a[0].tile := LTCoords[i].tile;
a[0].X := LTCoords[i].X;
a[0].Y := LTCoords[i].Y;
a[0].Z := LTCoords[i].Z;
LTCoords[i].tile := LTCoords[i+1].tile;
LTCoords[i].X := LTCoords[i+1].X;
LTCoords[i].Y := LTCoords[i+1].Y;
LTCoords[i].Z := LTCoords[i+1].Z;
LTCoords[i+1].tile := a[0].tile;
LTCoords[i+1].X := a[0].X;
LTCoords[i+1].Y := a[0].Y;
LTCoords[i+1].Z := a[0].Z;
end;
end;
end;
end;
Сейчас оптимизирую код и будет все ОК!
Re: Сортировка тайлов по координатам?
Posted: 20.06.2011 21:53
by Vizit0r
Code: Select all
type
ArrayType = Array[0..100] of Cardinal;
var
StrubsList: TStringList;
A : ArrayType;
flag : Boolean;
i,j : Integer;
tempValue: Cardinal;
....
....
//сортировка пузырьковым методом
j := StrubsList.Count-1;
flag := True;
while ((j >= 1) and flag) do
begin
j := j - 1;
flag := False;
for i := 0 to j - 1 do
begin
if ((i < (StrubsList.Count -2)) and ((GetX(A[i]) > GetX(A[i+1])) or ((GetX(A[i]) = GetX(A[i+1])) and (GetY(A[i]) > GetY(A[i+ 1]))))) then
begin
tempValue := A[I];
A[I] := A[i+1];
A[i+1] := tempValue;
flag := True;
end
end
end
end;
//конец сортировки
выдрал с одного из своих допотопных скриптов (в те далекие времена, когда я их еще писал
)
автор не я, кто - не помню.
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 11:13
by Miralex
Сортировка врядле нужна, все делается гораздо проще:
Делаем ф-цию определения след. дерева в которой есть свой массив деревьев, которых еще не рубили. В ф-ции пробегаетесь по всему массиву и определяете ближайшее от текущих координат персонажа. Возвращаете скрипту координаты следующего дерева и удаляете его с массива. Если массив пустой - перегоняете в него с основного все координаты деревьев.
Принцип такой, что если персонаж периодически забегает на лодку (или кудато еще) скинуть важные доски - вы не будете возвращаться к след. в массиве дереву, а будете идти к ближайшему тоже ...
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 16:54
by Vizit0r
зачем делать массив деревьев, если можно определять их динамически?
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 16:58
by Fenix
Думается, в этом случае проще контролировать диапазон "лесозаготовки". А то ещё уйдет куда-нить, пока будет лес валить.
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 17:00
by Vizit0r
а куда-то ненадо, функция определения статики задается параметрами X1-Y1,X2-Y2, так что дальше заданного квадрата ничего не найдет, и соответственно не уйдет.
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 18:47
by Fenix
Ну так ведь нет особого смысла постоянно терзать GetStaticTilesArray, если можно все нужные данные единоразово выбрать в массив.
Re: Сортировка тайлов по координатам?
Posted: 21.06.2011 19:31
by Vizit0r
вобщем-то да, если файла нет - создаем автоматом, если есть - работаем с ним