AS3: Touch event problem with drag and drop objects - actionscript-3

I'm new to AS3 and I'm making a drag and drop game with touch events. I'm having problems with the drag and drop objects. My objects are movie clips so there's answer1_mc, answer2_mc, and answer3_mc. When I do a test run, if i click on them for the second time, an error pops up (see the attached image below).
I need the movie clips to not have errors when I tap them more than once.
Please help me :((
//DRAG AND DROP OBJECTS
var answer1PosX: Number = answer1_mc.x;
var answer1PosY: Number = answer1_mc.y;
var answer2PosX: Number = answer2_mc.x;
var answer2PosY: Number = answer2_mc.y;
var answer3PosX: Number = answer3_mc.x;
var answer3PosY: Number = answer3_mc.y;
answer1_mc.buttonMode = true;
answer2_mc.buttonMode = true;
answer3_mc.buttonMode = true;
answer1_mc.gotoAndStop(1);
answer2_mc.gotoAndStop(1);
answer3_mc.gotoAndStop(1);
check_btn.visible = false;
var dragbounds: Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
answer1_mc.addEventListener(TouchEvent.TOUCH_BEGIN, touchgo1);
function touchgo1(event: TouchEvent): void {
event.target.startTouchDrag(event.touchPointID, false, dragbounds);
answer1_mc.gotoAndStop(2);
answer2_mc.x = answer2PosX;
answer2_mc.y = answer2PosY;
answer3_mc.x = answer3PosX;
answer3_mc.y = answer3PosY;
}
answer1_mc.addEventListener(TouchEvent.TOUCH_END, touchno1);
function touchno1(event: TouchEvent): void {
event.target.stopTouchDrag(event.touchPointID);
answer1_mc.gotoAndStop(1);
if (answer1_mc.answer1_txt.text == sum) {
correct_answer = true;
} else {
correct_answer = false;
}
if (answer1_mc.hitTestObject(answerbox_mc)) {
answer1_mc.x = answerbox_mc.x;
answer1_mc.y = answerbox_mc.y;
check_btn.visible = true;
answer2_mc.x = answer2PosX;
answer2_mc.y = answer2PosY;
answer3_mc.x = answer3PosX;
answer3_mc.y = answer3PosY;
} else {
answer1_mc.x = answer1PosX;
answer1_mc.y = answer1PosY;
check_btn.visible = false;
}
}
answer2_mc.addEventListener(TouchEvent.TOUCH_BEGIN, touchgo2);
function touchgo2(event: TouchEvent): void {
event.target.startTouchDrag(event.touchPointID, false, dragbounds);
answer2_mc.gotoAndStop(2);
answer1_mc.x = answer1PosX;
answer1_mc.y = answer1PosY;
answer3_mc.x = answer3PosX;
answer3_mc.y = answer3PosY;
}
answer2_mc.addEventListener(TouchEvent.TOUCH_END, touchno2);
function touchno2(event: TouchEvent): void {
event.target.stopTouchDrag(event.touchPointID);
answer2_mc.gotoAndStop(1);
if (answer2_mc.answer2_txt.text == sum) {
correct_answer = true;
} else {
correct_answer = false;
}
if (answer2_mc.hitTestObject(answerbox_mc)) {
answer2_mc.x = answerbox_mc.x;
answer2_mc.y = answerbox_mc.y;
check_btn.visible = true;
answer1_mc.x = answer1PosX;
answer1_mc.y = answer1PosY;
answer3_mc.x = answer3PosX;
answer3_mc.y = answer3PosY;
} else {
answer2_mc.x = answer2PosX;
answer2_mc.y = answer2PosY;
check_btn.visible = false;
}
}
answer3_mc.addEventListener(TouchEvent.TOUCH_BEGIN, touchgo3);
function touchgo3(event: TouchEvent): void {
event.target.startTouchDrag(event.touchPointID, false, dragbounds);
answer3_mc.gotoAndStop(2);
answer2_mc.x = answer2PosX;
answer2_mc.y = answer2PosY;
answer1_mc.x = answer1PosX;
answer1_mc.y = answer1PosY;
}
answer3_mc.addEventListener(TouchEvent.TOUCH_END, touchno3);
function touchno3(event: TouchEvent): void {
event.target.stopTouchDrag(event.touchPointID);
answer3_mc.gotoAndStop(1);
if (answer3_mc.answer3_txt.text == sum) {
correct_answer = true;
} else {
correct_answer = false;
}
if (answer3_mc.hitTestObject(answerbox_mc)) {
answer3_mc.x = answerbox_mc.x;
answer3_mc.y = answerbox_mc.y;
check_btn.visible = true;
answer2_mc.x = answer2PosX;
answer2_mc.y = answer2PosY;
answer1_mc.x = answer1PosX;
answer1_mc.y = answer1PosY;
} else {
answer3_mc.x = answer3PosX;
answer3_mc.y = answer3PosY;
check_btn.visible = false;
}
}
`
This is the error popping up when a choice is tapped for the second time

Related

Hovering off DPAD sometimes makes character move infinitely in one direction

I have a DPAD in my game when the player holds down let's say the Left DPAD, if he moves his touch to the Up DPAD and let's go, the player continues going in the left direction.
It also works if you hold the a direction, lets say Up continue holding but move off the Up DPAD, sometimes you may continue going in that direction.
What I've tried to prevent this:
On direction clicks, trigger checks on whether your in motion, or
already going a different direction
Setting collisions to force these variables to become false; aka,
you hit something, inMotion = false, etc
That's about all I can think of on how to fix this.
Also, I use a lot of variables for my checks, is it better to change my functions to return booleans, or is this way fine? Just curious.
Game Class
package
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Game extends MovieClip
{
public var area1:Boolean = true;
public var area2:Boolean = false;
public var area3:Boolean = false;
public var player1:Boolean = true;
public var player2:Boolean = false;
public var upWalkspeed:Number = -5;
public var downWalkspeed:Number = 5;
public var leftWalkspeed:Number = -5;
public var rightWalkspeed:Number = 5;
public var inMotion:Boolean = false;
public var goingUp:Boolean = false;
public var goingDown:Boolean = false;
public var goingLeft:Boolean = false;
public var goingRight:Boolean = false;
public var playerPosKeeper_mc:MovieClip = new mc_PlayerPosKeeper();
public var up_dpad:MovieClip = new dpad_Up();
public var down_dpad:MovieClip = new dpad_Down();
public var left_dpad:MovieClip = new dpad_Left();
public var right_dpad:MovieClip = new dpad_Right();
public var menu_dpad:MovieClip = new dpad_Menu();
public var run_dpad:MovieClip = new dpad_Menu();
public var barrierRoof1_game:MovieClip = new game_BarrierRoof();
public var barrierRoof2_game:MovieClip = new game_BarrierRoof();
public var barrierSide1_game:MovieClip = new game_BarrierSide();
public var barrierSide2_game:MovieClip = new game_BarrierSide();
public var StageCollisions:Array = new Array(barrierRoof1_game, barrierRoof2_game, barrierSide1_game, barrierSide2_game);
// fix MC goes after not before ||| public var player1States:Array = new Array(mc_P1D1,mc_P1D2,"mc_P1L1","mc_P1L2","mc_P1R1","mc_P1R2","mc_P1U1","mc_P1U2");
public function Game()
{
trace("SUCCESS | Constructed Game Class");
var aMove:Movement = new Movement(this);
addChild(aMove);
}
}
}
Movement Class
package
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TouchEvent;
import flash.net.dns.AAAARecord;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
public class Movement extends MovieClip
{
public function Movement(main:Game)
{
trace("SUCCESS | Constructed Movement Class");
addChild(main.playerPosKeeper_mc);
main.playerPosKeeper_mc.x = 384;
main.playerPosKeeper_mc.y = 46;
addChild(main.up_dpad);
main.up_dpad.x = 55;
main.up_dpad.y = 336;
addChild(main.down_dpad);
main.down_dpad.x = 57;
main.down_dpad.y = 432;
addChild(main.left_dpad);
main.left_dpad.x = 19;
main.left_dpad.y = 372;
addChild(main.right_dpad);
main.right_dpad.x = 118;
main.right_dpad.y = 372;
addChild(main.menu_dpad);
main.menu_dpad.x = 61;
main.menu_dpad.y = 377;
addChild(main.run_dpad);
main.run_dpad.x = 684;
main.run_dpad.y = 369;
addChild(main.barrierRoof1_game);
main.barrierRoof1_game.x = 0;
main.barrierRoof1_game.y = 0;
addChild(main.barrierRoof2_game);
main.barrierRoof2_game.x = 0;
main.barrierRoof2_game.y = 470;
addChild(main.barrierSide1_game);
main.barrierSide1_game.x = 0;
main.barrierSide1_game.y = 0;
addChild(main.barrierSide2_game);
main.barrierSide2_game.x = 790;
main.barrierSide2_game.y = 0;
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
main.up_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, upBeginInput);
main.down_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, downBeginInput);
main.left_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, leftBeginInput);
main.right_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, rightBeginInput);
// Maybe add diagnol direction buttons in the future?;
// !! NOTE !!
// Use some sort of value, maybe a return or a variable to sync up animations
// to if the player is moving, in the future
// Movement Directions
// Start of UP Movement
function upBeginInput(e:TouchEvent):void
{
main.inMotion = true;
main.goingUp = true;
main.goingDown = false;
main.goingLeft = false;
main.goingRight = false;
main.up_dpad.addEventListener(TouchEvent.TOUCH_END, upEndInput);
addEventListener(Event.ENTER_FRAME,sendUpMovement);
}
function upEndInput(e:TouchEvent):void
{
main.inMotion = false;
main.goingUp = false;
main.up_dpad.removeEventListener(TouchEvent.TOUCH_END, upEndInput);
removeEventListener(Event.ENTER_FRAME,sendUpMovement);
}
function sendUpMovement():void
{
if (main.inMotion == true && main.goingUp == true && main.goingDown == false && main.goingLeft == false && main.goingRight == false)
{
movePlayer(0, main.upWalkspeed);
}
else
{
}
}
// End of UP Movement
// Start of DOWN Movement
function downBeginInput(e:TouchEvent):void
{
main.inMotion = true;
main.goingUp = false;
main.goingDown = true;
main.goingLeft = false;
main.goingRight = false;
main.down_dpad.addEventListener(TouchEvent.TOUCH_END, downEndInput);
addEventListener(Event.ENTER_FRAME,sendDownMovement);
}
function downEndInput(e:TouchEvent):void
{
main.inMotion = false;
main.goingDown = false;
main.down_dpad.removeEventListener(TouchEvent.TOUCH_END, downEndInput);
removeEventListener(Event.ENTER_FRAME,sendDownMovement);
}
function sendDownMovement():void
{
if (main.inMotion == true && main.goingUp == false && main.goingDown == true && main.goingLeft == false && main.goingRight == false)
{
movePlayer(0, main.downWalkspeed);
}
else
{
}
}
// End of DOWN Movement
// Start of LEFT Movement
function leftBeginInput(e:TouchEvent):void
{
main.inMotion = true;
main.goingUp = false;
main.goingDown = false;
main.goingLeft = true;
main.goingRight = false;
main.left_dpad.addEventListener(TouchEvent.TOUCH_END, leftEndInput);
addEventListener(Event.ENTER_FRAME,sendLeftMovement);
}
function leftEndInput(e:TouchEvent):void
{
main.inMotion = false;
main.goingLeft = false;
main.left_dpad.removeEventListener(TouchEvent.TOUCH_END, leftEndInput);
removeEventListener(Event.ENTER_FRAME,sendLeftMovement);
}
function sendLeftMovement():void
{
if (main.inMotion == true && main.goingUp == false && main.goingDown == false && main.goingLeft == true && main.goingRight == false)
{
movePlayer(main.leftWalkspeed, 0);
}
else
{
}
}
// End of LEFT Movement
// Start of RIGHT Movement
function rightBeginInput(e:TouchEvent):void
{
main.inMotion = true;
main.goingUp = false;
main.goingDown = false;
main.goingLeft = false;
main.goingRight = true;
main.right_dpad.addEventListener(TouchEvent.TOUCH_END, rightEndInput);
addEventListener(Event.ENTER_FRAME,sendRightMovement);
}
function rightEndInput(e:TouchEvent):void
{
main.inMotion = false;
main.goingRight = false;
main.right_dpad.removeEventListener(TouchEvent.TOUCH_END, rightEndInput);
removeEventListener(Event.ENTER_FRAME,sendRightMovement);
}
function sendRightMovement():void
{
if (main.inMotion == true && main.goingUp == false && main.goingDown == false && main.goingLeft == false && main.goingRight == true)
{
movePlayer(main.rightWalkspeed, 0);
}
else
{
}
}
// End of RIGHT Movement
function movePlayer(movementX:Number, movementY:Number):void
{
var originalX:Number = main.playerPosKeeper_mc.x;
var originalY:Number = main.playerPosKeeper_mc.y;
main.playerPosKeeper_mc.x += movementX;
if (checkCollision())
{
main.playerPosKeeper_mc.x = originalX;
}
main.playerPosKeeper_mc.y += movementY;
if (checkCollision())
{
main.playerPosKeeper_mc.y = originalY;
}
}
function checkCollision():Boolean
{
for each (var StageCollisions:MovieClip in main.StageCollisions)
{
if (main.playerPosKeeper_mc.hitTestObject(StageCollisions))
{
return true;
main.inMotion = false;
main.goingUp = false;
main.goingDown = false;
main.goingLeft = false;
main.goingRight = false;
}
}
return false;
}
}
}
}
Before you even start to debug behaviors, you need to understand what algorithmic approach is. You have 4 similar pieces of code which differ in minor details and make your whole script too long and unreadable and hard to manage. Here's the guideline:
var isMoving:Boolean;
var Direction:Point = new Point;
var Buttons:Array = [Up, Down, Left, Right];
// Subscribe all buttons for the same handlers and behaviors.
for each (var aButton:InteractiveObject in Buttons)
{
aButton.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
aButton.addEventListener(MouseEvent.MOUSE_OUT, onUp);
aButton.addEventListener(MouseEvent.MOUSE_UP, onUp);
}
function onDown(e:MouseEvent):void
{
// Figure which button was pressed.
switch (e.currentTarget)
{
case Up:
Direction.x = 0;
Direction.y = -1;
break;
case Down:
Direction.x = 0;
Direction.y = 1;
break;
case Left:
Direction.x = -1;
Direction.y = 0;
break;
case Up:
Direction.x = 1;
Direction.y = 0;
break;
}
// Now start moving Hero into the Direction.
if (!isMoving)
{
isMoving = true;
addEventListener(Event.ENTER_FRAME, onFrame);
}
}
function onFrame(e:Event):void
{
Hero.x += Direction.x;
Hero.y += Direction.y;
}
function onUp(e:MouseEvent):void
{
// If any of buttons is released or mouse out, stop moving Hero.
removeEventListener(Event.ENTER_FRAME, onFrame);
Direction.x = 0;
Direction.y = 0;
isMoving = false;
}
As you can see, the beauty of algorithmic approach is that you need to handle differently only things that need to be handled differently, in the example case (which is pretty similar to what you want to create) it is the block to set the movement direction. The rest of the code is identical for all the buttons and that's why the whole script is short and readable, easy to understand and manageable.

List of questions in Array are not properly presented

I used Array to present my set of questions in my project. Below are the coding that I used. I've tried the coding for 3 questions and it worked well. For my real project, I need to put 20 questions and when everything done, I run the project, it didnt work well. I hit next, start on Q3, it will give Q5, then Q8 and jump to Q17. Why does it happen?
stop();
var finalString:String = '';
//var finalString2:String = '';
var _list:Array = ["Q1", "Q2", "Q3,"Q4,"Q5 ","Q6","Q7","Q8 ","Q9","Q10","Q11","Q12", "Q13","Q14", "Q15", "Q16","Q17", "Q18", "Q19", "Q20"];
var _marks:Array = [];
var i:int;
var myscore = 0;
////////////////////////////////////////////
buttonA.buttonMode = true;
buttonB.buttonMode = true;
buttonC.buttonMode = true;
buttonD.buttonMode = true;
skip_btn.buttonMode = true;
score_txt.text = myscore;
question_txt.text = _list[0];
buttonA.label_txt.text = "A. ";
buttonB.label_txt.text = "B. ";
buttonC.label_txt.text = "C. ";
buttonD.label_txt.text = "D. ";
skip_btn.label_txt.text = "SKIP";
buttonA.label_txt.mouseEnabled = buttonB.label_txt.mouseEnabled = buttonC.label_txt.mouseEnabled = buttonD.label_txt.mouseEnabled = skip_btn.label_txt.mouseEnabled = false;
buttonA.addEventListener(MouseEvent.CLICK, q1);
buttonB.addEventListener(MouseEvent.CLICK, q1);
buttonC.addEventListener(MouseEvent.CLICK, q1);
buttonD.addEventListener(MouseEvent.CLICK, q1);
skip_btn.addEventListener(MouseEvent.CLICK, q1);
function q1(event:MouseEvent):void
{
if(event.currentTarget == buttonA)
{
_marks.push("Your answer: ");
}
else if(event.currentTarget == buttonB)
{
_marks.push("Your answer:");
}
else if(event.currentTarget == buttonC)
{
_marks.push("Your answer:");
myscore+=5;
}
else if(event.currentTarget == buttonD)
{
_marks.push("Your answer:");
}
else if(event.currentTarget == skip_btn)
{
_marks.push("Skip");
}
buttonA.removeEventListener(MouseEvent.CLICK, q1);
buttonB.removeEventListener(MouseEvent.CLICK, q1);
buttonC.removeEventListener(MouseEvent.CLICK, q1);
buttonD.removeEventListener(MouseEvent.CLICK, q1);
skip_btn.removeEventListener(MouseEvent.CLICK, q1);
nextFrame();
}

Change handler not triggering the first time in Flex

I use a multiple-check Drop-Down which does not trigger the first Change event. Subsequent events trigger properly. When I select Select All or any other option the first time it does not trigger the event either.
use namespace mx_internal;
[Style(name="selectAllBorderAlpha", type="Number", inherit="no", theme="spark, mobile", minValue="0.0", maxValue="1.0")]
[Style(name="selectAllBorderColor", type="uint", format="Color", inherit="no", theme="spark, mobile")]
[Style(name="selectAllBorderVisible", type="Boolean", inherit="no", theme="spark, mobile")]
[Style(name="selectAllBackgroundColor", type="uint", format="Color", inherit="no", theme="spark, mobile")]
[Style(name="selectAllBackgroundAlpha", type="Number", inherit="no", theme="spark, mobile", minValue="0.0", maxValue="1.0")]
[IconFile("DropDownList.png")]
[DiscouragedForProfile("mobileDevice")]
public class CheckBoxDropDownList extends CheckBoxDropDownListBase
{
public function CheckBoxDropDownList()
{
super();
addEventListener(IndexChangeEvent.CHANGE, indexChangeHandler);
}
protected function indexChangeHandler(event:IndexChangeEvent):void
{
selectedAll = false;
}
[SkinPart(required="false")]
public var selectAllCheckBox:CheckBox;
[SkinPart(required="false")]
public var selectAllHitArea:UIComponent;
[SkinPart(required="false")]
public var labelDisplay:IDisplayText;
private var labelChanged:Boolean = false;
private var labelDisplayExplicitWidth:Number;
private var labelDisplayExplicitHeight:Number;
private var sizeSetByTypicalItem:Boolean;
override public function get baselinePosition():Number
{
return getBaselinePositionForPart(labelDisplay as IVisualElement);
}
private var _prompt:String = "";
[Inspectable(category="General", defaultValue="")]
public function get prompt():String
{
return _prompt;
}
public function set prompt(value:String):void
{
if (_prompt == value)
return;
_prompt = value;
labelChanged = true;
invalidateProperties();
}
[Inspectable(category="Data")]
override public function set typicalItem(value:Object):void
{
super.typicalItem = value;
invalidateSize();
}
override protected function commitProperties():void
{
super.commitProperties();
if (labelChanged)
{
labelChanged = false;
updateLabelDisplay();
}
if (selectedAllChanged)
{
selectedAllChanged = false;
if (selectAllCheckBox)
{
selectAllCheckBox.selected = _selectedAll;
this.dispatchEvent(new Event("selectAllChanged"));
}
invalidateList();
}
}
override protected function partAdded(partName:String, instance:Object):void
{
super.partAdded(partName, instance);
if (instance == labelDisplay)
{
labelChanged = true;
invalidateProperties();
}
if (instance == selectAllCheckBox)
{
selectedAllChanged = true;
invalidateProperties();
}
if (instance == selectAllHitArea)
{
selectAllHitArea.addEventListener(MouseEvent.CLICK, selectAllHitArea_clickHandler);
}
}
override protected function partRemoved(partName:String, instance:Object):void
{
super.partRemoved(partName, instance);
if (instance == selectAllHitArea)
{
selectAllHitArea.removeEventListener(MouseEvent.CLICK, selectAllHitArea_clickHandler);
}
}
protected function selectAllHitArea_clickHandler(event:MouseEvent):void
{
if (selectAllCheckBox)
selectedAll = !selectAllCheckBox.selected;
}
private var _selectedAll:Boolean = false;
private var selectedAllChanged:Boolean;
public function get selectedAll():Boolean
{
return _selectedAll;
}
public function set selectedAll(value:Boolean):void
{
if (value == _selectedAll)
return;
_selectedAll = value;
selectedAllChanged = true;
labelChanged = true;
selectedIndices = Vector.<int>([]);
//setSelectedItem(undefined, false);
invalidateProperties();
}
public function setSelectedIndices(selValues:Array):void
{
if (this.dataProvider == null) {
return;
}
var selIndices:Vector.<int> = new Vector.<int>();
if (selValues == null || selValues.length == 0)
{
this.selectedAll = true;
return;
}
for(var i:int=0; i < this.dataProvider.length; i++)
{
for(var j:int=0; j < selValues.length; j++)
{
var obj:Object = this.dataProvider.getItemAt(i);
if(selValues[j] == obj.value || selValues[j] == obj.label)
{
selIndices.push(i);
break;
}
}
}
if (selIndices.length == 0)
{
this.selectedAll = true;
}
else
{
this.selectedAll = false;
this.selectedIndices = selIndices;
}
}
override protected function item_mouseDownHandler(event:MouseEvent):void
{
if (selectedAll)
{
selectedAll = false;
var newIndex:int
if (event.currentTarget is IItemRenderer)
newIndex = IItemRenderer(event.currentTarget).itemIndex;
else
newIndex = dataGroup.getElementIndex(event.currentTarget as IVisualElement);
var arr:Array = dataProvider.toArray()
arr.splice(newIndex, 1);
selectedItems = Vector.<Object>(arr);
return;
}
super.item_mouseDownHandler(event);
// if all items are selected, then unselect them and check the "Select All" checkbox.
if (selectedItems.length == dataProvider.length)
{
selectedAll = true;
selectedIndex = -1;
}
}
override protected function dropDownController_closeHandler(event:DropDownEvent):void
{
super.dropDownController_closeHandler(event);
// Automatically selected all items if no items are selected when closing the dropDown.
if (selectedItems.length == 0 && !selectedAll)
selectedAll = true;
}
override protected function measure():void
{
var labelComp:TextBase = labelDisplay as TextBase;
// If typicalItem is set, then use it for measurement
if (labelComp && typicalItem != null)
{
// Save the labelDisplay's dimensions in case we clear out typicalItem
if (!sizeSetByTypicalItem)
{
labelDisplayExplicitWidth = labelComp.explicitWidth;
labelDisplayExplicitHeight = labelComp.explicitHeight;
sizeSetByTypicalItem = true;
}
labelComp.explicitWidth = NaN;
labelComp.explicitHeight = NaN;
// Swap in the typicalItem into the labelDisplay
updateLabelDisplay(typicalItem);
UIComponentGlobals.layoutManager.validateClient(skin, true);
// Force the labelDisplay to be sized to the measured size
labelComp.width = labelComp.measuredWidth;
labelComp.height = labelComp.measuredHeight;
// Set the labelDisplay back to selectedItem
updateLabelDisplay();
}
else if (labelComp && sizeSetByTypicalItem && typicalItem == null)
{
// Restore the labelDisplay to its original size
labelComp.width = labelDisplayExplicitWidth;
labelComp.height = labelDisplayExplicitHeight;
sizeSetByTypicalItem = false;
}
super.measure();
}
override mx_internal function updateLabelDisplay(displayItem:* = undefined):void
{
if (labelDisplay)
{
if (displayItem == undefined)
{
if (selectedItems != null && selectedItems.length > 1)
displayItem = VectorUtils.vectorToArray(selectedItems, Object);
else
displayItem = selectedItem;
}
if (displayItem != null && displayItem != undefined)
if (displayItem is Array)
{
this.toolTip = selectedItemsToLabel(displayItem, labelField, labelFunction);
labelDisplay.text = (displayItem as Array).length + " selected";
}
else
{
this.toolTip = null;
labelDisplay.text = selectedItemsToLabel(displayItem, labelField, labelFunction);
}
else if (selectedAll)
labelDisplay.text = "All";
else
labelDisplay.text = prompt;
}
}
private function invalidateList():void
{
if (dataGroup == null)
return;
for each (var itemIndex:int in dataGroup.getItemIndicesInView())
{
var renderer:UIComponent = dataGroup.getElementAt(itemIndex) as UIComponent;
if (renderer)
renderer.invalidateDisplayList();
}
}
private function selectedItemsToLabel(item:Object, labelField:String=null, labelFunction:Function=null):String
{
if (labelFunction != null)
return labelFunction(item);
var collection:ICollectionView = null;
if (item is Array)
{
collection = new ArrayCollection(item as Array);
}
else if (item is ICollectionView)
{
collection = ICollectionView(item);
}
else if (item is IList)
{
collection = new ListCollectionView(IList(item));
}
if (collection != null)
{
var itemLabels:Array = [];
for each (var obj:Object in collection)
{
itemLabels.push(obj[labelField]);
}
return itemLabels.join(", ");
}
return LabelUtil.itemToLabel(item, labelField, labelFunction);
}
public function get selectedValues():Array
{
var arr:Array = [];
if(selectedItems != null && selectedItems.length > 0)
{
for each (var obj:Object in selectedItems)
arr.push(obj.value);
}
return arr;
}
public function get selectedLabels():Array
{
var arr:Array = [];
if(selectedItems != null && selectedItems.length > 0)
{
for each (var obj:Object in selectedItems)
arr.push(obj.label);
}
return arr;
}
}
Try to call super() after the addEventListener() in the constructor function

Save the coordinates position of a child

I've got these functions :
private function onEmptySpaceClicked(e:MouseEvent):void{
var myVar = e.currentTarget.name;
if (e.currentTarget.name == "ES1"){
trace("click on one");
clickPuzzles.click1 = true;
}
if (e.currentTarget.name == "ES2"){
trace("click on two");
clickPuzzles.click2 = true;
}
public function buildIt(e:MouseEvent):void{
if (clickPuzzles.click1){
test.x = e.currentTarget.x;
test.y = e.currentTarget.y;
test.visible = true;
}
}
The builIt function is called by an other class.
Everything is working, but, is it possible to save e.currentTarget.x and y on the "onEmptySpaceClicked" function as a value ?
And then use it in my buildIt function ?
Like :
private function onEmptySpaceClicked(e:MouseEvent):void{
var myVar = e.currentTarget.name;
if (e.currentTarget.name == "ES1"){
trace("click on one");
clickPuzzles.click1 = true
e.currentTarget.x && e.currentTarget.y = valueOfEs1
}
if (e.currentTarget.name == "ES2"){
trace("click on two");
clickPuzzles.click2 = true
e.currentTarget.x && e.currentTarget.y = valueOfEs2
}
public function buildIt(e:MouseEvent):void{
if (clickPuzzles.click1){
test.position = valueOfEs1
test.visible = true;
}
if (clickPuzzles.click2){
test.position = valueOfEs2
test.visible = true;
}
}
Thank you for your help
EDIT
Thank you for you advices.
Here's what I did :
private function onEmptySpaceClicked(e:MouseEvent):void{
trace("click on it neww");
var myVar = e.currentTarget.name;
var valXes1;
var valYes1;
var valXes2;
var valYes2;
if (e.currentTarget.name == "ES1"){
trace("il faut écouter emplacement");
clickPuzzles.click1 = true;
valXes1 = e.currentTarget.x;
valYes1 = e.currentTarget.y;
trace(valXes1);
}
if (e.currentTarget.name == "ES2"){
trace("il faut écouter emplacement VARI");
trace("puzzle2 est vrai");
clickPuzzles.click2 = true;
valXes2 = e.currentTarget.x;
valYes2 = e.currentTarget.y;
trace(valXes2);
}
}
public function buildIt(e:MouseEvent):void{
var valXes1;
var valYes1;
var valXes2;
var valYes2;
if (clickPuzzles.click1){
test.x = valXes1
test.y = valYes1
test.visible = true;
}
if (clickPuzzles.click2){
trace("puzzle2 is called");
test.x = valXes2
test.y = valYes2
test.visible = true;
}
}
The puzzles 2 or 1 are well called but it seems that valXes1 and valXes2 have exactly the same value (valYes1 and valYes2 too).
What did I do wrong ?
EDIT 2
Ok, so I've positioned emptyspace and emptyspace 2 like that :
emptyspace .x = 0;
emptyspace .y = 0;
emptyspace2.x = 50;
emptyspace2.y = 50;
In the function onEmptySpaceClicked
if (e.currentTarget.name == "ES1"){
trace("il faut écouter emplacement");
clickPuzzles.click1 = true;
valXes1 = e.currentTarget.x;
valYes1 = e.currentTarget.y;
trace(valXes1);
}
if (e.currentTarget.name == "ES2"){
trace("il faut écouter emplacement VARI");
trace("puzzle2 est vrai");
clickPuzzles.click2 = true;
valXes2 = e.currentTarget.x;
valYes2 = e.currentTarget.y;
trace(valXes2);
the trace(valXes1) is 0 and the trace(valXes2) is 50.
So it's working.
BUT,
in this function :
public function buildIt(e:MouseEvent):void{
var valXes1;
var valYes1;
var valXes2;
var valYes2;
if (clickPuzzles.click1){
test.x = valXes1
test.y = valYes1
test.visible = true;
}
if (clickPuzzles.click2){
trace("puzzle2");
test.x = valXes2
test.y = valYes2
test.visible = true;
}
}
the trace("puzzle2") is showing (good) but the test position is = at valYes1 and valXes1
(so the "test" movieclip is position at the wrong place)
Do you know what's wrong ?
yes but instead of
e.currentTarget.x && e.currentTarget.y = valueOfEs1
you would
valXes1 = e.currentTarget.x;
valYes1 = e.currentTarget.y;
or create a Point object and place x and y in a single Point
import flash.geom.Point;
es1Point = new Point();
es2Point = new Point();
es1Point.x = e.currentTarget.x;
es1Point.y = e.currentTarget.y;
etc etc ...

AS3 Showing image after load is finish

So i'm loading picture from xml, and adding them into a movieclip called cv which has a holder called cHolder. Right now the problem is that while the preloader shows it is loading, the cv(s) appeared already. Is there anyway to show all the cv only after the images have finish loading?
Thanks.
for each (var projectName:XML in projectAttributes)
{
//trace(projectName);
var projectDP:XMLList = projectInput.project.(#name == projectName).displayP;
//trace(projectDP);
var cv:MovieClip = new cView();
catNo += 1;
cv.name = "cv" + catNo;
cv.buttonMode = true;
if(catNo % 5 == 0)
{
catY += 137;
catX = -170;
cv.x = catX;
cv.y = catY;
}
else
{
cv.x = catX;
cv.y = catY;
catX += 112;
}
var imageLoader = new Loader();
imageLoader.load(new URLRequest(projectDP));
TweenLite.to(cv.cHolder, 1, {colorTransform:{tint:0x000000, tintAmount:0.8}});
cv.cHolder.addChild(imageLoader);
cv.ct.text = projectName;
projName.push(projectName);
this.addChild(cv);
imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imageProg);
function imageProg(e:ProgressEvent):void
{
loader.visible = true;
var imageLoaded:Number = e.bytesLoaded/e.bytesTotal*100;
loader.scaleX = imageLoaded/100;
}
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoad);
function imageLoad(e:Event):void
{
loader.visible = false;
}
First, don't put a function inside another function, this won't help for anything and is a bad habit :)
Declare two private variables:
var nImages:uint;
var loadedImages:uint;
Before the loop:
nImages = projectAttributes.length();
loadedImages = 0;
cv.visible = false;
and in the Event.COMPLETE listener:
function imageLoad(e:Event):void
{
loader.visible = false;
loadedImages++;
if (loadedImages == nImages)
{
cv.visible = true;
}
}
var count:int = 0;
var totalClips:int = 0;
cv.visible = false;
for each (var projectName:XML in projectAttributes)
{
++totalClips;
//trace(projectName);
var projectDP:XMLList = projectInput.project.(#name == projectName).displayP;
//trace(projectDP);
var cv:MovieClip = new cView();
catNo += 1;
cv.name = "cv" + catNo;
cv.buttonMode = true;
if(catNo % 5 == 0)
{
catY += 137;
catX = -170;
cv.x = catX;
cv.y = catY;
}
else
{
cv.x = catX;
cv.y = catY;
catX += 112;
}
var imageLoader = new Loader();
imageLoader.load(new URLRequest(projectDP));
TweenLite.to(cv.cHolder, 1, {colorTransform:{tint:0x000000, tintAmount:0.8}});
cv.cHolder.addChild(imageLoader);
cv.ct.text = projectName;
projName.push(projectName);
this.addChild(cv);
imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imageProg);
function imageProg(e:ProgressEvent):void
{
loader.visible = true;
var imageLoaded:Number = e.bytesLoaded/e.bytesTotal*100;
loader.scaleX = imageLoaded/100;
}
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoad);
function imageLoad(e:Event):void
{
++count;
if(count == totalClips){
cv.visible = true;
}
loader.visible = false;
}
}
So you might want to adapt things a little, in case I'm counting in the wrong spots etc for your implementation but as you can see the solution is simple, you count the total number of clips being processed for loading from the XML, then as the images are loaded and call the OnComplete callback, you increment another count until you've seen that you've loaded all processed images, and set the container to visible.