[ 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!?