webForumDet fria alternativet

Ett problem...

9 svar · 352 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 579 inlägg
#1

Behöver ett sätt att hantera missiler i ett enkelt 2d spel.

Det ska gå att skapa hur många som helst.
Missilerna är en klass (CMissiles) och på något sätt som jag inte vet hur, vill jag kunna skapa en ny missil genom att bara skriva en enstaka rad kod.
Hur gör jag detta?!
Är det möjligt att använda en länkad lista? Eller hur ska jag göra det på enklaste och snabbaste sätt? De ska ju försvinna när de kolliderar sen också...

Alpha IIMedlem sedan maj 20002 579 inlägg
#2

Ingen som vet? Vill ha svar snabbt, det är så tråkigt att sitta o göra... ingenting :)

--Ingen som vet hur jag ska hantera missilerna?--

juventus1Medlem sedan dec. 2000401 inlägg
#3

En länkad lista borde gå bra eller en arraylist. Det är nog en smaksak vilken av de två du väljer. Båda är lika snabba när det gäller att lägga till nya missiler och båda är lika långsamma när de skall tas bort.

Alpha IIMedlem sedan maj 20002 579 inlägg
#4

Så när jag tar bort en måste jag skapa flytta ned alla tidigare misiler som finns kvar och sedan sätta en ny längd på arrayen?

Eller ska jag när man lägger till en ny missil gå igenom arrayen och när den hittar en tom plats sätter den en boolean till att den är aktiv?

Bör jag använda en dynamisk array som jag ändrar storlek på hela tiden eller en statisk med kanske... um 20-100 platerser för missiler, vet inte riktigt hur många man komemr att skjuta...

juventus1Medlem sedan dec. 2000401 inlägg
#5

När jag tänker igen borde det vara bättre med en länkad lista. Då behöver man endast gå igenom objekten för att hitta det som skall tas bort och sedan ändra några pekare. Men i en array (jag hade tänkt mig en dynamisk) så måste man också flytta de element som kommer efter det borttagna och därför borde det ta längre tid. Så en länkad lista borde vara bra.

Alpha IIMedlem sedan maj 20002 579 inlägg
#6

Men en statisk array då? Borde inte dte vara snabbast? Eftersom missilerna har en viss levnadstid och det bara komemr vara ett ftal spelare borde man ju kunna förvara alla missiler i en array[100], elelr tänker jag fel? Och sedan går man igenom hela arrayen och letar efter tomma platser när en ny ska skapas? Eller blir det segare?

PeWMedlem sedan juni 20006 839 inlägg
#7

Och sedan går man igenom hela arrayen och letar efter tomma platser när en ny ska skapas? Eller blir det segare?

Ja, när du ska lägga till nya objekt.

Jag röstar även jag för en länkad lista i det här fallet, eftersom du ville ha obegränsat med antal objekt så bör du även göra en dynamisk minnesallokering varje gång ett objekt skapas och varje gång det sparas i en lista. Tänk även på att se till att minnet frigörs på rätt sätt när du ska ta bort objekten.

Å andra sidan brukar väl missiler förvaras nånstans? Då kan man ju sätta en maxgräns på den förvaringen (statisk array) och sen ha obegränsat med förvarings-paket (länkad lista med statiska arrayer). Å tredje sidan kanske det blir väldigt onödigt att hela tiden allokera en massa minne för missiler när man kanske egentligen endast skjuter en handfull åt gången. Kanske finns en annan approach på problemet än att spara alla missiler på en gång?

Alpha IIMedlem sedan maj 20002 579 inlägg
#8

Men skulle inte detta vara mer praktiskt? Det komemr ju aldrig att vara speciellt många missiler ändå.

typedef struct
{
	float	x;
	float	y;
	int	angle;
	int	life; // Så att den försvinner efter ett tag...
} Missile;

Missile	missiles[100];

// Skapa en ny
for(int i=0;i<99;i++)
{
	if (missiles[i].life <= 0)
	{
		missiles[i].life = 100;
		missilies[i].x = rymdfarja.x;
		missilies[i].x = rymdfarja.y;
		missilies[i].angle = rymdfarja.angle;

		break; // Visst avslutar detta loopen?
	}
}
PeWMedlem sedan juni 20006 839 inlägg
#9

Visst. Men du skrev först att du ville ha obegränsat med missiler och detta förutsätter att loopen körs innan nästa missil används. ;)

int i = 0;
do{
  if (missiles[i].life <= 0)
	{
		missiles[i].life = 100;
		missilies[i].x = rymdfarja.x;
		missilies[i].x = rymdfarja.y;
		missilies[i].angle = rymdfarja.angle;
                 }
        i++;
}while(missiles[i].life > 0 && i <99);

Så slipper du "break;" ;)

r
korrigerad kod

Alpha IIMedlem sedan maj 20002 579 inlägg
#10

Ja men sen kom jag på att det bara ska vara 2 spelare (iaf från början, och jag tror kanappast att jag kommer lär amig nätverks programmering inom ett bra tag) och man ska bara kunna skjuta en missil var 3 sekund och missilerna ska försvinna ganska snabbt så det lär inte behöva finnas speciellt många :)

125 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
122 ms — hämta tråd, inlägg och bilagor (db)