Lazarus 2.2.0 RC1 (2021.02.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Görgethető kép gondok 2021 febr. 03 18:33 #2443

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Ajánlom a figyelmedbe, érdemes megnézni:
wiki.freepascal.org/BGRABitmap
wiki.freepascal.org/BGRAControls
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

Görgethető kép gondok 2021 jan. 20 13:23 #2423

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
A TBitmap az jól van, először összerakod a dolgokat a TBitmap-ra és annak a komponensnek, amelyikre a kész képet kirakod, annak az onPaint metódusából hívsz egy másolást:
...
Buffer: TBitmap;
....
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0,0,Buffer); //kitesszük a kep-et a komponensre
  //és innen nem rajzolunk a Bufferbe semmit szerintem 
end;
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

Görgethető kép gondok 2021 jan. 20 12:37 #2420

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 56
  • Köszönetek: 1
És üres vásznat hogyan hozhatok létre? Azzal, hogy csináltam egy TBitmap-et a Form1 Create-jében, nem egy új, üres vásznat hoztam létre? Hiszen annak is van canvas metódusa.

Görgethető kép gondok 2021 jan. 19 19:56 #2419

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 472
  • Köszönetek: 80
Ahogy progmokus írta: "először összerakni mindent, amit a képen látni szeretnék és utána kell kirakni".
Tehát először mindig a memóriában egy üres vászonra kirajzolni az adott pillanathoz tartozó összképet (háttér és egyebek) és aztán ezt a kész képet kitenni a képernyőre vagy ablakba.
Úgy kell ezt elképzelned, mint a (rajz)filmeket, amik állóképek gyors egymásutánjának felvillanása által keltik a mozgás illúzióját.

Lásd még: #2417
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 2.3.0 -- FPC 3.3.1-- GNU/Linux 5.4.0 x86_64

Görgethető kép gondok 2021 jan. 19 15:00 #2416

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Minek neki OnPaint mikor nem vizuális komponens?
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

Görgethető kép gondok 2021 jan. 19 13:32 #2415

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 56
  • Köszönetek: 1
És a TBitmapnak lehet valahogy külön egy saját OnPaint-et létrehozni? S ha igen, azt honnan érdemes lefuttatni?

Görgethető kép gondok 2021 jan. 19 09:14 #2414

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 51
  • Köszönetek: 5
Hát, nem nagyon szoktam grafikával foglalkozni, de szerintem a bufferként használt TBitmap-ra kell először összerakni mindent, amit a képen látni szeretnék és utána kell kirakni a formra.
A form onpaint eseményéből hiába rajzolunk a TBitmap-ra, nem fog frissülni rendesen, szerintem. Persze lehet hogy hülyeséget írok...

Ha már játékban gondolkodik az ember, akkor érdemes elgondolkodni az OpenGL, SDL, GLScene, ZenGL stb. könyvtárakon, szerintem...
Windows 10, VirtualBox(Ubuntu Mate 21.04)
Lazarus 2.0.12
CodeTyphon 7.5

Görgethető kép gondok 2021 jan. 17 15:11 #2413

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 56
  • Köszönetek: 1
Elakadtam egy olyan problémánál, hogy van egy grafikus elem a görgethető vásznon, de mozgáskor nem törlődik az előző helyéről, hanem saját magát ábrázoló csíkot húz.
Valahogy rá lehet irányítani az Invalidate;-et egy egyedi canvas-ra? Mert az alábbi kódsorok alapján egyáltalán nem működik ez:
procedure TForm1.palyafrissites(Sender: TObject);
var kovx,kovy,i: integer;
begin
  for i:=0 to puffancsdb-1 do
  begin
   case puffancs[i].mitcsinal of
  'megy': begin
    if puffancs[i].celx>puffancs[i].xhely then
       kovx:=puffancs[i].xhely+puffancs[i].sebessege
    else if puffancs[i].celx<puffancs[i].xhely then
       kovx:=puffancs[i].xhely-puffancs[i].sebessege
    else
       kovx:=puffancs[i].xhely;
    if puffancs[i].cely>puffancs[i].yhely then
       kovy:=puffancs[i].yhely+puffancs[i].sebessege
    else if puffancs[i].cely<puffancs[i].yhely then
       kovy:=puffancs[i].yhely-puffancs[i].sebessege
    else
       kovy:=puffancs[i].yhely;
    if ponttav(puffancs[i].xhely,puffancs[i].yhely,kovx,kovy)<=puffancs[i].sebessege then
       puffancs[i].mitcsinal:='semmit'
    else
       begin
            puffancs[i].iranya:=pontirany(puffancs[i].xhely,puffancs[i].yhely,kovx,kovy);
            puffancs[i].xhely:=kovx;
            puffancs[i].yhely:=kovy;
       end;
    end;
   end;
   with palyakep.canvas do invalidate;
  end;
end;
(...)
procedure TForm1.FormPaint(Sender: TObject);
var puffalkepe: byte;
  i: integer;
begin
  canvas.draw(palyakepx,palyakepy,palyakep);
  for i:=0 to puffancsdb-1 do
  begin
    puffalkepe:=trunc(puffancs[i].iranya*8/360);
    if puffalkepe>7 then puffalkepe:=0;
    palyakep.canvas.draw(puffancs[i].xhely,puffancs[i].yhely,puffancskep[puffalkepe]);
  end;
end;
Mellékletek:

Görgethető kép gondok 2021 jan. 15 09:03 #2412

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 56
  • Köszönetek: 1
Megvan a megoldás; időközben észrevettem: a palyakepx+ -t kellett törölni a textout utasításból, hogy megfelelően működjön a kód.
Legközelebb igyekszem gyorsabban szemfüles lenni. :lol:

Görgethető kép gondok 2021 jan. 14 09:28 #2410

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 56
  • Köszönetek: 1
Belefogtam egy olyan alkalmazás készítésébe, amelynél van egy görgethető kép és ezen lennének a kirajzolandó objektumok. Nem tudom, hogy ez-e a jó módszer ennek megvalósítására, de úgy csinálom, hogy a főablak létrehoz egy új TBitmap-et, amely nagyobb mint az, és ezt a TBitmap-et lehet mozgatni, ennek egy részletét mutatja a főablak a maga FormPaint eseményében.
Nagyon kezdetleges állapotban van még és az a fő gondom vele, hogy amit a TBitmap-on kirajzolok (jelen esetben egy szöveget), az a görgetés során csíkot húz, mintha nem törlődne az előző helyéről.
Rosszul használom az Invalidate utasítást? Esetleg rossz helyen rajzoltatom ki a szöveget a palyakep.canvas.textout()-tal?
Íme a kódrészlet:
var
  Form1: TForm1;
  palyakep: TBitmap;
  palyakepx,palyakepy: integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  width:=Screen.width;
  height:=Screen.height;
  palyakep:=TBitmap.Create;
  palyakep.SetSize(width*2,height*2);
  palyakepx:=0;
  palyakepy:=0;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  palyakep.Free;
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if Key=VK_LEFT then
  begin
    if (palyakepx+palyakep.canvas.width)-4>=width then
    begin
      dec(palyakepx,4);
      invalidate;
    end;
  end;
  if Key=VK_RIGHT then
  begin
    if palyakepx+4<=0 then
    begin
      inc(palyakepx,4);
      invalidate;
    end;
  end;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  canvas.draw(palyakepx,palyakepy,palyakep);
  palyakep.canvas.textout(palyakepx+(palyakep.canvas.width div 2),20,'Ez itt a közepe.');
end;

  • Oldal:
  • 1