![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Народ помогите новичку плиз!!!! [Delphi, Windows]
Аболтус © (2003-01-25 21:22:00)Вот написал я такую штуку: Тыкаешь мышкой в форму и человечек идет размахивая руками и ногами к выбраной точке. НО при этом 2е проблемы:
1.Картинка которой я заменяю мышь т.е. не двигаеться пока идет цыкл хотьбы человечка.
2.Но сама мышь есть. Вот как сделать что б во время хотьбы человечка можно было тыкнуть в другое место и он пошел туда сразу, не доходя до своей первоначальной цели!?
Alek Aaz (2003-01-29 03:37:00) [1]2cyborgТы на примере ему покажи. Быстрее дойдет :)
Аболтус (2003-01-28 13:23:00) [2]Ура!!! Работает!!! все ходит и ездит одновременно....только тормозит жутко :(( По поводу картинок.....нет нк можно объеденить их в одну и потом просто из зпгруженного файла выдергивать. А как быть с прозрачностью? Видите какой примитивный алгоритм!!! Можь кто знает как оптимизировать?
cyborg (2003-01-28 10:49:00) [3]Если совсем просто, то вначале загрзить все картинки, а потом их просто отображать, какая нужна, ту и показывать.
Alek Aaz (2003-01-28 04:01:00) [4]procedure TForm1.PaintBox1MouseMove(Sender: TObject
^^^^^^^^^^^^^^^^^^
1. НЕMOUSEMOVE a MOUSECLICKили MOUSEDuableCLICK ! Именно по этому пока ездишь мышой он стоит.
2. Sleep не нужен. У тебя таймер. Сколько надо задержки столько и ставишь.
3. Всю хотьбу перепиши в процедуру. Скажем MoveXY(x,y); Тогда в Timer1Timer будет только одна процедура MoveXY. Это нужно, если захочешь сделать шаг человечком в какой - нибудь другой части программы.
4. Если ты все-таки хочешь чтобы человечек следовал за курсором попробуй в MouseMove поставить строчку Application.ProcessMessage, если не поможет - MoveXY (Хотя, ИМХО, он может начать двигаться не правильно, то быстро, когда возить будешь мышкой, то медленно, когда будет отрабатывать таймер), если это так тогда придется ставить другой таймер :(, из RxLib, DelphiX, или GLScene.
5. Картинки грузить каждый раз из файла действительно круто. Но как по другому я пока не знаю :) Надо глянуть...
Аболтус (2003-01-28 01:35:00) [5]Хотя на данном этапе это не принципиально но буду признателен если скажете как это дело оптимизировать и ускорить..........
cyborg (2003-01-27 23:03:00) [6]Это просто кошмар геймера, при каждом кадре грузить картинки!
Аболтус (2003-01-27 22:20:00) [7]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, JPEG;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Timer1: TTimer;
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure PaintBox1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Procedure Copy (B,B1,B2,S1:TBitMap; Output:TPaintBox);
var
Form1: TForm1;
B,B1,B2:TBitMap;
S1,S2:TBitMap;
N:TRect;
Gx,Gy,MoveX,NPic:Integer;
implementation
{$R *.DFM}
Procedure Copy(B,B1,B2,S1:TBitMap; Output:TPaintBox);//процедура перерисовки
var
i,j,X,Y:integer;
N,N2:TRect;
begin
X:=50;
Y:=50;
N:=Rect(0,0,800,600);
N2:=Rect(0,0,320,240);
B1.Height:=600;
B1.Width:=800;
B1.Canvas.BrushCopy(N,B2,N2,RGB(0,0,255));
For i:=1 to 39 do
begin
For j:=1 to 63 do
begin
IF S1.Canvas.Pixels[i,j] < RGB(0,0,150) then
B1.Canvas.Pixels[i+MoveX,j+300]:=S1.Canvas.Pixels[i,j];
end;
end;
i:=0;
j:=0;
Repeat
If i = X then
begin
i:=0;j:=j+1;
end;
IF B.Canvas.Pixels[i,j] < RGB(0,0,150) then
B1.Canvas.Pixels[i+Gx,j+Gy]:=B.Canvas.Pixels[i,j];
i:=i+1;
until ((i = X) and (j = Y-1));
Output.Canvas.CopyRect(N,B1.Canvas,N);
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Gx:=X;
Gy:=Y;
Copy(B,B1,B2,S1,PaintBox1);
end;
procedure TForm1.FormCreate(Sender: TObject);//Сдесь мы создаем все битмапы и
begin //загружаем изначальные картинки
B:=TBitmap.Create;
B1:=TBitmap.Create;
B2:=TBitmap.Create;
S1:=TBitmap.Create;
S2:=TBitmap.Create;
B.LoadFromFile(GetCurrentDir+"\pic\arrow.bmp");
B2.LoadFromFile(GetCurrentDir+"\pic\Back1.bmp");
S1.LoadFromFile(GetCurrentDir+"\Steps\1.Bmp");
Form1.Cursor:=crnone;
Copy(B,B1,B2,S1,Form1.PaintBox1);
end;
procedure TForm1.PaintBox1Click(Sender: TObject);
begin
NPic:=1; //Это номер вставляемой картинки
Timer1.Enabled:=True;
end;
procedure TForm1.Timer1Timer(Sender: TObject); //А вот это основное!
Var //Сама хотьба
Ind:String;
V:Integer;
begin
V:=0;
If Gx > MoveX then //проверяем вперед или назад
begin
V:=10;
ind:="";
end;
If Gx < MoveX then //проверяем вперед или назад
begin
V:=-10;
ind:="b";
end;
Inc(NPic);
Copy(B,B1,B2,S1,PaintBox1);
S1.LoadFromFile(GetCurrentDir+"\steps\"+IntToStr(NPic)+Ind+".bmp");
If NPic = 6 then NPic:=0;
MoveX:=MoveX+V;
Sleep(100);
If (V = 10) and (Gx < MoveX) then //проверяем достигнут ли маршрут
begin
Timer1.Enabled:=False;
S1.LoadFromFile(GetCurrentDir+"\Steps\1"+Ind+".bmp");
end;
If (V = -10) and (Gx > MoveX) then //проверяем достигнут ли маршрут
begin
Timer1.Enabled:=False;
S1.LoadFromFile(GetCurrentDir+"\Steps\1"+Ind+".bmp");
end;
end;
end.
Вот сильно не ругайте... человечек ходит взад вперед. Какой конкретно кусок я не знал вроде все важно вот и вставил все.
Alek Aaz (2003-01-27 17:53:00) [8]Гони кусок кода, смотреть будем ... :)
Аболтус (2003-01-27 15:09:00) [9]Не помогает :(((
Mihey (2003-01-27 14:57:00) [10]Хех, циклы то где?
Alek Aaz (2003-01-27 12:03:00) [11]Попробуй так:
В событие onMouseMove вставить строчку
Application.ProcessMessage;
Вообще понатыкай эту строчку во все процедуры и функции которые сваял для профилактики. Особенно внутрь циклов.
Аболтус (2003-01-27 11:20:00) [12]Спасибо большое за подсказку. Но возник еще один вопрос а как избавиться от такой ситуации: По таймеру человечек идет а когда начинаешь водить мышкой то он останавливаеться и так до дех пор пока водишь мышью. А как сделать так что бы и мышь ездила и человечек шол?
Alek Aaz (2003-01-27 05:14:00) [13]Сделай так:
Var Cel_x,Cel_y:Integer или что там у тебя
Procedure GoToCel(x,y:integer);
Begin
Здесь твоя процедура хоьбы, но только на один шаг к точке X,Y.
End;
Procedure Form1Timer1 .... всякая белиберда...
Begin
GoToCel(Cel_x,Cel_y);
End;
Procedure Form1MouseClick .... всякая белиберда...
Begin
Cel_x:= как ты там определяешь положение новой точки
Cel_y:= как ты там определяешь положение новой точки
End;
Прицедуру GoToCel пишешь ручками. Заголовки и пустое тело процедур начинающихся на Form1 генерятся Делфи когда дважды кликнешь на методах объекта в ObjectInspeкtore. Для Timer1 событие onTimer, для мыша объект - Form1, событие onMouseClick
Mihey (2003-01-27 00:20:00) [14]Не-а. Объекты это всё называется, вся концепция ООП. Ты пытаешься всё впихнуть в один цикл, в одну процедуру. А надо пользовтаься многопоточностью, т.е. возможность нескольких объектов выполняться одновременно.
Итак, у тебя есть обработчик события таймера - в нём ты передвигаешь человечка на некоторый шаг. Шаг - это и расстояние, на которое передвигаешь, и напрвление. В форме есть обработчик щелчка - при каждом щелчке ты исходя из текущих координат человечка и координат щелчка мыши считаешь новый шаг (всё сводится к высчитыванию напрвления) и присваиваешь его тому, с которым двигается человечек.
Аболтус (2003-01-26 23:30:00) [15]Ну допустим таймер по событию OnTimer делаем шаг затем проверяем было ли нажатие мыши? А как? Тут наверное вопрос сводиться как проверить буфер мыши на наличе в нем данных?
Mihey (2003-01-25 22:10:00) [16]Ну так не цикл нужен, а хотя бы таймер.