Projektuję sobie (jeszcze nie zacząłem pisać) interfejs pewnego systemu (silnika, frameworka - whatever).
System ma umożliwiać postawienie gry typu OGame (Bitefight, Travian) bez użycia procesów działających w czasie rzeczywistym - na samym PHP + baza danych (ew. jakiś inny sposób przechowywania danych).
Działanie jego opiera się na wstecznym wykonywaniu zadań na żądanie użytkownika - system sprawdza czas ostatniej aktywności i wykonuje wszystkie zapisane zadania w kolejności chronologicznej uwzględniając czas który mijał między nimi, etc.
Interfejsem tego systemu mają być Obiekty (praktycznie takie same jak obiekty w pojęciu programowania obiektowego) i zdarzenia które są na nich wykonywane. Pozostałe niuanse pominę jako nieistotne.
Problem na który natrafiłem jest czysto teoretyczny, jako że narazie znajduję się na etapie projektowania interfejsu - czysto teoretycznie, jeszcze bez kodowania.
Planuję stworzyć uniwersalny system zdarzeń które mogą być wykonywane na dowolnym obiekcie z danej klasy.
Do tego chciałbym dorzucić zmianę celu zdarzenia na całą grupę obiektów z tej samej klasy, co planowo ma doprowadzić do wykonania tego zdarzenia na każdym obiekcie który do niej należy.
Przy okazji - powracam do programowania w PHP po dłuższej przerwie i muszę sobie troszkę poprzypominać, więc wybaczcie ew. błędy w kodzie który będę przedstawiał - chodzi o jego sens, nie o poprawność.
No i tutaj jest problem, bo jeśli zdarzenie zostaje wykonane na jednym obiekcie, wszystko jest OK:
Kod
function zdarzenie()
{
$target = $planeta; //obiekt $planeta (załóżmy zadanie analogiczne do OGame)
$target.building['elektrownia']+=1; //zwiększamy poziom elektrowni o 1
}
{
$target = $planeta; //obiekt $planeta (załóżmy zadanie analogiczne do OGame)
$target.building['elektrownia']+=1; //zwiększamy poziom elektrowni o 1
}
A teraz chcemy TO SAMO zdarzenie o TYM SAMYM kodzie wykonać na grupie obiektów:
Kod
function zdarzenie()
{
$target = $grupaPlanet; //obiekt $grupaPlanet zawierający informacje o wszystkich obiektach należących do grupy
$target.building['elektrownia']+=1; //zwiększamy poziom elektrowni o 1
}
{
$target = $grupaPlanet; //obiekt $grupaPlanet zawierający informacje o wszystkich obiektach należących do grupy
$target.building['elektrownia']+=1; //zwiększamy poziom elektrowni o 1
}
I przechodzimy do sedna:
Czy jest jakaś możliwość przechwycenia operacji wykonanej na zmiennej przez kod PHP który napiszę?
Wtedy rozwiązanie byłoby proste - wprowadzam pętlę która wykonuje daną przechwyconą operację na wszystkich obiektach z danej grupy.
Innym rozwiązaniem nad którym myślałem jest parser, ale wolałbym tego uniknąć - stworzyłoby to 10x więcej problemów (może prostszych, ale napewno upierdliwych).
Jeszcze innym są funkcje pośredniczące w wykonywaniu operacji matematycznych i sprawdzaniu prawdziwości warunków, ale również nie jest to eleganckie...
Rozwiązanie problemu mogłoby być proste (np. wielokrotne wykonanie zdarzenia przez silnik) gdyby nie fakt że powinna istnieć możliwość wykonania różnych operacji przez jedno zdarzenie na więcej niż jednym celu (czyli pojedynczym obiekcie, bądź grupie), więc jeśli jedna grupa miałaby więcej obiektów niż druga, inne rozwiązania wyłożyłyby się.
Przykład:
Kod
function zdarzenie(){
$target[0] = $grupaPlanet;
$target[1] = $grupaPlanet1;
if ($target[0].elektrownia == 5) $target[1].kopalnia +=1; //hipotetycznie jeśli wszystkie obiekty z pierwszej grupy spełniają warunek, operacja zostaje wykonana na wszystkich obiektach z drugiej grupy.
}
$target[0] = $grupaPlanet;
$target[1] = $grupaPlanet1;
if ($target[0].elektrownia == 5) $target[1].kopalnia +=1; //hipotetycznie jeśli wszystkie obiekty z pierwszej grupy spełniają warunek, operacja zostaje wykonana na wszystkich obiektach z drugiej grupy.
}
Pozdrawiam
-----------------
EDIT:
Znalazłem rozwiązanie problemu - są nim referencje.
(wiedziałem, cholera, że w PHP przydałby się odpowiednik C++'owych wskaźników, nie wiedziałem że JEST i to w jeszcze ciekawszym wydaniu)
Muszę się jeszcze wieeele nauczyć :-].
Pozdrawiam