Stworzenie efektu ShowModal w DelphiX

0

Cześć,

mam pętlę główną, która wygląd tak:

procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw.CanDraw then exit;

  Input.Update; // obsluga myszki

  Game.Update; // aktualizacja stanu gry
  
  Scene.DrawScene; // renderowanie
  DXDraw.Flip;
end;

w trakcie wykonywania aktualizacji stanu gry może zajść potrzeba wyświetlenia kilku komunikatów na które użytkownik musi jakoś zareagować. Do tej pory starałem się rozwiązać ten problem przez zapamiętanie kilku niezbędnych zmiennych i chwilowe wychodzenie z Game.Update, żeby komunikat się narysował i gracz mógł na niego kliknąć. Niestety wraz z rozwojem gry zapamiętywanie stanu i późniejsze jego odtwarzanie staje się coraz bardziej uciążliwe, stad moje pytanie: czy da się w jakiś prosty sposób rozwiązać ten problem?

W VCLu użyłbym formy i ShowModal, ale tutaj nie mam pomysłu jak to prosto zrobić.

0

Zaimplementuj własne GUI, które obsługuje wyświetlanie modali :P

0

@Patryk27 Tak właśnie robię, ale w VCLu w ShowModal jest pętla z Application.HandleMessage, którego użycie w tym przypadku nic nie da. Z kolei jak w metodzie Update obiektu Game zrobię pętlę:

while true do
begin
  if not DXDraw.CanDraw then exit;
 
  Input.Update; // obsluga myszki
 
  if Game.MessageUpdate then // aktualizacja stanu komunikatu
    break; 

  Scene.DrawScene; // renderowanie
  DXDraw.Flip;
end;

to okno gry się nie odświeża.

0

Nie, nie, nie.
W tej metodzie przetwarzającej GUI, jeśli jest aktywne jakieś okno modalne, po prostu nie przekazuj do okien zdarzeń typu OnMouseCośtam (zakładając, że zrobiłeś model GUI podobny do tego, co opracował Borland), a przekazuj je tylko do aktywnego okna modalnego.

0

@Patryk27 Chyba nie opisałem mojego problemu dość jasno, bo dyskusja idzie w złym kierunku :P
Może dam trochę bardziej szczegółowy przykład:

Załóżmy, że mam mapę z 50 miastami i przycisk pozwalający na przejście do kolejnego dnia. Podczas przejścia do następnego dnia w miastach losowo mogą wystąpić różne katastrofy np. pożar, epidemia, plaga szczurów, etc. Wystąpienie każdej z katastrof powinno wyświetlić komunikat z odpowiednią informacją, którą gracz musi potwierdzić. W kodzie wyglądałoby to mniej więcej tak:

procedure TGame.Update;
var
	i: Integer;
begin
	if NextDay then
	for i := 0 to TownList.Count - 1 do
	begin
		TownList[i].NextDay;
		if TownList[i].Cataclysm then
			TownList[i].ShowMessage; // <<----- tu chcę wyświetlać okno modalne
	end;
end;

Taką formę chciałbym uzyskać, ale nie wiem jak to zrobić. Obecnie robię to tak, że zapamiętuję zmienną i i po ShowMessage daje break. Po kolejnym wejściu w Game.Update przywracam wartość i na której skończyłem i idę dalej. Jak gra była prosta to wszystko działało idealnie, ale obecnie doszło dużo innych stanów do zapamiętania i widzę, że prowadzi to donikąd i lepszy byłby mechanizm okna modalnego.

0

Od nowa.
Masz zaimplementowany sensowny system GUI z eventami, dziedziczeniem etc. etc. czy nie?
A jeśli nie, to co masz zaimplementowane?

0

@Patryk27 Zależy co rozumiesz przez sensowny system GUI? Rysowanie okien za pomocą spritów i obsługę przycisków mam zrobioną. Eventów poza obsługą klikania jako takich nie mam, bo ich nie potrzebuję.

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