On Tue, Mar 18, 2003 at 03:02:09PM +0100, Jerker Hammarberg wrote:
[callbacks från animationer]
Fattar inte riktigt... menar du att varje reell animation ska vara en subklass och implementera den virtuella metoden? Låter jobbigt...
Ja, det är jobbigt.
hellre funktionsobjekt så, eller någon annan callback-grej. Men personligen är jag mer för någon form av "uppifrån-styrning", vet inte riktigt hur jag ska kalla det... i princip, när en primitiv rutin inte vet längre vad den ska göra, så ska den returnera.
Kanske vi kan ha någon form av kooperativ multitasking för "primitiva rutiner", typ:
class Task { public: Task() { nextRun = -1; } virtual ~Task() {}
// Performs a part of the task, return true if // there is more to be done, else false. virtual bool run(void) = 0;
// Gives the absolute time when this task wants to run, or -1 if // "as soon as possible" int nextRunTime() { return nextRun };
private: int nextRun; };
Vi har också en kö med Task's, och kollar en gång per frame vilka som behöver köras. Det blir ju lite extra krångel med att ärva Task, fast jag kan inte komma på något bra alternativ. Man vill ju ofta ha med sig lite kontext i olika "processer", och då behövs ändå en klass.
Jag tycker det känns naturligare att tänka så. Men det beror förstås på hur kontrollen över animationerna sköts - jag har ännu inte förstått hur du har tänkt och då blir det svårt att hitta på en passande arkitektur.
Jag har tänkt, fast inte kommit på någon ultimat lösning, så du får gärna ha åsikter!
[..]
Så här skulle jag ha tänkt:
På mittenivån finns en klass Animation:
class Animation { public: long getNextUpdateTime(); [kanske virtual] bool isDone(); [kanske virtual] void doUpdate(); };
Tusan, nu ser jag att du redan har uppfunnit "Task".
Den har också fält med all information som behövs för att styra animationen, tex om den loopar eller inte och hur den förflyttar sig, samt förstås pekare till sin Sprite och sin AnimationFrame. För att starta en animation så lägger man till den i en allmän lista över animationer.
Precis. Kanske vill vi ha andra typer av saker (därav "Task") som kör parallellt, med det kanske bara är att krångla till det?
På mittennivån ligger också "the main loop" om man säger så. I varje iteration bläddrar den igenom den allmänna animationslistan och kollar för varje animation om det är dags för en uppdatering (getNextUpdateTime() < currentTime).
Inte för att jag tror att det behövs, men en kö sorterad på getNextUpdateTime() blir lite lite snabbare.
[..]
Om isDone() är true så måste mainloopen vidta någon styråtgärd, vilket kan innebära att returnera till toppnivån ifall det krävs åtgärder på manusnivå.
Hur kommer egentligen manuset att lagras? Som noder i en stor graf? Jag funderar på det där med "returnera till toppnivån".. Ofta vill man ju "returnera" till olika ställen i manuset beroende på vad som hände, och eftersom utgången kan vara väldigt öppen i en del fall.
Något sånt här?
class GameEvent { int type(); //egentligen en enum av olika typer av händelser. };
Om man antar en funktion
GameEvent LetOddWalkAround() //Let the user walk around and return when something interesting happens
Så kan man skriva en scen i manuset som
GameEvent event = LetODDWalkAround();
switch (event->type()) { case EVENT_PICKUP: .. case EVENT_USE: .. case EVENT_TALKTO: .. };
Jag gillar inte riktigt det här, fast fördelen är att man kan hålla all kod för en viss scen på samma ställe. Annars blir den kanske utspridd över en massa klasser. Har du någon idé på hur man kan förbättra det här?
I vilket fall ska animeringsobjektet tas bort ur listan, och förmodligen ersättas med en annan animation för samma Sprite.
Mm. Detta ska ju i högst möjliga mån gå automatiskt.
Detta hänger ihop med timeOut-parametern på Input::getEvent(). I och med att vi bläddrar igenom alla animationer kan ve se hur lång tid det är tills någon måste uppdateras. Detta värde används då som timeOut, så att getEvent() returnerar lagom tills det är dags att uppdatera.
Så tänker jag mig också.
[..]
En sak som vi kommer behöva är i alla fall en händelsekö, med en viss tid för varje händelse. Detta kanske kan kopplas ihop med GameEvent?
Mm, kanske. GameEvent tänkte jag skulle förmedla handlingar från användaren från mittennivån till toppnivån, typ "Odd undersöker dörr", och sådant behöver ju ingen tidsangivelse. Men kanske måste GameEvent vara något mer. Kan du ge exempel på händelser i en sådan kö?
Diverse animationer som sker spontant, en fågel som kvittrar eller så. Ingenting som påverkar själva handlingen dock. Om man har en datorstyrd karaktär kanske det också kan vara bra för att få den att gå omkring spontant.
Dokumentera bättre, ja. Ville bara få fram något fort i söndags. Ska vi köra på någon särskild stil, för Doxygen eller så?
Kör nån som du kan och som inte är för bökig, tycker jag. Jag är bara van vid JavaDoc men den funkar väl inte på C++ antar jag.
Jag kan ingen speciell, men jag ska läsa på om doxygen.
Ulf