Hur inaktiverar jag en funktion? Actionscript 3.0

Permalänk
Medlem

Hur inaktiverar jag en funktion? Actionscript 3.0

Tja!

Utvecklar ett spel i Flash och kodar med Actionscript 3.0 men har fastnat på en jävla irriterande detalj.
Koden för den relevanta delen: (Tror jag)

public function onTick(timerEvent:TimerEvent):void { if (Math.random() < 0.008) { var newEnemyAxemen = new EnemyAxemen(605, 200); enemyArmy.push(newEnemyAxemen); addChild(newEnemyAxemen); } for each (var axemen:Axemen in army) { axemen.moveForward(); } for each (var enemyAxemen:EnemyAxemen in enemyArmy) { enemyAxemen.moveForwardE(0.5); } // Collision for each (var axemen:Axemen in army) { for each (var enemyAxemen:EnemyAxemen in enemyArmy) { if (axemen.hitTestObject(enemyAxemen)) { // VAD SKA MAN SKRIVA HÄR? } } } }

När man kör spelet dyker det upp "fienden" från höger och rör sig till vänster. Genom att trycka på en knapp skapar man egna soldater som börjar vandra in från vänster. Problemet är att när två soldater möts på mitten är det meningen att dem ska stanna och ett filmklipp ska spelas upp, men jag lyckas inte få dem att stanna. Denna funktionen finns i båda "sidors" soldatklasser:

public function moveForwardE(xMove:Number):void { x = x - xMove; }

Någon som kanske har någon idé hur man ska få båda sidors soldater att stanna upp vid kollision?
Om jag har glömt någon kod som kanske behövs så är det bara att fråga!
Tack på förhand! Ha en bra dag!

Permalänk
Medlem

Rent spontant så hade jag bakat in en boolean i axemen-objektet som håller reda på huruvida han rör på sig eller inte som förslagsvis kan heta isMoving, sedan kollar du om isMoving är true innan du flyttar honom, och sätter den till false när du vill att han ska stanna.

Visa signatur

Detta är första varningen va, jag ämnar brisera ur denna japanska kampställning och fullständigt förinta dig om inte du försvinner härifrån.

Permalänk
Medlem
Skrivet av Loaded:

Rent spontant så hade jag bakat in en boolean i axemen-objektet som håller reda på huruvida han rör på sig eller inte som förslagsvis kan heta isMoving, sedan kollar du om isMoving är true innan du flyttar honom, och sätter den till false när du vill att han ska stanna.

Hej och tack för att du tog dig tid att svara!

Jag testade just detta men nackdelen är att när en av "fiendesoldaterna" stannar så stannar alla. Jag har inte blivit så bra på det här med 'for - loopen' än så jag vet inte riktigt hur jag kodar så det bara påverkar en av "soldaterna" i min array.

Du har inte någon idé på hur man kan använda sig av din metod fast bara så det gäller den aktuelle "soldaten"?

Tack!

Permalänk
Medlem

Jo, du borde kunna använda dig av nyckelordet "this" för att referera till en specifik instans av en klass, värt att kolla upp.

Visa signatur

Detta är första varningen va, jag ämnar brisera ur denna japanska kampställning och fullständigt förinta dig om inte du försvinner härifrån.

Permalänk
Medlem
Skrivet av SuitUp:

Hej och tack för att du tog dig tid att svara!

Jag testade just detta men nackdelen är att när en av "fiendesoldaterna" stannar så stannar alla. Jag har inte blivit så bra på det här med 'for - loopen' än så jag vet inte riktigt hur jag kodar så det bara påverkar en av "soldaterna" i min array.

Du har inte någon idé på hur man kan använda sig av din metod fast bara så det gäller den aktuelle "soldaten"?

Tack!

Du har nog missförstått vad Loaded sa lite. En instans av EnemyAxemen-klassen har ju just nu en position, dvs. en x och en y koordinat. Varje instans har alltså sina egna koordinater. Vad Loaded föreslog var att varje instans också får t.ex. en boolean som talar om ifall den ska röra sig eller inte, och som du kontrollerar inuti loopen där du flyttar runt dem.

Om alla soldater stannar så har du förmodligen bara en boolean någonstans som du kontrollerar, dvs. alla instanser använder samma boolean. Om alla instanser istället har sin egen boolean så ska du kunna stoppa/starta dem oberoende av alla andra instanser.

Tyvärr så har jag aldrig använt Actionscript, så jag vet inte riktigt hur syntaxen för detta blir. Men om jag inte är helt ute och cyklar så borde EnemyAxemen-klassen se ut ungefär så här (EnemyAxemen borde egentligen heta EnemyAxeman förresten, eftersom en instans är en yxman och inte flera):

public class EnemyAxeman { private var x : Number; private var y : Number; private var is_moving : Boolean; public function EnemyAxeman(x : Number, y : Number, is_moving : Boolean) { ... } public function moveForwardE(xMove:Number):void { ... } etc... public function isMoving() : Boolean { return is_moving; } public function stopMoving() : void { is_moving = false; } public function startMoving() : void { is_moving = true; } }

Permalänk
Medlem

Tackar så mycket för ett utförligt svar perost!

Jag skrev om "moveForwardE" funktionen på följande sätt:

public function moveForwardE(isMoving:Boolean):void { if (isMoving) { x = x - 0.5; } else{x = x - 0;} }

I for-loopen:

for each (var enemyAxemen:EnemyAxemen in enemyArmy) { enemyAxemen.moveForwardE(true); }

I kollisionskontrollen gjorde jag denna ändring:

if (axemen.hitTestObject(enemyAxemen)) { for each(var enemyAxmen:EnemyAxemen in enemyArmy) { enemyAxemen.moveForwardE(false); } }

Jag har kollat med hjälp av en "output"-funktion att det fungerar men soldaten stannar inte, tror det har att göra med min usla

x = x - 0;

ovan.

Någon sitter på en bättre kod på hur man helt enkelt tar bort rörelsen?
Tack för all hjälp hittills perost och Loaded!

Permalänk
Medlem

Den här koden:

for each(var enemyAxmen:EnemyAxemen in enemyArmy) { enemyAxemen.moveForwardE(false); }

kommer inte att göra någonting. Den kommer att anropa moveForwardE med false, vilket kommer köra "x = x - 0", dvs. den gör ingenting. Eftersom du inte sparat någon information om vilka soldater som kan förflytta sig så kommer nästan anrop till moveForward med true som argument att flytta på soldaterna. Du kan alltså ta bort hela den for-loopen utan att påverka programmet alls.

Det du måste göra är alltså att spara information någonstans om vilka soldater som ska röra sig, t.ex. på det sättet jag beskrev ovan.