X-antal objekter med timere - hvordan!?

Tags:    java

Hej alle, jeg er i gang med et Bomberman-spil og har ALDRIG været ude for ikke selv at kunne løse et problem, men nu er det altså tid.

Jeg har følgende relevante klasser:
- GameEngine, der tager sig af hele spillets gang.
- Bomb, der repræsenterer en bombe på kortet.

Bomb-klassen indeholder en util.Timer (altså en Timer der opretter en seperat tråd for hvert Timer-objekt). Denne timer oprettes når en metode i Bomb-klassen kaldes. Timerens funktion er basalt set at "tælle til 5", hvorefter bomben springer i luften og sættes som inaktiv.

I min GameEngine klasse er der desuden en anden util.Timer, der laver at delay på computerens ryk. (Så man kan følge med i hvad der foregår). Dette delay er på 300MS.

Klassens main-loop (der stopper når spiller er slut), kører to metoder, hvor den ene tager sig af spillernes ryk - hvis en spiller sætter en bombe, blive der oprettet en bombe, hvor denne bombes timer startes. Denne bombe lægges ind i en liste af aktive-bomber, altså bomber hvis timer er i gang med at tælle ned.

Den anden metode tjekker for ændringer efter sidste ryk. Den kører bl.a. listen af aktive bomber igennem, for at tjekke om en eller flere er blevet inaktive - hvis de er det, skal de springe i luften, der skal tjekkes om en eller flere spillere bliver berørt af dette, painComponent skal opdateres osv. Bomben der nu er inaktiv bliver desuden fjernet fra listen af aktive bomber. Min interaktion i denne liste foregår på den måde, at jeg hver gang hiver element 0 ud af min liste (ArrayList). Jeg antager der sker et kald til metoden 1000/300 gange i sekundet så det vil sige at der højest kan være en forskel på hver bombes timer på 300MS - altså, jeg behøver kun at kigge på den ældste bombe i listen, for hvert kald af denne metode.

(Det skal siges at jeg før blot tjekkede alle bomber i listen og tjekkede om de var blevet inaktive, så problemets kerne ligger altså ikke her).

Det hele virker fint hvis computeren kun sætter en bombe - men hvis der F.eks. sættes en til, så bliver timeren fra den tidligere bombe, overført til den nye. Vi har altså følgende scenarie:

Tid(sekunder): 1
Computer sætter bombe. Tid: 2
Computer sætter bombe2. Tid: 4
Bombe2 springer i luften, mens bombe1 forbliver "en fuser". Tid: 5

Jeg opretter nye objekter for hver bombe, samt seperate timere for hver bombe, men alligevel har de en sammenhæng. Hvorfor? Hvordan får jeg dem til at opføre sig uafhængigt af hinanden?

Det skal siges at jeg har prøvet at oprette nye tråde for hver bombe i listen over aktive bomber, for hver timer og for hver metode der har relevans for problemet. Alt sammen uden held.

Jeg håber min beskrivelse giver grundlag nok for et svar. Ellers skal jeg gerne smide min kode op, selvom det nok ville ødelægge overblikket!

Tak på forhånd :)



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Nu er jeg ikke helt sikker på om jeg forstod hvad du mente, så det kan godt være det her ikke giver nogen mening.

Den måde jeg laver mit gameloop på er ved at have 2 metoder. Den ene hedder update eller updateWorld eller noget lign. Den metode køre alle de ting der er i spillet (actors) igennem, og kalder deres act() metode.

Den anden hedder paint eller paintWorld eller noget lign. I den maler jeg først interfacet(kan godt være det ikke er særlig smart vis man får et mere advanceret interface, men til de simple ting jeg laver er det okay) og der efter køre den alle actors igennem og kalder deres paint() metode.

vis jeg så skal have noget til først at ske efter x tid laver jeg en 2 int's

int t;
int hastighed; //eller x

så kan man i act() skrive
Fold kodeboks ind/udKode 

hvor hastighed er det stykke tid den skal eksplodere efter. Jo højere jo længere tid.

hvis det er off-topic, eller ikke giver nogen mening, så bare ignorer det :D





Bomb-klassen indeholder en util.Timer (altså en Timer der opretter en seperat tråd for hvert Timer-objekt). Denne timer oprettes når en metode i Bomb-klassen kaldes. Timerens funktion er basalt set at "tælle til 5", hvorefter bomben springer i luften og sættes som inaktiv.

Det der lyder basalt forkert, lyder som du har en klasse, og for hver bombe laver du en ny timer i klassen, men ikke en ny instans af klassen. Hvis det er sandt så uden jeg kender koden må begge tråde jo om nødvendig dele den samme objekt data og dermed også timeren.

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 20.10.2008 18:00 af Bruger #5620
@Nørden
Jeg laver en ny instans for hver bombe:

Bomb b = new Bomb();
b.activate(); //Tæl ned
bombs.add(b);

@Andreas
Mere eller mindre sandt...
Problemet er at jeg ikke kan have en act() metode i actors-klassen. (For at bruge dit eksempel), da en eksplosion påvirker flere forskellige andre klasser.

Det du mener er formentlig noget i nærheden af en global timer - altså ét Timer-objekt i GameEngine klassen, der kører en "cycle" med x ms mellemrum. Så har jeg i bomb en int startende på 5 F.eks. og når denne når 0 skal den eksplodere.

Igen får jeg har et problem, da jeg stadig bliver nødt til at køre hele listen af bomber igennem i GameEngine klassen - og det er her jeg tror den er gal.

Jeg er blank! Og jeg vil tro i sikkert ville få mere ud af min kode, så nu prøver jeg at implementere en global timer og vender tilbage med resultat og evt. kode til dem der måtte finde det interessant :)

Tak for response indtil videre!



Indlæg senest redigeret d. 21.10.2008 00:41 af Bruger #14297
t