Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
1-44737
Soft
2003-07-01 13:19
2003.07.14
Как смапировать файл в память


3-44553
Balu
2003-06-19 19:17
2003.07.14
Помогите разобраться с кодировкой


1-44681
Alles
2003-06-30 16:38
2003.07.14
русский - автомат


7-44929
Scrach
2003-05-04 03:07
2003.07.14
Есть индентификатор процесса (PID), дискриптор процесса (Handle)


1-44734
MARcoDEN
2003-06-30 13:00
2003.07.14
Координаты пункта меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский