Litet dilemma i actionscript 3.0

Permalänk

Litet dilemma i actionscript 3.0

Hej, har lite problem med ett Blackjackspel. Problemet är att den vill inte gå igenom den första funktionen utan går direkt till den andra och jag fattar inte varför... Någon som kan peka ut felen, då jag inte får några errors heller... Obs. det här är bara lite kod. Inget är färdigt än. Det den gör är att den slumpar ut kort på scenen, i olika positioner. .
import flash.display.MovieClip;

//stop();

var cardArray:Array = new Array(kort1,kort2,kort3);
var knapp:MovieClip = new startknapp;
addChild(knapp);
knapp.width = 100;
knapp.height = 50;
knapp.x = 100;
knapp.y = 200;
knapp.addEventListener(MouseEvent.CLICK,spelare);

function spelare(e:MouseEvent):void {

z=0;

for (var k:int = 0; k<2; k++) {
var pickCard1 = cardArray[int(Math.random() * cardArray.length)];
var card1:MovieClip = new pickCard1();
addChild(card1);
card1.x= 250;
card1.y=300;

if (k<2) {
for (var n:int = 0; n<2; n++) {
card1.x = 250 + z;
card1.y = 300;
z=z+50;

}

}
}
}
knapp.removeEventListener(MouseEvent.CLICK,spelare);
knapp.addEventListener(MouseEvent.CLICK,dealer);
function dealer(e:MouseEvent):void {
z=0;

for (var i:int = 0; i<2; i++) {
var pickCard = cardArray[int(Math.random() * cardArray.length)];
var card:MovieClip = new pickCard();
addChild(card);
card.x= 250;
card.y=100;

if (i<2) {
for (var j:int = 0; j<2; j++) {
card.x = 250 + z;
card.y = 100;
z=z+50;

}

}
}

Visa signatur

Det va bättre förr, ju förr desto bättre.

Permalänk
Medlem

Är tanken att funktionerna ska köras när någon klickar på musknappen?
Som du gjort nu lägger du först till att spelare() ska köras vid mouseclick, sen tar du bort det så inget kommer hända vid mouseclick och sedan lägger du till att dealer() ska köras vid mouseclick.

Vill du ens att funktionerna ska köras vid just ett mouseclick eller ska de köras direkt när programmet startas?
I vilken ordning vill du att de ska köras?
Om båda funktionerna ska köras vid mouseclick kan du göra en funktion som heter mouse_click() eller dylikt som i sin tur kallar på de båda funktionerna i rätt ordning.

Svarar med viss reservation för att jag egentligen inte förstår vad det är du vill ha gjort.

Permalänk

Hej tack för ditt svar!

Tanken är att man ska klicka på en knapp som först delar ut korten till spelaren sen vid nästa klick så delas kort ut till dealern, då la jag till den där listener funktionen som ska kalla på funktionen spelare, så att det delas ut två kort i for-loopen, sen så tas listenern bort som kallar på funktionen spelare vid musklick, sen skapas en ny listener som anropar dealer osv.

så man ska trycka två gånger och då ska den dela ut 4 kort.

Visa signatur

Det va bättre förr, ju förr desto bättre.

Permalänk
Medlem

Ok. Problemet är att koden inte körs rakt uppifrån och ned. Den stannar därför inte och väntar på att någon klickar innan den kör vidare. Således skiter den fullständigt i att någonsin köra spelare(), då du tagit bort eventlistenern som ska aktivera den funktionen långt innan någon hinner klicka på musknappen.

Jag skrev om koden lite, så den alternerar mellan att köra spelare() och dealer() vid musklick. Är väldigt ringrostig vad gäller Actionscript och har inte riktigt möjlighet att testa koden själv, men principen ska iaf fungera.

import flash.display.MovieClip; //stop(); var cardArray:Array = new Array(kort1,kort2,kort3); var knapp:MovieClip = new startknapp; addChild(knapp); knapp.width = 100; knapp.height = 50; knapp.x = 100; knapp.y = 200; function spelare():void { z=0; for (var k:int = 0; k<2; k++) { var pickCard1 = cardArray[int(Math.random() * cardArray.length)]; var card1:MovieClip = new pickCard1(); addChild(card1); card1.x= 250; card1.y=300; if (k<2) { for (var n:int = 0; n<2; n++) { card1.x = 250 + z; card1.y = 300; z=z+50; } } } } function dealer():void { z=0; for (var i:int = 0; i<2; i++) { var pickCard = cardArray[int(Math.random() * cardArray.length)]; var card:MovieClip = new pickCard(); addChild(card); card.x= 250; card.y=100; if (i<2) { for (var j:int = 0; j<2; j++) { card.x = 250 + z; card.y = 100; z=z+50; } } } } var state:int = 0; function mouseClick(e:MouseEvent):void { if (state == 0) { spelare(); state = 1; } else { dealer(); state = 0; } } knapp.addEventListener(MouseEvent.CLICK,mouseClick);

Permalänk

Ja! Tack så mycket, fungerar prima! Levde i tron att den gick uppifrån och ned men nu så förstår jag varför det inte fungerar så.

Visa signatur

Det va bättre förr, ju förr desto bättre.

Permalänk
Medlem

Den går ju iofs uppifrån och ned, men den kod som ligger inne i en funktion körs först när man gör ett funktionsanrop.
Det kan därför vara en god idé att strukturera programmet så att funktionerna inte hamnar huller om buller med den globala koden. I ditt fall kan det t.ex. vara bra att längst upp deklarara alla globala variabler, sedan kommer funktionerna och längst ned kommer "huvudkoden" som kallar på funktionerna och lägger till event listeners.
Idealt sett ska kod skriven i Actionscript vara objektorienterad, så ovanstående tips är inget man bör följa till större projekt.

Permalänk

Hej igen, nu har vi ett problem till. Våran lärare är också helt omotiverad att hjälpa oss.

Problemet är att vi försöker splice:a ut korten ur arrayn. Men splice funktionen fungerar inte. Vart tänker vi fel? tacksam för svar!

import flash.display.MovieClip; //stop(); var cardArray:Array = new Array(H2,H3,H4,H5,H6,H7,H8,H9,101,HJ1,HQ1,HK1,HA1,RA,R2,R3,R4,R5,R6,R7,R8,R9,R10,RJ,RQ,RK,SA); var knapp:MovieClip = new startknapp; addChild(knapp); knapp.width = 100; knapp.height = 50; knapp.x = 100; knapp.y = 200; knapp.addEventListener(MouseEvent.CLICK,petter); var w:int=0 var b:int=0 var c:int=0 var t:int=0 function spelare():void { for (var k:int = 0; k<2; k++) { var kort:int=(Math.random() * cardArray.length) var pickCard1 = cardArray[kort]; trace(kort); var card1:MovieClip = new pickCard1(); addChild(card1); card1.x= 250; card1.y=500; cardArray.splice((kort-1),1); if (k<2) { for (var n:int = 0; n<2; n++) { card1.x = 250; card1.y = 500; } } } } function dealer():void { for (var i:int = 0; i<1; i++) { var kort1:int=(Math.random() * cardArray.length) var pickCard = cardArray[kort1]; var card:MovieClip = new pickCard(); cardArray.splice((kort1-1),1); addChild(card); card.x= 250; card.y=100; trace(kort1); if (i<1) { for (var j:int = 0; j<1; j++) { card.x = 250; card.y = 100; } } } } var tom:int; tom= 0; function petter(e:MouseEvent):void { if(tom==0) { spelare(); tom=1; } else { dealer(); removeChild(knapp); var knapp2:MovieClip = new startknapp2; addChild(knapp2); knapp2.x = 100; knapp2.y = 200; knapp2.addEventListener(MouseEvent.CLICK,hit); var knapp3:MovieClip = new startknapp3; addChild(knapp3); knapp3.x = 100; knapp3.y = 300; knapp3.addEventListener(MouseEvent.CLICK,stand); } } function hit(e:MouseEvent):void { for (var h:int = 0; h<1; h++) { if (h<1) { c=c+50; } else { t=t+50; } var pickCard2 = cardArray[int(Math.random() * cardArray.length)]; var card2:MovieClip = new pickCard2(); addChild(card2); card2.x= 250+t; card2.y= 500; if (h<1) { for (var g:int = 0; g<1; g++) { card2.x = 250+c; card2.y = 500; } } } } function stand(e:MouseEvent):void { for (var q:int = 0; q<1; q++) { if (q<1) { b=b+50; } else { w=w+50; } var pickCard3 = cardArray[int(Math.random() * cardArray.length)]; var card3:MovieClip = new pickCard3(); addChild(card3); card3.x= 350+w; card3.y= 100; if (q<1) { for (var g:int = 0; g<1; g++) { card3.x = 350 + b; card3.y = 100; } } } }

Visa signatur

Det va bättre förr, ju förr desto bättre.

Permalänk
Medlem

Är problemet att korten stannar kvar på skärmen? För det kommer bli så när man kör splice. Splice tar bort objektet så att man inte längre kan modifiera det eller dylikt, men det tas aldrig bort helt utan kommer ligga i bakgrunden och fortfarande visas på skärmen. Du måste köra removeChild innan splice för att även ta bort den visuellt.

Citat:

removeChild(cardArray[kort-1])
cardArray.splice((kort-1),1);

Permalänk

Nej problemet är att den inte tar bort det vi splice:at ur arrayn,. de ska vara kvar på skärmen

Visa signatur

Det va bättre förr, ju förr desto bättre.

Permalänk

Nu har vi ordnat till koden, det va mycket fulkod och så. Jag tänkte att det vore bäst att posta den fungerande koden ifall någon annan har liknande problem.

import flash.display.MovieClip; import flash.events.MouseEvent; //stop(); var cardArray:Array = new Array(H2,R2,H3,R3,H4,H5,H6,H7,H8,H9,H101,RA,R4,R5,R6,R7,R8,R9,R10,HK1,HJ1,HQ1,HA1,RJ,RQ,RK,SA); var bakgrundgame:MovieClip = new bakgrundspel; var knapp:MovieClip = new startknapp; var bakgrundmenu:MovieClip = new bakgrundmeny; var spela2:MovieClip= new spela; var alternativ2:MovieClip= new alternativ; var credits2:MovieClip= new credits; var highscore2:MovieClip= new highscore; var avsluta2:MovieClip= new avsluta; addChild(bakgrundmenu); bakgrundmenu.x = 0; bakgrundmenu.y = 0; addChild(spela2); spela2.width = 160; spela2.height = 50; spela2.x = 100; spela2.y = 200; addChild(alternativ2); alternativ2.width = 200; alternativ2.height = 50; alternativ2.x = 150; alternativ2.y = 480; addChild(credits2); credits2.width = 160; credits2.height = 50; credits2.x = 100; credits2.y = 580; addChild(highscore2); highscore2.width = 200; highscore2.height = 50; highscore2.x = 100; highscore2.y = 680; addChild(avsluta2); avsluta2.width = 160; avsluta2.height = 50; avsluta2.x = 100; avsluta2.y = 780; spela2.addEventListener(MouseEvent.CLICK,meny); function menyspela():void { removeChild(bakgrundmenu); removeChild(spela2); addChild(bakgrundgame); bakgrundgame.x = 0; bakgrundgame.y = 0; addChild(knapp); knapp.x = 100; knapp.y = 200; knapp.width = 100; knapp.height= 50; spela2.removeEventListener(MouseEvent.CLICK,meny); knapp.addEventListener(MouseEvent.CLICK,deal); } var b:int=0 var t:int=0 function spelare():void { var kort1:int = Math.floor((Math.random() * cardArray.length)); var pickCard1 = cardArray[kort1]; cardArray.splice(kort1,1); trace(kort1); var card1:MovieClip = new pickCard1(); addChild(card1); card1.x= 250; card1.y=500; } function dealer():void { var kort:int = Math.floor((Math.random() * cardArray.length)); var pickCard = cardArray[kort]; cardArray.splice(kort,1); trace(kort); var card:MovieClip = new pickCard(); addChild(card); card.x = 250; card.y = 100; } function meny(e:MouseEvent):void { menyspela(); } var tom:int; tom= 0; function deal(e:MouseEvent):void { if(tom==0) { spelare(); tom=1; } else { dealer(); removeChild(knapp); var knapp2:MovieClip = new startknapp2; addChild(knapp2); knapp2.x = 100; knapp2.y = 200; knapp2.addEventListener(MouseEvent.CLICK,hit); var knapp3:MovieClip = new startknapp3; addChild(knapp3); knapp3.x = 100; knapp3.y = 300; knapp3.addEventListener(MouseEvent.CLICK,stand); } } function hit(e:MouseEvent):void { var kort2:int = Math.floor((Math.random() * cardArray.length)); var pickCard2 = cardArray[kort2]; cardArray.splice(kort2,1); trace(kort2); var card2:MovieClip = new pickCard2(); addChild(card2); card2.x = 300+t; card2.y = 500; t=t+50; } function stand(e:MouseEvent):void { var kort3:int = Math.floor((Math.random() * cardArray.length)); var pickCard3 = cardArray[kort3]; cardArray.splice(kort3,1); trace(kort3); var card3:MovieClip = new pickCard3(); addChild(card3); card3.x= 300+b; card3.y= 100; b=b+50; }

Visa signatur

Det va bättre förr, ju förr desto bättre.