Už to funguje, díky za tu radu s ClientWidth, vůbec jsem si to neuvědomil :) tak ted už to zmáknu dodělat, vážně moc díky
Příspěvky odeslané z IP adresy 89.103.201.–
Zdravím!
Tak můj současný kód vypadá takto:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, StdCtrls, jpeg;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
MMOtevri: TMenuItem;
procedure MMOtevriClick(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
polec:array [1..20,1..20] of integer;
poleo:array [1..20,1..20] of TImage;
x,y:integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Poloha, mys : Tpoint;
f:textfile;
z:char;
i,j:integer;
Plocha_min_x,Plocha_min_y,Plocha_max_x,Plocha_max_y:integer;
a,b:real;
implementation
{$R *.dfm}
procedure TForm1.MMOtevriClick(Sender: TObject); //otevírá obrázek
var i,j:integer;
kurzor: THandle;
cesta: PChar;
pos:TPoint;
begin
{otevírání souboru a načítání znaků do polec}
if opendialog1.Execute then assignFile(f,opendialog1.FileName);
reset(f);
j:=1;
while not eof(f) do begin
i:=1;
while not eoln(f) do begin
read (f,z);
polec[i,j]:=strtoint(z);
i:=i+1;
end;
readln(f);
j:=j+1;
end;
closefile(f);
mys.X:=Left+270;
mys.Y:=Top+100;
Plocha_min_x:=Form1.Left;
Plocha_min_y:=Form1.Top;
Plocha_max_x:=Form1.Left+i*24+24;
Plocha_max_y:=Form1.Top+j*24+24;
Form1.Width:=Plocha_max_x;
Form1.Height:=Plocha_max_y;
i:=0;
j:=0;
for i:=1 to 20 do begin
for j:=1 to 20 do
begin
poleo[i,j]:=TImage.create(self);
case polec[i,j] of
0: begin
{poleo[i,j].Canvas.Brush.Color:=clblack;
poleo[i,j].Canvas.Pen.Color:=clblack;
poleo[i,j].Canvas.Rectangle(29*i-28,29*i-28,(29*i-28)+26,(29*i-28)+26); //platné pro první sloupec }
poleo[i,j].Picture.Bitmap.loadfromresourcename (HInstance, 'ZED');
end;
1: begin
{poleo[i,j].Canvas.Brush.Color:=clwhite;
poleo[i,j].Canvas.Pen.Color:=clwhite;
poleo[i,j].Canvas.Rectangle(i,j,i+24,j+24); }
poleo[i,j].Picture.Bitmap.loadfromresourcename (HInstance, 'PRAZDNO');
end;
2: begin
poleo[i,j].Picture.LoadFromFile('finish.jpg');
end;
end;
poleo[i,j].Top:=j*24-24;
poleo[i,j].Left:=i*24+24;
poleo[i,j].parent:=self;
end;
end;
SetCursorPos (mys.X, mys.Y);
cesta:=PChar('Pacman.cur');
kurzor:=LoadImage(0, cesta, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
Screen.Cursors[1] := kurzor;
Form1.Cursor := 1;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Form1.ScreenToClient(Poloha);
a := Plocha_max_x + (mys.X / 24);
b := Plocha_max_y + (mys.Y / 24);
if (a < Plocha_min_x) or (a > Plocha_max_x) or (b < Plocha_min_y) or (b > Plocha_max_y)
then showmessage('KONEC');
end;
end.
Řeším teď problém, proč při prvním zapnutí se mi formulář vykreslí v pořádku, ale při každém dalším se x-ová i y-ová souřadnice levého horního rohu o něco zvětší takže se posune a navíc se zvětší i samotný formulář, ale to všechno jenom 10x a pak zase je na původním místě
Takže vykreslování pole přepíšu tak, že volno/zeď vždycky vykreslím pomocí Canvasu podle obsahu texťáku (0 nebo 1). Potom souřadnice kurzoru najdu zase pomocí GetCursorPos (ty se mi zjišťují při jakémkoliv pohybu myši po formuláři pomocí FormMouseMove) a vydělím je velikostí zdi/volné cesty a dále se ztrácím :(
Zdravím!
Pracuju na hře, ve které by se měl kurzor pohybovat po hrací ploše a nepřesáhnout hranice předem dané cesty. Mapy a cesty si může uživatel tvořit sám pomocí textového souboru, který má 20 řádků a sloupců a 0 přestavuje plné okno takže zátaras a 1 volnou cestu. Začnete výběrem mapy, kliknete na tlačítko a tím se vykreslí mapa a panáček/kurzor se přesune na danou pozici, která je volná. Problém, který teď řeším je, jak ošetřit, aby při překročení vymezené hranice byl konec hry. V uvedeném zdrojovém kódu se to snažím dělat tak, že si načítám znaky textového souboru a dokud je 0, tak se nic neděje, ale jamile se objeví v cestě 1, tak chci zaznamenat souřadnici právě té předcházející 0, ale netuším, jak na to. Předem děkuju
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, StdCtrls, jpeg;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
Button1: TButton;
MMOtevri: TMenuItem;
procedure MMOtevriClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
polec:array [1..20,1..20] of integer;
poleo:array [1..20,1..20] of TImage;
x,y:integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Poloha : Tpoint;
f:textfile;
z:char;
i,j:integer;
implementation
{$R *.dfm}
procedure TForm1.MMOtevriClick(Sender: TObject); //otevírá obrázek
begin
{otevírání souboru a načítání znaků do polec}
if opendialog1.Execute then assignFile(f,opendialog1.FileName);
reset(f);
button1.Enabled:=true; //at neaktivuju mapu před načtením
j:=1;
while not eof(f) do begin
i:=1;
while not eoln(f) do begin
read (f,z);
polec[i,j]:=strtoint(z);
i:=i+1;
end;
readln(f);
j:=j+1;
end;
{zjištění souřadnic hranice mezi 0 a 1}
{j:=0;
for j:=1 to 20 do begin
i:=1;
while polec[i,j]=0 do i:=i+1;}
//zjistit pozici kurzoru
closefile(f);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Enabled:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
kurzor: THandle;
cesta: PChar;
begin
Poloha.X:=Left+295;
Poloha.Y:=Top+100;
i:=0;
j:=0;
for i:=1 to 20 do begin
for j:=1 to 20 do
begin
poleo[i,j]:=TImage.create(self);
case polec[i,j] of
0: poleo[i,j].picture.bitmap.loadfromresourcename (HInstance, 'ZED');
1: poleo[i,j].picture.bitmap.loadfromresourcename (HInstance, 'PRAZDNO');
2: begin
poleo[i,j].Picture.LoadFromFile('finish.jpg');
end;
end;
poleo[i,j].Top:=j*28-28;
poleo[i,j].Left:=i*28+28;
poleo[i,j].parent:=self;
end;
end;
SetCursorPos (Poloha.X, Poloha.Y); //Poloha.X - horizontální pozice, Poloha.Y - vertikální pozice
cesta:=PChar('Pacman.cur');
kurzor:=LoadImage(0, cesta, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
Screen.Cursors[1] := kurzor;
Form1.Cursor := 1;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
GetCursorPos(Poloha);
end;
end.