I'm working on a game, in my game the user acquires weapons (cupcakes) throughout the levels. I have a button that the player clicks to change to the next cupcake (weapons acquired are stored in an array).
Here's my problem: if the player acquires 2 yellow cupcakes, 1 red cupcake, and 2 blue cupcakes, how do I navigate through the array without showing the same cupcake twice? My button looks as if it's not changing weapons, when in code it is, it's going to the next element in the array but it's the same weapon [yellow cupcake, yellow cupcake, red cupcake, blue cupcake, blue cupcake].
public function CupcakeChangeButton(e: MouseEvent) {
cakeButtonCounter++;
//Make sure the cakeButtonCounter never exceeds the amount of
//elements in array
if (cakeButtonCounter >= CupcakesArray.length - 1) {
cakeButtonCounter = 0;
}
//NOTE: may need function called "cupcake count", this function should
//be called at the beginning of THIS function and in the constructor function
//Should count the amount of cupcakes and maybe set wasSeen Elements to No
/*
The switch statment makes its decisions based on the type of cupcake
is the current elment. The current element is represented by
"cakeButtonCounter" (CupcakesArray[cakeButtonCounter])
The if statements decides if the cupcake has been seen already.
If it hasnt been seen, it sets the button's text box to show how many of
those kind of cupcakes are left.
After the amount of cupcakes of that type is shown in the text box,
the "unshift" method is used to place "yes" in the first element, of it's
own Array type, WITHIN THE WAS SEEN ARRAY.......confusing!!!!!!
Example:
wasSeen.PinkCupcake.unshift("yes") = wasSeen.PinkCupcake[0] == "yes"
This is done so that we can keep track of what cupcakes has been seen
already
When the game is initialized the was seen elements are set to "no". So when
it's set to "yes", after being seen, The initial value,"no", is placed in the
next element. It's no longer needed, so we use the "splice" method to delete it
and HOPEFULLY, remove it from memory
The "else" block of code takes place if the cupcake has already been seen.
It increments the cakeButtonCounter so that the button will display the next
cupcake in the array, that has NOT been seen
After all decisions are made,(which cupcakes are next and which cupakes have
been seen)
Update the button's face by displaying the next cupcake that hasnt been seen
(button goes to and stop and next element)
NOTE: The ACTUAL case will be the dynamic var cupcake type (the NAME not the actual
cupcake)
*/
switch (CupcakesArray[cakeButtonCounter]) {
case "PinkCupcake":
if (wasSeen.PinkCupcake[0] == "no") {
CupcakeNavigationBox.countBox.text = "x" + PinkCupcakeCount;
wasSeen.PinkCupcake[0] == "yes";
trace("element change? " + wasSeen.PinkCupcake[0]);
} else {
cakeButtonCounter++;
trace("if yes...its starting that way " + wasSeen.PinkCupcake[0]);
}
break;
case "YellowCupcake":
if (wasSeen.YellowCupcake[0] == "no") {
CupcakeNavigationBox.countBox.text = "x" + YellowCupcakeCount;
wasSeen.YellowCupcake[0] == "yes";
} else {
cakeButtonCounter++;
}
break;
case "GreenCupcake":
if (wasSeen.GreenCupcake[0] == "no") {
CupcakeNavigationBox.countBox.text = "x" + GreenCupcakeCount;
wasSeen.GreenCupcake[0] == "yes";
} else {
cakeButtonCounter++;
}
break;
case "PurpleCupcake":
if (wasSeen.PurpleCupcake[0] == "no") {
CupcakeNavigationBox.countBox.text = "x" + PurpleCupcakeCount;
wasSeen.PurpleCupcake[0] == "yes";
} else {
cakeButtonCounter++;
}
break;
}
CupcakeNavigationBox.buttonFace.gotoAndStop(CupcakesArray[cakeButtonCounter]);
changeCupcake();
}
You should instead store available types of weapons in the array from where you choose the weapon type. Also, that array should contain int
s, because apparently your cupcakes are spent on fire/action, thus you will have the ammo storage array at your disposal. If you need unlocked array, by all means make another array. (Make sure there's a default weapon, though, or else cake selection function can go into an infinite loop)
var cupcakesAmmo:Array=[0,0,0,0,0,0,0]; // as many as you have types of cupcakes
var cupcakesTypes:Array=[RedCupcake,YellowCupcake,PinkCupcake,GreenCupcake,BlueCupcake,PurpleCupcake,BlackCupcake];
// let's say we have seven cupcakes
var currentCupcake:int; // the selected weapon
function cupcakeChangeButton(e: MouseEvent) {
// first check if we actually have anything to change to
var weHave:int=0; // how many different cupcakes we have
var i:int;
for (i=0;i<cupcakesAmmo.length;i++) if (cupcakesAmmo[i]>0) weHave++;
if (weHave<2) return; // hehe, we either have no cupcakes or just one type of em
// otherwise let's change
do { // we have to do this at least once
currentCupcake++;
if (currentCupcake==cupcakesAmmo.length) currentCupcake=0; // change type
} while (cupcakesAmmo[currentCupcake]==0); // change until we find the type with nonzero ammo
// okay, type selected, let's get proper display
CupcakeNavigationBox.countBox.text = "x" + cupcakesAmmo[currentCupcake];
// see, no switch is needed! Just get the data off your array :)
// TODO change the displayed cupcake too (I don't see where you do this)
}