AS3 Custom Cursors Invisible - actionscript-3

I've made a new question since it makes sense since the problem isn't the same anymore.
I'm making a colouring game.
CanvPark_mc is the Movieclip with the details of creating the canvas and where all the brush details are located. The Huge, Medium and SmallSelected1 variables, are variables that are changed when you click the brushes, so you're able to identify them.
I want to switch cursors depending on the brush that was last clicked. This can be done through the first if paramenters.
Right now, this is my code to switch, thanks to the help of #NBooo in the previous question
var cursor_mc: MovieClip = new MovieClip();
if (CanvPark_mc.HugeSelected1 == true) {
cursor_mc = cursor1_mc; //Big Cursor
removeChild(cursor_mc);
}
if (CanvPark_mc.MediumSelected1 == true) {
cursor_mc = cursor2_mc; //Medium Cursor
removeChild(cursor_mc);
}
if (CanvPark_mc.SmallSelected1 == true) {
cursor_mc = cursor3_mc; //Small Cursor
removeChild(cursor_mc);
}
stage.addEventListener(MouseEvent.MOUSE_MOVE, moveCursor);
function moveCursor(myEvent: MouseEvent) {
if (CanvPark_mc.SmallSelected1 == false && CanvPark_mc.MediumSelected1 == false && CanvPark_mc.HugeSelected1 == false) {
Mouse.cursor = "auto";
} else if (cursor_mc){
addChild(cursor_mc);
setChildIndex(cursor_mc, this.numChildren - 1);
cursor_mc.x = stage.mouseX;
cursor_mc.y = stage.mouseY;
cursor_mc.mouseChildren = cursor_mc.mouseEnabled = false;
Mouse.hide();
}
}
The problem with this code, unfortunately, is that, whenever I click the said buttons, the cursor disappears. It doesn't change itself to any of the MovieClips I previously made.
Note that the removeChild in the if blocks is there in hopes of removing previous instances of cursor_mc on the screen after clicking them in the past.
In tests, it only changes, in the first if blocks, one of the parameters has a = instead of ==.
Example :
if (CanvPark_mc.HugeSelected1 == true) {
cursor_mc = cursor1_mc; // Big Cursor
removeChild(cursor_mc);
}
if (CanvPark_mc.MediumSelected1 == true) {
cursor_mc = cursor2_mc; //Medium Cursor
removeChild(cursor_mc);
}
if (CanvPark_mc.SmallSelected1 = true) {
cursor_mc = cursor3_mc; //This is the one he'll run, showing the smallest cursor
removeChild(cursor_mc);
}
In addition, if they are all reduced down to just =, the code will opt for the last if in the list.
I think there's a problem with my code and I can't tell what it is after hours of trying.
Could any of you help me figure this out?

I found the answer to my own question, so I'll be posting the code to help others out.
var cursor_mc: MovieClip = new MovieClip();
stage.addEventListener(MouseEvent.MOUSE_MOVE, moveCursor);
function moveCursor(myEvent: MouseEvent) {
if (CanvPark_mc.HugeSelected1 == true) {
cursor_mc = cursor1_mc;
cursor1_mc.visible = true;
cursor2_mc.visible = false;
cursor3_mc.visible = false;
}
if (CanvPark_mc.MediumSelected1 == true) {
cursor_mc = cursor2_mc;
cursor1_mc.visible = false;
cursor2_mc.visible = true;
cursor3_mc.visible = false;
}
if (CanvPark_mc.SmallSelected1 == true) {
cursor_mc = cursor3_mc;
cursor1_mc.visible = false;
cursor2_mc.visible = false;
cursor3_mc.visible = true;
}
if (CanvPark_mc.SmallSelected1 == false && CanvPark_mc.MediumSelected1 == false && CanvPark_mc.HugeSelected1 == false) {
Mouse.cursor = "auto";
} else if (cursor_mc) {
addChild(cursor_mc);
setChildIndex(cursor_mc, this.numChildren - 1);
cursor_mc.x = stage.mouseX;
cursor_mc.y = stage.mouseY;
cursor_mc.mouseChildren = cursor_mc.mouseEnabled = false;
Mouse.hide();
}
}
The if block wasn't inside the function, so it wasn't correlating the code togheter. I put it inside as a test and it worked. Since when you click to change your mouse to a brush, the Movieclip starts following your mouse around. If you change to another brush, the movieclip gets left there. This is fixed by toggling it's visibility in the if's. :)
It's working as intended now.
Hope this helps someone!

Related

How can I make a symbol visible only if other two symbols are visible in ActionScript 3.0?

I want to make a symbol visible (symbol3) only if symbol1 and symbol2 are visible in ActionScript 3.0 (Adobe Animate CC), but I can't make it, because I am really new in programming... Can anyone help me? I have this code:
symbol1.visible = false;
symbol2.visible = false;
symbol3.visible = false;
button1.addEventListener(MouseEvent.CLICK, fl_ClickToHide_1);
function fl_ClickToHide_1(event:MouseEvent):void
{
symbol1.visible = true;
}
button2.addEventListener(MouseEvent.CLICK, fl_ClickToHide_2);
function fl_ClickToHide_2(event:MouseEvent):void
{
symbol2.visible = true;
}
symbol3.visible = symbol2.visible && symbol1.visible
Thanks a lot,
Tom
The reason why it doesn't work for you is because symbol3.visible = symbol2.visible && symbol1.visible; is being executed right after all is hidden and buttons listeners were added. After you click buttons only code in fl_ClickToHide_1 or fl_ClickToHide_2 is being executed and in there you just change visibility of one symbol. If you want to execute checking after click you can do something like that:
symbol1.visible = false;
symbol2.visible = false;
symbol3.visible = false;
button1.addEventListener(MouseEvent.CLICK, fl_ClickToHide_1);
function fl_ClickToHide_1(event:MouseEvent):void
{
symbol1.visible = true;
do_magic();
}
button2.addEventListener(MouseEvent.CLICK, fl_ClickToHide_2);
function fl_ClickToHide_2(event:MouseEvent):void
{
symbol2.visible = true;
do_magic();
}
function do_magic():void
{
symbol3.visible = symbol2.visible && symbol1.visible;
}

AS3 Collision Detection Arrays

I've been trying to figure out an easier way to code this for a simple RPG I have been working on, it works perfectly if the item that is unable to pass through is added individually. When I've tried to work with arrays, it throws off a bunch of evil errors. Granted I am new to AS3 but I have tried to find a solution to this, with no luck.
if(heroMC.hitTestObject(block1)) {
hitObj = true;
heroMC.x = gX;
heroMC.y = gY;
} else if(heroMC.hitTestObject(bridgeBlock2)) {
hitObj = true;
heroMC.x = gX;
heroMC.y = gY;
} if(heroMC.hitTestObject(bridgeBlock3)) {
hitObj = true;
heroMC.x = gX;
heroMC.y = gY;
} else {
hitObj = false;
gX = heroMC.x;
gY = heroMC.y;
}
I then add every individual entry, to my list. If heroMC does intersect the object, then it changes the value of hitObj to true. If nothing is colliding, the hitObj will return as false. What solutions could I use to make this easier and cleaner.
Thanks in advance guys.
Insert your blocks MovieClips into an array
var blocksArray: Arry = new Array(block1, bridgeBlock2, bridgeBlock3);
Add Enter frame handler event for catch the changes
this.addEventListener(Event.ENTER_FRAME, onEnterFramehandler);
function onEnterFramehandler(e: Event): void {
//initially set it to false
hitObj = false;
for (var i: uint = 0; i < blocksArray.length; i++) {
//If hit the object set it to true;
if (heroMC.hitTestobject(blocksArray[i])) {
hitObj = true;
//set the position of the heroMc if true
heroMC.x = gX;
heroMC.y = gY;
break;
}
}
//get the position of the heroMc if false
gX = heroMC.x;
gY = heroMC.y;
}

how to disable movieclip?

I am using Adobe Flash CS5, Action Script 3.0. I want to disable my movie clip. How to do that?
My code:
var index:Array = ([0,1,2,3]);
var radioGroup1:RadioButtonGroup = new RadioButtonGroup("question1");
rb1.group = radioGroup1;
rb2.group = radioGroup1;
rb3.group = radioGroup1;
rb4.group = radioGroup1;
b1.addEventListener(MouseEvent.CLICK, submitclick,false);
function submitclick(event:MouseEvent):void
{
if (radioGroup1.selectedData == null)
{
b1.mouseEnabled = false;
//ExternalInterface.call("Test","Please selecte one answer");
//return;
} else {
if (radioGroup1.getRadioButtonIndex(radioGroup1.selection) == 2)
{
myscore += 10;
}
}
if (compquest>=maxquest)
{
gotoAndStop(1,"Scene 6");
}
else
{
MovieClip(this.root).gotoAndStop(1, "Scene " + questions[compquest++]);
}
}
I want to disable this b1 movieclip. So anyone could tell me what am I doing wrong?
If, by disable, you mean to make it unclickable and faded like a disabled button. Just reduce the alpha a bit and set its mouseEnabled property to false.
function submitClick(event:MouseEvent){
b1.alpha = .6;
b1.mouseEnabled = false;
}
This way the user will not be able to click it and it appear disabled.
First you could write, because event.target is p1:
function submitclick(event:MouseEvent):void
{
event.target.mouseEnabled = false;
}
On the other hand, the condition you want to evaluate in your if statement is probably false:
radioGroup1.selectedData == null
Therefore the associated code isn't executed:
b1.mouseEnabled = false;
You should test in your function and before your if statement:
trace(radioGroup1.selectedData == null);

Customizing Clothes on Character in Game User Personalization

I could use help with customization in Flash games! I am pretty new to AS3 and have a game I am building where the user can dress the character based on a few options and a color picker, then move on to a race. I cannot get the clothes that are chosen to stay, and the ones excluded leave, without all of them staying or leaving. I've tried variables, if/else conditions and switch statements, but nothing is working. I have a feeling it's a condition, but I don't know how to write it and can't find anyone in a similar boat.
I have been scouring my books (Flash CS6 Missing Manual and ActionScript 3.0 Cookbook), and I've gotten very close, but nothing works. I really could use a lot of help with this, it's a final project and the stress might be hiding the answer, but I surely don't have it.
Not sure if I did this right, I've never used this site before. Thank you in advance!
UPDATE
Here is a link to where the .swf file is currently uploaded for your input.
http://yellownotebook.weebly.com/other-work.html
Please ignore the DONE button at the beginning, I am working on that still. I need the clothes to be invisible on the start up, and the remaining unselected clothes after that to be discarded? Invisible? I still don't understand which way is best for this situation. I started reading something about Display Lists?
I'm also not sure what part of the code would be most helpful, so here it is.
var mcdress2 = mcdress2
var mcpants = mcpants
var mcshirt = mcshirt
var mctop = mctop
var clothes = mctop + mcpants + mcshirt + mcdress2
var fairy = clothes + mcwings + mcfay
mcfay.visible = false;
mctop.visible = false;
mcshirt.visible = false;
mcpants.visible = false;
mcdress2.visible = false;
mcwings.visible = false;
cpClothes.visible = false;
import fl.events.ColorPickerEvent;
fairybg.btnplay.addEventListener(MouseEvent.CLICK,clickPlayListener);
btndone.addEventListener(MouseEvent.CLICK,clickDoneListener);
fairybg.gotoAndStop("Game Start");
function clickPlayListener(evt:MouseEvent):void
{
fairybg.gotoAndStop("Background Start")
mcfay.visible = true;
mctop.visible = true;
mcshirt.visible = true;
mcpants.visible = true;
mcdress2.visible = true;
mcwings.visible = true;
cpClothes.visible = true;
}
//fairy.scaleY = fairy.scaleX
function clickDoneListener(evt:MouseEvent):void
{
fairybg.gotoAndStop("Background Fly")
fairybg.gotoAndStop("Background Fly")
//fairy.width = 1/2
//fairy.height = 1/2;
//if it was this way, she would be bare when she flies, needs "if" condition?
//mctop.visible = false;
//mcshirt.visible = false;
//mcpants.visible = false;
//mcdress2.visible = false;
cpClothes.visible = false;
btndone.visible = false;
}
//fairy.scaleY = fairy.scaleX
mcdress2.gotoAndStop(1);
mcdress2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
function mouseDownListener (event:MouseEvent):void
{
mcdress2.gotoAndStop("Dress End");
mctop.gotoAndStop("Top Start");
mcpants.gotoAndStop("Pants Start");
mcshirt.gotoAndStop("Shirt Start");
}
mcshirt.gotoAndStop(1);
mcshirt.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener2);
function mouseDownListener2 (event:MouseEvent):void
{
mcshirt.gotoAndStop("Shirt End");
mcdress2.gotoAndStop("Dress Start");
mctop.gotoAndStop("Top Start");
}
mcpants.gotoAndStop(1);
mcpants.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener3);
function mouseDownListener3 (event:MouseEvent):void
{
mcpants.gotoAndStop("Pants End");
mcdress2.gotoAndStop("Dress Start");
}
mctop.gotoAndStop(1);
mctop.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener4);
function mouseDownListener4 (event:MouseEvent):void
{
mctop.gotoAndStop("Top End");
mcshirt.gotoAndStop("Shirt Start");
mcdress2.gotoAndStop("Dress Start");
}
//use color picker to change clothing color (all items same color)
cpClothes.addEventListener(ColorPickerEvent.CHANGE,changeColorPicker);
function changeColorPicker(evt:ColorPickerEvent):void
{
var myColorTransform = new ColorTransform ();
myColorTransform.color = evt.color;
mcdress2.transform.colorTransform = myColorTransform;
mctop.transform.colorTransform = myColorTransform;
mcshirt.transform.colorTransform = myColorTransform;
mcpants.transform.colorTransform = myColorTransform;
//trace ("color changed")
//trace (evt.color)
//trace (mcdress.color)
//opaqueBackground = evt.color;
}
cpClothes.colors =
[0xF7977A,0xFFF79A,0x6ECFF6,0xF49AC2];
switch (clothes) {
case "Dress End" :
mcshirt.visible = false;
mctop.visible = false;
mcpants.visible = false;
break;
case "Top End" :
mcshirt.visible = false;
mcdress2.visible = false;
mcpants.visible = false;
break;
case "Shirt End" :
mctop.visible = false;
mcdress2.visible = false;
mcpants.visible = false;
break;
default :
//mcdress2.gotoAndStop("Dress Start")
//mctop.gotoAndStop("Top Start")
//mcshirt.gotoAndStop("Shirt Start")
//mcpants.gotoAndStop("Pants Start")
mcdress2.visible = true;
mctop.visible = true;
mcshirt.visible = true;
mcpants.visible = true;
}
/*if (clickDoneListener==true) {
fairy.width = .5
fairy.height = .5;
}*/
//trace ("it works!")
//var _mcpants:mcpants;
//function newmcpants(e:MouseEvent):void
//{
//if (_mcpants)
// return
//_mcpants = new mcpants();
//_mcpants.x = 263.35;
//_mcpants.y = 270.40;
//addChild(_mcpants);
//}
//function deletemcpants(e:MouseEvent):void;
//{
//if (_mcpants && contains(_mcpants))
//removeChild(_mcpants);
//_mcpants = null;
//displayText("Deleted mcpants successfully!");
//}
As you can see, I have a lot of code commented out, I have been trying everything I can find for it to work. I also am trying to scale her down 50% after the DONE button is clicked and the game is started, but I have not figured out a way for that one either. Thank you so so much for any help!
You must add information to your system about which clothes have been selected. You are right that it is about conditionals but your conditional will need the information to base the selection on. I think there are 3 alternatives:
Manage a collection of the clothes that are put on
Make clothes objects that have a property, cloth.weared = true or false
Have slots for your clothes: upperbody, lowerbody etc. and assign the selected clothes there: upperbody = somecloth;
I made 1. as a bare bones example for you. Hopefully you can understand it! May not be the most elegant solution but does work, is quite simple and I think the logic is quite close to what you already have: http://jsfiddle.net/n37qx/
var selected = [];
var SHIRT = "shirt";
var DRESS = "dress";
var TROUSERS = "trousers";
var all = [SHIRT, DRESS, TROUSERS];
//logic
function putOn(cloth) {
if (arraycontains(selected, cloth)) {
return;
}
//replace check
if (cloth === SHIRT) {
removeIfContains(selected, DRESS);
} else if (cloth === DRESS) {
removeIfContains(selected, SHIRT);
removeIfContains(selected, TROUSERS);
}
selected.push(cloth);
}
function hideNotSelected() {
for (var i=0; i < all.length; i++) {
var cloth = all[i];
if (arraycontains(selected, cloth)) {
log("wearing - not hiding: " + cloth)
} else {
log("hide: " + cloth);
}
}
}
//test flow - code instead of UI actions
log("1. Put on shirt + trousers, dress should get hidden:");
putOn(SHIRT)
putOn(TROUSERS);
hideNotSelected();
log("---");
log("2. Put on dress - trousers and shirt should get hidden:");
putOn(DRESS);
hideNotSelected();
//utilities
...
That is Javascript. Actionscript is basically Javascript (ECMAScript) with extensions. You have nice array helpers there already so don't need the ones I added to the bottom there. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/collections/ArrayList.html

Making an object or layer transparent when another object passes over it. (Flash Actionscript 3.0)

I'm very new to coding and am having trouble finishing the last little bit of a mini game type project for school.
So this is a draft of what the program looks like so far: http://aaronmillard.com/dir/wp-content/uploads/2013/08/Google-Doodle_Roomba.swf
Now what I want the program to do is "vacuum" up the google when the roomba drives over it. The easiest way to achieve this (I think) is to have an exact replica of the carpet layer without the google logo beneath the carpet layer with the google logo. So I would need to code something like "when the object(roomba) passes over object(carpetwithgooglelogo) make object(carpetwithgooglelogo) have 0 opacity." I just can't figure out how to say that in code.
The code as of right now look like this:
// Assign 4 booleans for the 4 arrow keys
var keyUp = false;
var keyDown = false;
var keyLeft = false;
var keyRight = false;
// Add the keyboard event (KEY_DOWN) on the stage
stage.addEventListener(KeyboardEvent.KEY_DOWN, pressKey);
function pressKey(pEvent)
{
// If an arrow key is down, switch the value to true to the assigned variable
if (pEvent.keyCode == 38)
{
keyUp = true;
}
else if (pEvent.keyCode == 40)
{
keyDown = true;
}
else if (pEvent.keyCode == 37)
{
keyLeft = true;
}
else if (pEvent.keyCode == 39)
{
keyRight = true;
}
}
// Add the keyboard event (KEY_UP) on the stage
stage.addEventListener(KeyboardEvent.KEY_UP, releaseKey);
function releaseKey(pEvent)
{
// If the arrow key is up, switch the value to false to the assigned variable
if (pEvent.keyCode == 38)
{
keyUp = false;
}
else if (pEvent.keyCode == 40)
{
keyDown = false;
}
else if (pEvent.keyCode == 37)
{
keyLeft = false;
}
else if (pEvent.keyCode == 39)
{
keyRight = false;
}
}
// Set the velocity of the object
var speed = 4;
// And the rotation speed
var rotationSpeed = 6;
// Add an enter frame event on the moving object
myCircle.addEventListener(Event.ENTER_FRAME, circleEnterFrame);
function circleEnterFrame(pEvent)
{
// Set the default velocity to 0 if no key is pressed
var velocity = 0;
if (keyUp)
{
// If the key up is pressed set the new velocity to the speed value
velocity = speed;
}
if (keyDown)
{
// If the key down is pressed set the new velocity to the half speed value
velocity = -speed/2;
}
if (keyLeft)
{
// rotate the object
pEvent.currentTarget.rotation -= rotationSpeed;
}
if (keyRight)
{
// rotate the object
pEvent.currentTarget.rotation += rotationSpeed;
}
// Convert the degreeAngle to the radian angle
var angleRadian = pEvent.currentTarget.rotation / 180 * Math.PI;
// Move the object with the radian angle and the object speed
pEvent.currentTarget.x += Math.cos(angleRadian) * velocity;
pEvent.currentTarget.y += Math.sin(angleRadian) * velocity;
}
Any help would be very much appreciated! Thanks!
The easiest way is to do something like this:
if( roomba.hitTestObject(google)){
google.alpha = 0;
}
You'll have to check this on every frame using an ENTER_FRAME event.
If this is confusing tell me in the comments and I will clarify with more code.