[JAVA] Låta en thread sköta en ArrayList?

Permalänk

[JAVA] Låta en thread sköta en ArrayList?

När jag tidigare gjort spel har jag alltid använt arrays för fienderna. Nu har jag ett spel där jag behöver en lista därför att jag inte vet hur många enemies det ska bli...

Hursomhelst vill jag ha en tråd som sköter fienderna men jag vet ju inte hur jag ska göra... alls...

De intressanta delarna:

Space.java

... public static ArrayList enemyList = new ArrayList(); ... public void start() { Thread thPlayer = new Thread(p1); thPlayer.start(); Thread thEnemy = new Thread(???); thEnemy.start(); Thread thSpace = new Thread(this); thSpace.start(); } ... public static void addEnemy() { Opponent fiende = new Opponent((int) (Math.random() * 1280), (int) (Math.random() * 800), 16, 10); enemyList.add(fiende); }

Opponent.java

... public void run() { while(true) { collision(); move(); try { Thread.sleep(10); } catch(InterruptedException ie) { System.out.println(ie); } } } ...

Tacksam för hjälp!

Visa signatur

| Sony A580 | Sigma 10-20/4-5.6 | Tamron 17-50/2.8 | Sigma 70/2.8 Macro | Konica Minolta 50/1.7 | Konicha Minolta 75-300/4.5-5.6 |

Permalänk

Jag är ganska säker på att du inte vill ha separata trådar som sköter fienderna; du kommer snart att få invecklade synkroniseringsproblem mellan trådarna.

Grovt sett så består ett spel av en loop med följande tre steg:

while (running) { CollectInput(); CalculateTimeStep(); RenderImageAndAudio(); }

1. Ta in kommandon från spelaren som sitter vid datorn (tangentbord, mus, spelkontroll, ...). Ifall spelet har en AI så räknas AI'ns simulerade "input" ut här, och den beräkningen baseras på spelets tillstånd från föregående varv av loopen.

2. Beräkna ett tidssteg. Här uppdateras allt tillstånd i spelet baserat på inputen från steg 1 och spelets tillstånd från föregående varv av loopen. Beräkningarna kan innefatta att flytta spelare/fiender, hantera kollisioner, utdela skada, mm.

3. Producera bild och ljud utifrån det nya tillståndet som räknades ut i steg 2 och visa för användaren.

Då jag skriver spelets tillstånd så syftar det till alla variabler som påverkar spelet, dvs positioner på objekt (spelare/fiender/hinder), hastigheter, poäng, liv, mm.

Eftersom du, som du säger, inte vet hur många fiender du kommer att ha så behöver du en mera dynamisk datastruktur än en array, så som ArrayList eller LinkedList. Vilken av de två man vill välja beror på hur man har tänkt att använda dem, de stödjer olika operationer och är olika effektiva i olika fall. Tills vidare tror jag det kommer att fungera bra om du väljer en ArrayList, som är mest lik en vanlig array som du är van att använda.

När du sen ska hantera dina fiender så loopar du typiskt över listan och hanterar dem i sekventiell ordning:

for (int i = 0; i < enemyList.size(); i++) { Opponent opponent = enemyList[i]; // ... }

Det finns möjlighet att snabba upp beräkningarna ifall man kan bearbeta listan parallellt med hjälp av trådar (ifall man har en maskin med flera kärnor/trådar) men det är helt klart överkurs och ingenting jag skulle rekommendera för någon som är nybörjare eller ens har medelmycket programmeringsvana. I regel är datorerna tillräckligt snabba idag för att det inte ska vara några problem att köra det sekventiellt (enkeltrådat) i alla fall.

Permalänk

Min tanke var att man skulle kunna plocka power-ups som gjorde att alla fiender åkte långsam en stund (vilket alltså skulle genomföras genom att låta fiendetråden sleepa en stund) men jag kanske ska överge den idéen?

Visa signatur

| Sony A580 | Sigma 10-20/4-5.6 | Tamron 17-50/2.8 | Sigma 70/2.8 Macro | Konica Minolta 50/1.7 | Konicha Minolta 75-300/4.5-5.6 |

Permalänk
Medlem
Skrivet av Son of Qwerty:

Min tanke var att man skulle kunna plocka power-ups som gjorde att alla fiender åkte långsam en stund (vilket alltså skulle genomföras genom att låta fiendetråden sleepa en stund) men jag kanske ska överge den idéen?

har du en klass för fienter?
kanske kan du använda en static int eller double som delas av alla fiender som multipliceras med dessas hastighet?

Om du inte har alla av samma klass kanske du kan ärva från en klass som har liknande grejer, sen specialicera i subklasserna??