![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DelphiX и спрайты. [Delphi, DelphiX, Windows]
Jus © (2004-09-20 06:17:00)В DelphiX...
Например в случайных точках из за экрана появляются энное кол-во зомби TEnemy. Есть игрок TPla. Как в процедуре
Procedure TEnemy.DoMove(MoveCount:integer);
Begin
Inherited DoMove(MoveCount);
...
end;
записать чтоб все они шли к TPla?
ну типа как
Procedure TEnemy.DoMove(MoveCount:integer);
Begin
Inherited DoMove(MoveCount);
If X>TPla.X then x:=x-(100 div 60); //но только TPla сюда не канает
end;
можно конечно сделать глобальную переменную Var Pla_X,Pla_Y:Double;
а потом
Procedure TEnemy.DoMove(MoveCount:integer);
Begin
Inherited DoMove(MoveCount);
If X>PlaX then x:=x-1; // а без этого можно как нибудь обойтись?
end;
ещё вопрос. Как можно Integer превести в Double и на оборот?
cyborg (2004-09-20 10:10:00) [1]В строку:
FloatToString()
В целое:
Trunc()
Round()
Jus (2004-09-20 10:07:00) [2]Ну или хотябы Double в String и наоборот?
Jus (2004-09-20 10:06:00) [3]Мне нужно Integer превести в Double и на оборот. Как мне это сделать? помогите!)
Jus (2004-09-20 08:32:00) [4]Где взять ссылку на свежую инфу по делфиикс, только пообъемнее, не те, что заезженные. А ХОРОШУЮ.)
Jus (2004-09-20 08:09:00) [5]Servelat © (20.09.04 08:03) [3]
> var
> i: integer;
> ...
> for i:=0 to SE.Engine.Count-1 do
> begin
> if (SE.Engine.Items[i] is TUnit) then
> TUnit(SE.Engine.Items[i]).X:=10;
> end;
Спасибо!)
> ещё вопрос. Как можно Integer превести в Double и на оборот?
?
Servelat (2004-09-20 08:03:00) [6]Полный ответ: RTFM.
Краткий ответ:
> If X>TPla.X then x:=x-(100 div 60); //но только TPla сюда
> не канает
Как минимум 2 способа. Хранить ссылку на объект типа TPla. При создании:
var
Pla: TPla;
...
Pla:=TPla.Create(...);
with Pla do
begin
X:=...
Y:=...
//etc.
end;
Далее можно обращаться к полям объекта TPla:
if (Pla.X)>100 then
и т.п.
Однако, если объектов больше одного, хранить ссылки на них нецелесообразно (об этом твой пост № 1). Поэтому есть второй способ:
Спрайты, как это ни удивительно, нумеруются. Доступ к ним осуществляется через DXSpriteEngine.Engine (то, что ты им передал в качестве параметра при создании). Количество спрайтов можно определить так: SE.Engine.Count (при условии, что твой спрайтовый движок называется "SE"). Доступ к конкретному спрайту посредством SE.Engine.Items[Index]. Пример:
var
i: integer;
...
for i:=0 to SE.Engine.Count-1 do
begin
if (SE.Engine.Items[i] is TUnit) then
TUnit(SE.Engine.Items[i]).X:=10;
end;
В вышеприведенном коде идет цикл по всем спрайтам, и если текущий спрайт принадлежит классу TUnit, то его X приравнивается 10.
Таким же образом можно найти в этом списке спрайт класса TPla и обратится к его координатам.
ЗЫ код писал прямо тут, так что могут быть незначительные очепятки/ошибки :) .
Jus (2004-09-20 07:48:00) [7]тишина...(
Наверное единственный способ это
enemy:array[0..5] of TEnemy;?
Jus (2004-09-20 06:29:00) [8]Ещё вопрос.
Создал я TUnit( к примеру , боевая еденица)
TUnit=class(Sprite: Tsprite)
procedure DoMove(...
procedure DoCollision(...
public
Constructor Create(AParent:TSprite); override;
end;
В процессе программы я создам ещё к примеру 5 TUnit-ов и как мне обращатся к скажем 2-му юниту чтоб он шёл в выбронную мной позицию, ведь пойдут все TUnitы т.к. поля X и Y есть у всех них.
Существует ли индексация этих самых Тспрайтов? Если да то как?
Может в Constructore Create вставить переменную(индекс) чтоли какимто образом:(