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!
TRect.Contains
- przykład w załączniku.
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
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.
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ę ;)
- 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? - 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 wIF
dać zapis w styluif 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) - 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 ...
- 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?
cerrato napisał(a):
- 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 wIF
dać zapis w styluif 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.
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
Wydaje mi się, że chodziło o małą ilość programowania i dużo zastępowania grafiką samej czynności pisania.