@Elmer-Davez
Citat:
Kad pokrenem editor za snake ne pojavi mi se odma status bar, nego tek kad stisnem na "Editor" na mejn meniju. Ne znam da li je to do mog kompa ili do delphija ali javi mi da li se to i tebi desava na ovoj igrici koju sam okacio tu.
Kad iskompajliram tvoj kod u Delphi 2007 tog problema vise nema, ali se polja ne icrtavaju kad kliknem na njima (nisam mnogo zagledao, ali ima veze sa DoubleBuffered := True)
Citat:
Kako da uklonim ekstenziju u TFileListBox, tj. da mi ne pise ono .dat, a da prikaze samo fajlove koji su .dat
Nisam bas najbolje razumeo pitanje jer ekstenzija moze da se vidi na 3 mesta... u listi gde su fajlovi, u polju gde mozes da ukucas naziv fajla i u combo box-u iz kojeg mozes da biras filter. Ako je problem sa listom u kojoj se nalaze fajlovi, to je zato sto ti je u explorer-u podeseno da se prikazuju ekstenzije, ako moras da upises *.dat u polju gde mozes uneti ime fajla, znaci da nisi izabrao filter koji ce ti prokazati samo *.dat fajlove, ako ti se u combo box-u vidi ektenzija, samo je izbrisi iz naziva filtera. To je sve sto mi trenutno pada na pamet.
Lazarus je besplatna alternativa Delphi-u. Treba jos dugo da se razvija da bi bio stabilan i koristan kao Delphi, ali se vec sada mogu napraviti neke aplikacije. Bitna razlika je to sto Lazarus moze da radi na razlicitim operativnim sistemima i da kompajlira programe za njih. To je moguce jer kao kompajler koristi FreePascal.
Lazarus mozes preuzeti ovde:
http://sourceforge.net/project/showfiles.php?group_id=89339
@All
Za Snake Editor cemo napraviti malu formicu sa par jednostavnih procedura koje ce se pozivati kada korisnik klikne na odredjene njene odredjene delove. Forma ce izgledati ovako:
Osnovni meni, toolbar, akcije, status bar, slicice i dialozi su vam vec poznati od ranije i na tome se necemo zadrzavati. Kreirane su osnovne akcije (novo, otvori, snimi i izadji) i vezane su za stavke u meniju i toolbar-u. Status bar sluzi samo da objasni sta koji taster na misu znaci (kao mali help).
Na sredini forme se nalazi komponente tipa TImage. Ona ce sluziti za iscrtavanje i za "hvatanje" korisnickih akcija vezanih za crtanje.
Sad na programiranje... napravicemo da polje po kojem se igrac krece ne mora da bude fiksne sirine i visine (prvi nivo moze biti 10*10, drugi moze biti 30*30, itd...). Trebace nam tri promenljive. Jedna za polje po kojem ce igrac da se krece i jos dve za sirinu i visinu polja da ne bi morali svaki put da proveravamo velicinu polja. Bilo bi lepo i da imamo neke konstante koje ce obelezavati sta se na kom polju nalazi:
Code:
const
C_Empty = 0;
C_Wall = 1;
var
Field: array of array of Byte;
FieldWidth, FieldHeight: Integer;
Sad kad imamo gde da smestimo podatke, dodacemo i funkciju koja kreira prazno polje za igru:
Code:
procedure CreateField(AFieldWidth, AFieldHeight: Integer);
var
X, Y: Integer;
begin
SetLength(Field, AFieldWidth, AFieldHeight);
FieldWidth := AFieldWidth;
FieldHeight := AFieldHeight;
for Y := 0 to FieldHeight - 1 do
for X := 0 to FieldWidth - 1 do
Field[X, Y] := C_Empty;
end;
Sve sto nam je jos potrebno, osim crtanja, je snimanje i ucitavanje polja. Posto polje moze biti razlicite sirine i visine, trebalo bi i te podatke upisati u fajl, pa kod za snimanje i ucitavanje izgleda ovako:
Code:
function SaveField(AFilename: TFilename): Boolean;
var
S: TFileStream;
X, Y: Integer;
begin
Result := False;
try
S := TFileStream.Create(AFilename, fmCreate);
S.Write(FieldWidth, SizeOf(FieldWidth));
S.Write(FieldHeight, SizeOf(FieldHeight));
for Y := 0 to FieldHeight - 1 do
for X := 0 to FieldWidth - 1 do
S.Write(Field[X, Y], SizeOf(Field[X, Y]));
Result := True;
finally
S.Free;
end;
end;
function LoadField(AFilename: TFilename): Boolean;
var
S: TFileStream;
X, Y: Integer;
begin
Result := False;
try
S := TFileStream.Create(AFilename, fmOpenRead);
S.Read(FieldWidth, SizeOf(FieldWidth));
S.Read(FieldHeight, SizeOf(FieldHeight));
CreateField(FieldWidth, FieldHeight);
for Y := 0 to FieldHeight - 1 do
for X := 0 to FieldWidth - 1 do
S.Read(Field[X, Y], SizeOf(Field[X, Y]));
Result := True;
finally
S.Free;
end;
end;
Da se bacimo sad na iscrtavanje. Nazovimo TImage komponentu imgField. Funkcija za crtanje ce iscrtavati sve na imgField, a imgField ce se pobrinuti o iscrtavanju svega na formi kad god to bude bilo potrebno:
Code:
procedure TfrmMain.DrawField;
var
X, Y: Integer;
begin
for Y := 0 to FieldHeight - 1 do
for X := 0 to FieldWidth - 1 do
begin
if Field[X, Y] = C_Empty then
imgField.Canvas.Brush.Color := clWhite
else
imgField.Canvas.Brush.Color := clGray;
imgField.Canvas.Rectangle(Trunc(X * CellWidth), Trunc(Y * CellHeight),
Trunc((X + 1) * CellWidth), Trunc((Y + 1) * CellHeight));
end;
end;
Primecujete dve promenljive koje ranije nismo spomenuli, CellWidth i CellHeight. One nemaju veze sa logikom igre nego sa iscrtavanjem. Prozor u kojem se sve iscrtava i dimenzije polja nisu fiksne vrednosti i one uticu na dimenzije pojedinacne celije u polju. To znaci da prilikom kreiranja novog polja, ucitavanja ili menjanja velicine prozora moramo izracunati nove dimenzije celija i iscrtati polje s novim vrednostima. Kod koji racuna dimenzije celije izgleda ovako:
Code:
CellWidth := imgField.Width / FieldWidth;
CellHeight := imgField.Height / FieldHeight;
Ostalo je jos samo da "saslusamo korisnika" i menjamo celije onako kako on zeli. Zato cemo hvatati MouseDown, MouseUp i MouseMove dogadjaje. Na MouseDown i MouseUp cemo postavljati jednu promenljivu koja ce oznacavati sta treba da se iscrta na odredjenoj celiji, a na MouseMove cemo raditi iscrtavanje tako da korisnik moze da pritisne taster i da pomera misa, i da se celije menjaju gde god se mis nalazi:
Code:
procedure TfrmMain.imgFieldMouseDown(Sender: TOBject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
CellValue := C_Wall
else
CellValue := C_Empty;
imgFieldMouseMove(Sender, Shift, X, Y);
end;
procedure TfrmMain.imgFieldMouseUp(Sender: TOBject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CellValue := -1;
end;
procedure TfrmMain.imgFieldMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if CellValue <> -1 then
begin
Field[GetCell(X, Y).X, GetCell(X, Y).Y] := CellValue;
DrawField;
end;
end;
To je to za sada. Posto sad nista ne cekamo jer je Elmer-Davez vec odradio sve, uskoro cu zavrsiti i igru koja ce koristiti podatke iz ovog editora i krecemo na SDL + OpenGL
