Obliczenie części wspólnej obrazków TImage

0

Dzień dobry,
Mam taką sprawę, przeszperałem internet i forum.bez lepszych rezultatów. Może nie wiem jak nazwać to czego szukam.
Chodzi mi o moment osiągnięcia danej współrzędnej przez załadowany obrazek Timage - przy poruszaniu np góra-dół, bądź nałożenie się jednego na drugi na tym szarym tle- formatce. Chciałbym aby wyskoczyło np showmessage z napisem 'współrzęna "X,Y" bądź "tu jest już obiekt"- cokolwiek aby było efektem nałożenia się współrzędnej). Nie mam pomysłu jak to zapisać a przecież to wydaje się proste, może mnie ktoś z Państwa nakierować? Może jakiś link do faq, tutorialu bądź źródła informacji. Wielkie dzięki!

3

TRect.Contains - przykład w załączniku.
screenshot-20230501085129.png

Project1.zip

2

Chodzi mi o moment osiągnięcia danej współrzędnej przez załadowany obrazek Timage - przy poruszaniu np góra-dół

Może zacznijmy od tego, że takie obrazki same z siebie nie biegają po ekranie ;)

W związku z tym - musiałes stworzyć jakiś mechanizm ich poruszania. Dlatego najbardziej logiczne będzie dodanie sprawdzania czy nie nadchodzą na siebie w mechanizmie animacji położenia tych elementów.

Nie dałeś kodu, który odpowiada za ich przesuwanie, więc ciężko coś konkretnie doradzić.

A co do samego nakierowania na to, czego szukać - popatrz na hasła image overlap albo intersect. Przykładowe linki:
https://stackoverflow.com/questions/5720394/image-intersect
http://delphiforfun.org/programs/math_topics/rayintersectrect.htm
https://delphi.cjcsoft.net/viewthread.php?tid=45590
https://stackoverflow.com/questions/60798019/hitboxes-in-delphi
https://stackoverflow.com/questions/9554679/how-to-make-one-image-disappear-when-its-rectangle-intersects-another-image

0

Dziękuję za odp.
Powiem tak, żaden ze mnie programista;) sprawdzam możliwości w ramach "nadmiaru" wolnej chwili. Nie wiem czy cokolwiek co zacznę w Delphi ukończę ale może mi się coś uda.
Z kodu to wrzuciłem kilka zdjęć *.png i sterowanie strzałkami i chciałem zrobić na początek coś kompletnie banalnego jak takie chodzenie z ograniczeniem lub podmianie obrazków.
Takie testowanie tylko.

Próbuję jeszcze czegoś takiego:

begin

if Image1.Left + Image1.Width + image1.top + image1.height<= Image2.Left + Image2.Width
+ image2.top + image2.height then

begin

 image2.Picture.LoadFromFile('22.png');

         end;
    begin

if Image1.Left + Image1.Width > Image3.Left + Image3.Width then

         image3.Picture.LoadFromFile('postacp2.jpg');

end;
    end;

Niestety coś mi nie wychodzi ze współrzędnymi... za wcześnie się zmienia tzn jeszcze jak image1 nie dotrze to image kolejnego.

zmieniłem ">" na "=" i muszę popracować nad współrzędnymi obiektów image i odległóści przesunięcia postaci przy ruchu. Chyba muszą się na siebie nałożyć, jeśli dobrze do tego doszedłem.

1

Co do kodu - ciężko ocenić czy działa tak, jak planowałeś - bo to taki kawałek wyrwany z kontekstu. Do tego nie wiem, kiedy ma to się odpalić itp. Więcej pytań niż odpowiedzi.

Ale mam parę uwag - wprawdzie nie-do-końca na temat, ale i tak coś poradzę ;)

  1. jak masz instrukcje IF, w których masz jakieś obliczenia, to dobrze by było jakoś to ubrać w nawiasy. Czy nie sądzisz, że napisanie tego w postaci if (Image1.Left + Image1.Width + image1.top + image1.height) >= ... powoduje, że jest bardziej zrozumiałe i czytelne?
  2. Rozszerzając poprzedni punkt - w innych językach, w których można tworzyć zmienne w dowolnym miejscu kodu (a nie jak w Pascalu - na początku funkcji) można zrobić coś na zasadzie ImageOffset = Image1.Left + Image1.Width + image1.top + image1.height a potem w IF dać zapis w stylu if ImageOffset >= coś-tam. Wtedy od razu, patrząc na sam zapis, wiesz, czego dotyczy to sprawdzenie (a nie musisz rozgryzać, jaki Top się dodaje do height czegoś-tam innego i co to oznacza)
  3. Robiąc pkt. 2 jeszcze lepszym - zamiast tworzyć zmienną, możesz stworzyć osobną funkcję. Wtedy zapis by wyglądał mniej wiecej tak: if isImageCosTam() then ...
  4. Odnośnie fragmentu image3.Picture.LoadFromFile('postacp2.jpg'); - wczytywanie obrazka w momencie, w którym ma zostać wyświetlony jest kiepskim pomysłem. Po pierwsze: takie załadowanie zawsze chwilę trwa i może to być odczuwalne. A po drugie - jakby okazało się, że tego obrazka nie ma we wskazanym miejscy, to co wtedy?
1
cerrato napisał(a):
  1. Rozszerzając poprzedni punkt - w innych językach, w których można tworzyć zmienne w dowolnym miejscu kodu (a nie jak w Pascalu - na początku funkcji) można zrobić coś na zasadzie ImageOffset = Image1.Left + Image1.Width + image1.top + image1.height a potem w IF dać zapis w stylu if ImageOffset >= coś-tam. Wtedy od razu, patrząc na sam zapis, wiesz, czego dotyczy to sprawdzenie (a nie musisz rozgryzać, jaki Top się dodaje do height czegoś-tam innego i co to oznacza)

W Delphi już od dawna można deklarować zmienne wewnątrz bloków kodu, dokładnie tak samo jak w C/C++, Javie czy innych C-podobnych. Wiem, że OP podał tagi Lazarus i Delphi, ale warto o tym wspomnieć, bo jest to świetny ficzer.


Jeśli chodzi o sam temat, to — @Dodeq — jeśli usiłujesz zrobić jakiś prototyp gry, to polecam od razu wyrzucić cały ten projekt i zacząć od nowa, tym razem faktycznie pisząc grę, a nie aplikacje okienkową z komponentami wizualnymi. W przeciwnym razie nie dość, że niczego sensownego się nie nauczysz, to w dodatku najpewniej i tak tej gierki nie skończysz, bo szybko się okaże, że z kontrolek LCL nie da się zrobić sensownej gry, a więc…

Dodeq napisał(a):

Nie wiem czy cokolwiek co zacznę w Delphi ukończę ale może mi się coś uda.

…te słowa staną się prawdą — niczego nie ukończysz.

Jeśli chcesz zrobić jakąś małą grę dla zabawy, to zamiast używać komponentów LCL, użyj biblioteki do robienia gier. Obiektowe biblioteki to m.in. raylib i SFML, natomiast z proceduralno-strukturalnych (niskopoziomowych) to głównie SDL i Allegro. Są też gotowe silniki, takie jak ZenGL oraz choćby Castle Game Engine. Wszystkie wymienione wyżej mają dostępne nagłówki do Pascala, a niektóre są wręcz w Pascalu napisane.

0

oK dzięki za info.
Właśnie pomyślałem o tym, że to aplikacja wizualna bardziej niż gra ;)
W sumie na naukę nigdy nie jest za późno nawet dla samego siebie.
OK Dziękuję raz jeszcze

0

Wydaje mi się, że chodziło o małą ilość programowania i dużo zastępowania grafiką samej czynności pisania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1