Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Народ помогите новичку плиз!!!!   Найти похожие ветки 

 
Аболтус ©   (2003-01-25 21:22) [0]

Вот написал я такую штуку: Тыкаешь мышкой в форму и человечек идет размахивая руками и ногами к выбраной точке. НО при этом 2е проблемы:
1.Картинка которой я заменяю мышь т.е. не двигаеться пока идет цыкл хотьбы человечка.
2.Но сама мышь есть. Вот как сделать что б во время хотьбы человечка можно было тыкнуть в другое место и он пошел туда сразу, не доходя до своей первоначальной цели!?


 
Mihey   (2003-01-25 22:10) [1]

Ну так не цикл нужен, а хотя бы таймер.


 
Аболтус ©   (2003-01-26 23:30) [2]

Ну допустим таймер по событию OnTimer делаем шаг затем проверяем было ли нажатие мыши? А как? Тут наверное вопрос сводиться как проверить буфер мыши на наличе в нем данных?


 
Mihey   (2003-01-27 00:20) [3]

Не-а. Объекты это всё называется, вся концепция ООП. Ты пытаешься всё впихнуть в один цикл, в одну процедуру. А надо пользовтаься многопоточностью, т.е. возможность нескольких объектов выполняться одновременно.

Итак, у тебя есть обработчик события таймера - в нём ты передвигаешь человечка на некоторый шаг. Шаг - это и расстояние, на которое передвигаешь, и напрвление. В форме есть обработчик щелчка - при каждом щелчке ты исходя из текущих координат человечка и координат щелчка мыши считаешь новый шаг (всё сводится к высчитыванию напрвления) и присваиваешь его тому, с которым двигается человечек.


 
Alek Aaz ©   (2003-01-27 05:14) [4]

Сделай так:

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


 
Аболтус ©   (2003-01-27 11:20) [5]

Спасибо большое за подсказку. Но возник еще один вопрос а как избавиться от такой ситуации: По таймеру человечек идет а когда начинаешь водить мышкой то он останавливаеться и так до дех пор пока водишь мышью. А как сделать так что бы и мышь ездила и человечек шол?


 
Alek Aaz ©   (2003-01-27 12:03) [6]

Попробуй так:
В событие onMouseMove вставить строчку
Application.ProcessMessage;
Вообще понатыкай эту строчку во все процедуры и функции которые сваял для профилактики. Особенно внутрь циклов.


 
Mihey   (2003-01-27 14:57) [7]

Хех, циклы то где?


 
Аболтус ©   (2003-01-27 15:09) [8]

Не помогает :(((


 
Alek Aaz ©   (2003-01-27 17:53) [9]

Гони кусок кода, смотреть будем ... :)


 
Аболтус ©   (2003-01-27 22:20) [10]

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.

Вот сильно не ругайте... человечек ходит взад вперед. Какой конкретно кусок я не знал вроде все важно вот и вставил все.


 
cyborg ©   (2003-01-27 23:03) [11]

Это просто кошмар геймера, при каждом кадре грузить картинки!


 
Аболтус ©   (2003-01-28 01:35) [12]

Хотя на данном этапе это не принципиально но буду признателен если скажете как это дело оптимизировать и ускорить..........


 
Alek Aaz ©   (2003-01-28 04:01) [13]

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. Картинки грузить каждый раз из файла действительно круто. Но как по другому я пока не знаю :) Надо глянуть...


 
cyborg ©   (2003-01-28 10:49) [14]

Если совсем просто, то вначале загрзить все картинки, а потом их просто отображать, какая нужна, ту и показывать.


 
Аболтус ©   (2003-01-28 13:23) [15]

Ура!!! Работает!!! все ходит и ездит одновременно....только тормозит жутко :(( По поводу картинок.....нет нк можно объеденить их в одну и потом просто из зпгруженного файла выдергивать. А как быть с прозрачностью? Видите какой примитивный алгоритм!!! Можь кто знает как оптимизировать?


 
Alek Aaz ©   (2003-01-29 03:37) [16]

2cyborg Ты на примере ему покажи. Быстрее дойдет :)



Страницы: 1 вся ветка

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-44672
Луарвик
2003-07-02 15:36
2003.07.14
Check List Box


1-44633
killer
2003-07-02 00:03
2003.07.14
Как фотку перевести в строку?


1-44752
BOA_KAA
2003-07-01 16:29
2003.07.14
Как узнать, откуда запущена консольная программа?


1-44766
alois
2003-07-01 21:04
2003.07.14
Выделение двух равных подстрок в тексте


1-44657
Manfred
2003-07-02 11:24
2003.07.14
Вызов прцедур во время события OnCreate()