Форум: "Игры";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];
Вниз
Народ помогите новичку плиз!!!! Найти похожие ветки
← →
Аболтус (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c