IPB
ЛогинПароль:

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Оптимизация алгоритма, Помогите устранить тормоза в игре!
сообщение
Сообщение #21


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской

Репутация: -  0  +


Переписываю мышь в ООП =) Написал с использованием BMP, но не пойму, где ошибка( Мужики, помогите! Почему не работает?
Uses Graph,Crt,Bmp;
Const m=18;
n=18;
Mouses=10;
Type
MouseData=Record
x,y: Integer;
End;
Data=Array[1..m,1..n] Of Integer;
TMouse=Object
Public
Constructor Init(MousePath,KillPath: String; xC,yC: Integer);
Destructor Done;
Function Work: Boolean;
Function xW: Integer;
Function yW: Integer;
Procedure DrawMouse;
Private
x,y: Integer;
Mouse,Kill: String;
Working: Boolean;
End;
Constructor TMouse.Init(MousePath,KillPath: String; xC,yC: Integer);
Begin
Mouse:=MousePath;
Kill:=KillPath;
x:=xC;
y:=yC;
Working:=True;
End;
Destructor TMouse.Done;
Begin
BMPDisplay(Kill,x,y,False);
Delay(10000);
BMPDisplay(Kill,x,y,True);
Working:=False;
End;
Function TMouse.Work: Boolean;
Begin
Work:=Working;
End;
Function TMouse.xW: Integer;
Begin
xW:=x;
End;
Function TMouse.yW: Integer;
Begin
yW:=y;
End;
Procedure TMouse.DrawMouse;
Begin
BMPDisplay(Mouse,x,y,False);
End;
Var Mas: Array[1..Mouses] Of ^TMouse;
i,GD,GM,xT,yT: Integer;
Function RandCoord(Coord: Char): Integer;
Var z,i: Integer;
Flag: Boolean;
Begin
If Coord='x' Then {m}
Begin
Repeat
Flag:=True;
z:=Random(640);
For i:=1 To Mouses Do
If (ABS(z-Mas[i]^.xW))<20 Then
Begin
Flag:=False;
Break
End;
Until (z<622) AND Flag AND ((z<280) Or (z>360));
End;
If Coord='y' Then {n}
Begin
Repeat
Flag:=True;
z:=Random(480);
For i:=1 To Mouses Do
If (ABS(z-Mas[i]^.yW))<20 Then
Begin
Flag:=False;
Break
End;
Until (z<462) AND Flag AND ((z<200) Or (z>280));
End;
RandCoord:=z;
End;
Begin
GD:=Detect;
InitGraph(GD,GM,'');
Randomize;
Repeat
Repeat i:=Random(Mouses) Until i>0;
If Mas[i]^.Work Then
Begin
Mas[i]^.Done
End
Else
Begin
xT:=RandCoord('x');
yT:=RandCoord('y');
Mas[i]^.Init('Mouse.bmp','Kill.bmp',xT,yT);
Mas[i]^.DrawMouse;
End;
Delay(65535);
Until KeyPressed;
End.

Модуль BMP Прикрепленный файл  BMP.PAS ( 4.8 килобайт ) Кол-во скачиваний: 252

Мышки Прикрепленный файл  Mouse.bmp ( 346 байт ) Кол-во скачиваний: 285
Прикрепленный файл  kill.bmp ( 346 байт ) Кол-во скачиваний: 311
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Гость






Цитата(pashist @ 30.07.2006 20:53)
Переписываю мышь в ООП =) Написал с использованием BMP, но не пойму, где ошибка( Мужики, помогите! Почему не работает?
Потому, что ты некорректно работаешь с указателями на объекты... Здесь:
  If Mas[i]^.Work Then ...
формально ты допускаешь грубую ошибку - пытаешься обратиться к переменной объекта, который, возможно, еще не инициализирован. Если твой Object будет содержать виртуальные методы (а то, что ты использовал Constructor - первый шаг к этому), то программа просто вылетит у тебя при первой же попытке выполнения вышеприведенной строки. Да и сама инициализация объектов хромает... Вот так попробуй:
Type
PTMouse = ^TMouse;

Begin
GD:=Detect;
InitGraph(GD,GM,'');
Randomize;
Repeat
Repeat i:=Random(Mouses) Until i>0;
If Mas[i] <> nil then Begin
Dispose(Mas[i], Done); { Это - корректный вызов деструктора }
Mas[i] := nil;
End
Else Begin
xT:=RandCoord('x');
yT:=RandCoord('y');

{ А вот это - правильная инициализация }
Mas[i] := New(PTMouse, Init('Mouse.bmp','Kill.bmp',xT,yT));
Mas[i]^.DrawMouse;
End;
Delay(65535);
Until KeyPressed;
End.


Все остальное - без изменений...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Новичок
*

Группа: Пользователи
Сообщений: 44
Пол: Мужской

Репутация: -  0  +


volvo, спасибо большое! Ты очень мне помог smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 18.12.2017 12:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"