|
[ Nemanja Avramović @ 12.01.2005. 19:25 ] @
| 1) Kako da napravim Timer u runtime-u. Kaze [Error] AnimBckgnd.pas(50): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter' kad pokusam da stavim obicnu proceduru na OnTimer. Molio bih primer (malo code tagova :)
2) Imam tekstualni fajl koji ovako izgleda:
Code:
111
1 1
111
Zanima me kako citanjem slovo po slovo da mi kreira dinamicki niz slika ovako poredjanih:
Code:
----------------------
| | | |
| | | |
----------------------
| | | |
| | | |
----------------------
| | | |
| | | |
----------------------
(sve kockice treba iste velicine da budu : kockice=slike{TImage})
...s tim da se u polju 5 (srednja kockica) ne pojavi slika (na mestu space-a da se nista ne pojavljuje ali da odvaja toliku razdaljinu, kao za sliku)... evo sta sam ja skrabao (nedostaje glavni deo)...
Code:
function LoadWorld(matrix_file,bitmap_extension:string;block_width,block_height:integer;parent:TForm):boolean;
var
//array of images which represents blocks
blocks:array of TImage;
//variables for filesize
nSize:integer;
hfile:thandle;
strSize:string;
//variables for loading into buffer
p:char;
buffer:string;
a:textfile;
//for going through matrix
loop:integer;
trenutni_red,trenutna_kolona:integer;
begin
//suppose that there was error
Result:=false;
//get file size
hfile:=CreateFile(pchar(matrix_file),0,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
nSize:=GetFileSize(hfile,nil);
CloseHandle(hfile);
SetLength(strSize,20);
Str(nSize,strSize);
//set number of blocks to filesize (that's max)
SetLength(blocks,StrToInt(strSize));
//load file into buffer
assignfile(a,matrix_file);
reset (a);
while not Eof(a) do
begin
Read(a, p);
buffer:=buffer+p;
end;
closefile(a);
//now we need to go through matrix and to create images
trenutni_red:=1;
trenutna_kolona:=1;
for loop:=1 to Length(buffer) do begin
//izmedju ostalog, if buffer[loop]<>' ' then kreiraj blok
end;
end;
...ne znam zasto volim da komentujem na engleskom :)
p.s. posle ovoga bi jednostavni...
LoadWorld('test.mtx','img',20,20,Form1);
...vrsio posao...
p0zdrav i hvala unapred
|
[ bancika @ 12.01.2005. 20:52 ] @
za prvo ne znam...
za drugo samo ukratko.
Code:
var Slike: array [1..10, 1..10] of TImage;
for i := 1 to BrojVrsta do
for j := 1 to BrojKolona do
begin
Read(F, C);
if C = '1' then
begin
Slike[i, j] := TImage.Create(Form1);
Slike[i, j].Parent := Form1;
Slike[i, j].Width := 100;
Slike[i, j].Height := 100;
Slike[i, j].Left := (i-1)*100;
Slike[i, j].Top := (j-1)*100;
//ovde nacrtaj nesto po slici
end;
//...na kraju
for i := 1 to BrojVrsta do
for j := 1 to BrojKolona do
if Assigned(Slike[i, j]) then Slike[i,j].Free
btw, i ja volim komentare na engleskom
pozdrav
[ reiser @ 12.01.2005. 23:26 ] @
Postuj liniju u kojoj dodeljujes odredjenu proceduru na OnTimer event. Ovako mozemo samo da nagadjamo.
Dodeljivanje procedure bi mislim trebalo Timer1.OnTimer := @NekaProcedura. A NekaProcedura :
Code:
procedure TForm1.NekaProcedura(Sender: TObject);
begin
...
end;
[ _v!rus_ @ 13.01.2005. 02:11 ] @
Citat:
Timer1.OnTimer := @NekaProcedura
Samo bez @.
A za sta ti to treba, jeli JaHvrame? ;-)
[ Nemanja Avramović @ 13.01.2005. 13:45 ] @
probao sam sa Timer1.OnTimer := NekaProcedura; i daje onu gresku. Kaze ne moze procedura, mora TNotifyEvent... :(
a sta ce mi... ma nesto za onaj engine :P (salim se)
[ sasas @ 13.01.2005. 14:02 ] @
Procedura ti mora biti clan klase (TForm, recimo) i mora imati parametar (Sender: TObject).
Tako ti je procedura postala TNotifyEvent :)
Evo ti i malo kooda:
Code:
procedure TForm1.BlaBla(sender:TObject);
begin
ShowMessage('sale');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.OnTimer := BlaBla;
end;
ss.
[ Voodoo @ 13.01.2005. 15:42 ] @
Mislim da bi uništavanje dinamički kreiranih objekata trebalo da se vrši u obrnutom redosledu (tj. od poslednjeg kreiranog). Znam da meni nije htelo kad sam radio od prvog do zadnjeg...
[ Nemanja Avramović @ 14.01.2005. 16:26 ] @
ali kako da bude u klasi TForm kad se radi o UNIT-u i tamo nema formova :(
edit: @bancika - a kako da izvalim kad je kraj reda sa onim tvojim kodom?
[ _v!rus_ @ 14.01.2005. 17:23 ] @
Mislim da to nije bitno, mislim da je samo bitno da se procedura kvalifikuje kao TNotifyEvent po broju i tipu parametara, ali nisam probao
(jer TNotifyEvent je procedure of object, like ANY object).
[ _v!rus_ @ 14.01.2005. 17:35 ] @
Evo ti kompletan kod (koji radi):
Code:
unit MyClass;
interface
uses
Classes, ExtCtrls;
type
TMyClass = class
MyTimer: TTimer;
private
MyOwner: TComponent;
procedure DoSomething(Sender: TObject);
public
constructor Create(AOwner: TComponent);
end;
implementation
{ TMyClass }
constructor TMyClass.Create(AOwner: TComponent);
begin
MyOwner := AOwner;
MyTimer := TTimer.Create(MyOwner);
MyTimer.OnTimer := DoSomething;
//MyTimer.Interval := 10;
//MyTimer.Enabled := True;
end;
procedure TMyClass.DoSomething(Sender: TObject);
begin
//Do Timed Something...
end;
end.
[ sasas @ 14.01.2005. 22:51 ] @
Citat: _v!rus_: ...mislim da je samo bitno da se procedura kvalifikuje kao TNotifyEvent po broju i tipu parametara, ...
(jer TNotifyEvent je procedure of object, like ANY object).
Upravo tako, ja sam TForm stavio kao primer, stvar je samo u prenosu parametara.
ss.
[ Nemanja Avramović @ 15.01.2005. 12:30 ] @
ok, uspeo sam ono za timer, i skapirao sam sad kako to ide. Hvala (pogledajte attach)
ono za slike nisam ni probao jer je za novi red #13 pa #10, tako? e sad, kako to u kodu da... bla bla :)
[ bancika @ 15.01.2005. 12:47 ] @
ako znas dimenzije matrice onda nije problem:
Code:
for i := 1 to n do
begin
for j := 1 to m do
Read(F, a[i,j]);
ReadLn(F); //prelaz u novi red, preskace #10 i #13
end;
a ako ne znas onda
Code:
i := 0;
while not Eof(F) do
begin
Inc(i);
ReadLn(F ,s); //s: string;
for j := 1 to Length(s) do
a[i, j] := s[j]l
end;
pozdrav
[ Nemanja Avramović @ 15.01.2005. 14:52 ] @
e, to mi je trebalo... valjda :)
probacu pa javljam kasnije... veceras... sutra...
[ Nemanja Avramović @ 15.01.2005. 16:35 ] @
ono mi nije odgovaralo, pa sam zasuko rukave :)
evo skoro gotove funkcije:
Code:
function LoadWorld(matrix_file,graphics_directory,bitmap_extension:string;x,y,block_width,block_height:integer;parent:TForm):boolean;
var
//array of images which represents blocks
blocks:array of TImage;
//variables for filesize
nSize:integer;
hfile:thandle;
strSize:string;
//variables for loading into buffer
p:char;
buffer:string;
a:textfile;
//for going through matrix
loop:integer;
trenutni_red,trenutna_kolona:integer;
begin
//suppose that there was error
Result:=false;
//get file size
hfile:=CreateFile(pchar(matrix_file),0,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
nSize:=GetFileSize(hfile,nil);
CloseHandle(hfile);
SetLength(strSize,20);
Str(nSize,strSize);
//set number of blocks to filesize (that's max)
SetLength(blocks,StrToInt(strSize));
//load file into buffer
assignfile(a,matrix_file);
reset(a);
while not Eof(a) do
begin
Read(a, p);
buffer:=buffer+p;
end;
closefile(a);
//now we need to go through matrix and to create images
trenutni_red:=0;
trenutna_kolona:=0;
for loop:=1 to Length(buffer) do begin
//increase column on every step
Inc(trenutna_kolona);
//when reach #13#10 (eoln) then reset column and increase row
if buffer[loop]+buffer[loop+1] = #13#10 then begin
trenutna_kolona:=0;
Inc(trenutni_red);
end;
//now create images
if (buffer[loop] <> ' ') and (buffer[loop] <> #13) and (buffer[loop] <> #10) then begin
blocks[loop] := TImage.Create(parent);
blocks[loop].Parent := parent;
blocks[loop].Width := block_width;
blocks[loop].Height := block_height;
if (trenutni_red = 0) and (trenutna_kolona = 0) then begin
blocks[loop].Left := x;
blocks[loop].Top := y;
end else begin
blocks[loop].Left := trenutna_kolona * block_width;
blocks[loop].Top := trenutni_red * block_height;
end;
blocks[loop].Transparent := true;
blocks[loop].AutoSize := false;
blocks[loop].Stretch := true;
blocks[loop].Visible := true;
blocks[loop].Picture.RegisterFileFormat(bitmap_extension,'Bitmap file',TBitmap);
if graphics_directory <> '' then blocks[loop].Picture.LoadFromFile(graphics_directory+'\'+buffer[loop]+'.'+bitmap_extension)
else blocks[loop].Picture.LoadFromFile(buffer[loop]+'.'+bitmap_extension);
end;
end;
end;
e, problem je sto mi je prvi red uvucen za jedan blok (dodam space u prvom redu mtx fajla i problem resen) i drugi problem: ne slusa me :) tj. ne postavlja matricu slika gde ja hocu (zadato u pozivu funkcije:0,0) vec ga baci ko zna gde
pogledati attach (i ispraviti ako je moguce)
[ reiser @ 15.01.2005. 17:01 ] @
Mnogo si zakomplikovao u ovoj funkciji gore... Okacicu ovde malo kasnije novu fju.
Jedno pitanje - da li je neophodno da kreiras onoliko TImage objekata koliko je zapisano u mtx fajlu ?
[ reiser @ 15.01.2005. 18:00 ] @
Code:
procedure LoadWorld(matrix_file, graphics_directory, bitmap_extension : String;
X, Y, block_width, block_height : Integer;
target : TImage);
var
srcbmp : TBitmap;
SFile : TextFile;
FLine : String;
C1 : Integer;
YC : Integer;
begin
If (graphics_directory <> '') and
(graphics_directory[Length(graphics_directory)] <> '\') Then
graphics_directory := graphics_directory + '\';
srcbmp := TBitmap.Create;
srcbmp.Transparent := TRUE;
YC := 0;
target.Width := 0;
target.Height := 0;
AssignFile(SFile, matrix_file);
Reset(SFile);
While not Eof(SFile) Do
Begin
ReadLn(SFile, FLine);
Inc(YC);
If target.Width < Length(FLine) * block_width Then
target.Width := Length(FLine) * block_width;
If target.Height < YC * block_height Then
target.Height := YC * block_height;
For C1 := 1 to Length(FLine) Do
If (FLine[C1] <> ' ') and
(FileExists(graphics_directory + FLine[C1] + '.' + bitmap_extension)) Then
Begin
srcbmp.LoadFromFile(graphics_directory + FLine[C1] + '.' + bitmap_extension);
srcbmp.TransparentColor := srcbmp.Canvas.Pixels[0, 0];
target.Canvas.Draw((X + C1 - 1) * block_width, (Y + YC - 1) * block_width, srcbmp);
srcbmp.FreeImage;
End;
End;
CloseFile(SFile);
srcbmp.Free;
end;
Evo nove procedure. Sve se crta na jednom TImage objektu. Elem, ima jedna greska - u linijama If target.Height < YC * block_height Then i target.Height := YC * block_height; se podesava visina slike... I posle izlaska iz procedure visina slike je dobra, ali ne znam zasto nece da se vidi kako treba...
Radio sam arkanoid pre godinu-dve na veoma slican nacin kao ovaj tvoj, ako zelis mogu da nadjem source pa da ti posaljem na mail.
[ Nemanja Avramović @ 15.01.2005. 22:27 ] @
pa ja sam mislio na odvojene slike zbog prostora izmedju slika gde su space-ovi - zbog collision-a (ako se tako pise)
posalji i arkanoid source na avramyu at gmail dot com
sto se ovoga tice mislim da bi bolje bilo sa vise slika... neka nova ideja za detekciju sudara sa zidovima?
[ Nemanja Avramović @ 16.01.2005. 10:31 ] @
ovako sam ga pomerio ulevo, ali nije to to :)
Code:
...
blocks[loop].Left := (trenutna_kolona * block_width) - (block_width * 2);
..
ali ovim mi otpada x i y pozicioniranje vec ostaje samo 0,0 :(
mozda da radim sa frame-ovima?
[ reiser @ 16.01.2005. 11:37 ] @
Bug oko pozicioniranja slika mozes resiti tako sto ces liniju Inc(trenutna_kolona); pomeriti pred kraj for petlje. (znaci posle kreiranja slicica)
Kasnije cu ti poslati arkanoid (samo da nadjem source), i sam sam u pocetku mislio da je najbolje raditi sa TImage, ali kad sam imao preko 70-tak kreiranih slicica cela igra je radila sporo... Onda sam presao na PaintBox, i na kraju sam zakljucio da je najbolje da radim preko DirectX-a, pa sam odustao :)
[ Nemanja Avramović @ 16.01.2005. 18:13 ] @
premestao sam Inc i nije radilo :(
I ja bih radio sa DX-om ali sve sve sve sto sam nasao do sada nije radilo za D6...... ili je bilo ekstra komplikovano
e, ja sam se zezao kod detekcije sudara sa ovim:
Code:
function ImagesIntersect(IImage1,IImage2:TImage):boolean;
{ uses ExtCtrls }
var region_prve,region_druge,nepotrebni_rect:TRect;
begin
//kreiramo nevidljive pravougaonike preko slika
region_prve:=Rect(IImage1.Left, IImage1.Top, IImage1.Left+IImage1.Width, IImage1.Top+IImage1.Height);
region_druge:=Rect(IImage2.Left, IImage2.Top, IImage2.Left+IImage2.Width, IImage2.Top+IImage2.Height);
//funkcijom za gledanje da li se rect-ovi preklapaju, vracamo rezultat
Result:=IntersectRect(nepotrebni_rect,region_prve,region_druge);
//by Avram, avramyu ATAT gmail DOTDOT com
end;
moze mala pomoc kako to ubaciti u jedan for kojim ce se proci kroz sve slike i detektovati da li se neka nova slika (Player, isto TImage) sudara sa bilo kojim blokom zida?
[ Nemanja Avramović @ 26.01.2005. 18:29 ] @
evo ja se malo vratio ovome, cisto radi rekreacije... moze mi li iko proveriti ovaj kod, i zasto ne radiiiiiiiii!?
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|