Skocz do zawartości

[Delphi] PNG i Omega


Caesar

Polecane posty

Chcę użyć plików PNG w Omedze, kiedy dodam je z poziomu Delphi do OmegaImageList i potem użyję w programie to wszystko jest ok (używam biblioteki GraphicEx, bo wcześniej i to nie działało, a PNGImage nic nie daje). Kiedy natomiast wczytam plik PNG z pliku OIL i chcę go użyć, to wyskakuje mi błąd Acces Violation. Nie wiem, dlaczego. Proszę o pomoc...

Link do komentarza
Udostępnij na innych stronach

Nie używaj GraphicEx! Zawiera błędy (pointery oraz błędy logiczne w zaprojektowanych klasach - oba rodzaje takowych odczułem dotkliwie na własnej skórze) i powoduje przecieki pamięci!

 

Dużo lepszą biblioteką jest Vampyre Imaging Library.

 

Być może błąd leży po stronie GraphicEx (zresztą jest już od dawna nierozwijane, w przeciwieństwie do imaginglib).

soon Delphi will be only for veterans and finally we all will die at the end…

delphi.dathox.com - nowinki z świata Delphi/Pascala

only programmers and drug dealers call their customers "users"

 

Oto cisza przed burzą, Chwile się dłużą.Z gór schodzi dużo chmur ku podnóżom.Ptaki milaczą, drogi suche jak wiór się kurzą, Ptaki milczą a drogi się kurzą.

Link do komentarza
Udostępnij na innych stronach

Prawie każdy odsyła mnie do innych komponentów: Asphyre, Omega. Ten pierwszy jest dla mnie niezrozumiały. Wziąłem Omegę, gdyż jest podobny do DelphiXa, a w nim mam już jakieś doświadczenie. Teraz odsyłasz mnie do BEngine. A za chwilę ktoś inny odeśle mnie do jeszcze innego zestawu komponentów.

 

Ja chcę tylko rozwiązać problem z PNG...

 

GraphicEx nie wywala mi błędu, tylko OmegaImageList.

Link do komentarza
Udostępnij na innych stronach

Co do problemu z AV to nikt ci na to nie odpowie co robisz ze bo:

1. nie widzimy kodu

2. problemy z AV to problemy z pointerami, a tylko ty i twoj debuger sa w stanie to namierzyc

 

Sytuacja moze byc taka ze wszystko dziala dobrze, ale np kasujesz obiekt gdzies a w miejscu w ktorym sie do niego odwolujesz masz stara referencje i masz AV. Albo masz nadpisanie pamieci i ci sie wysypuje, albo okazuje sie ze tak naprawde z PNG jest wszystko ok ale chcesz rysowac po uszkodzonym obiekcie. itd... opcji jest multum.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Oto kod:

 

unit code_Mapa;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, OmegaTimer, OmegaFont, OmegaScreen, ExtCtrls, OmegaSurface,
 OmegaImageList, Imaging, TMyImage, Math, StdCtrls, GraphicEx;

type
 TfMapa = class(TForm)
   pEkran: TPanel;
   Ekran: TOmegaScreen;
   Font: TOmegaFont;
   Timer: TOmegaTimer;
   IL: TOmegaImageList;
   pKierunki: TPanel;
   pN: TMImage;
   pE: TMImage;
   pS: TMImage;
   pW: TMImage;
   sKierunki: TShape;
   iRamka: TImage;
   procedure FormCreate(Sender: TObject);
   procedure TimerTimer(Sender: TObject);
   // nie dotyczy
 private
   { Private declarations }
 public
   { Public declarations }
   procedure DeltaPos;
 end;

var
 fMapa: TfMapa;
 delta: Integer = 20;
 deltaX, deltaY: Integer;
 zx, zy, dx, dy: Integer;

implementation

{$R *.dfm}

procedure TfMapa.DeltaPos;
var
 szer, wys: Integer;
 sekran, wekran: Integer;
begin
 szer:=IL.ImageList.Items[0].ImageWidth;
 wys:=IL.ImageList.Items[0].ImageHeight;
 sekran:=Ekran.Width;
 wekran:=Ekran.Height;
 deltaX:=Max(Min(deltaX, 0), -(szer - sekran));
 deltaY:=Max(Min(deltaY, 0), -(wys - wekran));
 Ekran.OffsetX:=deltaX;
 Ekran.OffsetY:=deltaY;
end;

procedure TfMapa.FormCreate(Sender: TObject);
begin
 Ekran.SetHWnd(pEkran.Handle);
 Ekran.Init;
 Font.Init;
 IL.Init;
 Font.CreateFont('Verdana', 12, [fsBold]);
 Font.Color:=OmegaColor(128, 128, 128);
 Timer.Enabled:=True;
 IL.ImageList.LoadFromFile('grafika.oil');
 IL.ImageList.Items[IL.ImageList.Count - 1].Init;
 deltaX:=0;
 deltaY:=0;
 iRamka.Picture.LoadFromFile('ramka mapa.png');
end;

procedure TfMapa.TimerTimer(Sender: TObject);
begin
 Ekran.BeginRender;
 Ekran.ClearScreen(0, 0, 0);

 Font.Print(5, 5, IntToStr(Timer.FPS));
 IL.ImageList.Items[0].Draw(0, 0, 1);
 IL.ImageList.Items[1].Draw(-deltaX, -deltaY, 1);

 Ekran.EndRender;
end;
// nie dotyczy - zdarzenia obsługi myszy itd.

W pliku grafika.oil są dwie grafiki, pierwsza w jpg, druga w png. Kiedy zostawiam tylko jpg (1 grafika) to wszystko jest ok, ale gdy dorzucę png, to nic nie działa. Błąd wywala w 435 linii pliku OmegaImageList.pas .

Możliwe, że robię coś źle (np. wczytywanie pliku z grafikami). Ale nie wiem.

Link do komentarza
Udostępnij na innych stronach

Udało mi się znaleźć rozwiązanie. Zamiast linijki:

 IL.ImageList.Items[IL.ImageList.Count - 1].Init;

 

To rozwiązuje problem wczytywanych plików w ogóle. Ale pojawił się następny. Nie działa kanał alpha, a właśnie dla niego zdecydowałem się na pliki PNG.

Link do komentarza
Udostępnij na innych stronach

Zamiast tej całej pętli inicjującej wystarczy napisać tak jak pisałem wcześniej: "IL.Init;" Sam pisze grę w Omedze ;)http://www.pogromcypotworow.yoyo.pl I stosuje w niej pliki PNG jak i JPG. U mnie kanał alpha działa normalnie, ale mam z nim inny problem, gdy jest włączony antyaliasing to do okoła wyświetlanego obrazka rozmywa się lekko kolor przezroczysty (taki jaki widać przy otwarciu pliku PNG w Paincie). Dlatego nie używam plików PNG z kanałem alpha. Zamiast tego wyświetlam je tak jak zwykłe pliki BMP, czyli włączam transparent dla każdego obrazka i ustawiam kolor przezroczysty ;)

Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Mógłbyś podać jakieś bliższe informacje...? Tzn. sposób użycia plików, kawałek kodu (a jeśli możesz, to jakieś proste demo) ustawienia z jakich korzystasz, parametry plików PNG (tło, przeplot, itp.), wersja Delphi (moja 7). Po prostu, jak TY to robisz, że działa...

Korzystasz z jakichś rozszerzeń do obsługi PNG?

 

Z góry dzięki :)

Link do komentarza
Udostępnij na innych stronach

Ja też używam Delphi 7. Nie korzystam z żadnych rozszerzeń do obsługi PNG :lol: Jakkolwiek użyję to u mnie działa, czy wczytuję z pliku OIL, czy ustawiam tylko ścieżkę z której ma czytać plik PNG z dysku. Nie wiem czemu u ciebie nie działa :P Ja ustawiam tylko Transparent na TRUE i kolor na mój kolor przezroczysty i tyle :rolleyes:

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...