-2

My program is a simple game where colored rectangles fall down the screen. Your player changes color depending on what button you click on, the aim is to make your player the same color as the falling object. How do i do a hit test object and check if the two colors are the same.

Here is my code:

import flash.geom.ColorTransform;
import flash.events.TimerEvent;

var rectangle:Shape = new Shape;
var RecTimer:Timer = new Timer(5);
var RecSTimer:Timer = new Timer(800);
var collision:Timer = new Timer(10,1000);
collision.start()
RecTimer.addEventListener(TimerEvent.TIMER, onTimer);
RecTimer.start();
RecSTimer.addEventListener(TimerEvent.TIMER, onSpawnTimer);
RecSTimer.start();
collision.addEventListener(TimerEvent.TIMER, fcollision)


function fcollision(e:TimerEvent):void {
    for each(var rectangle:Shape in rectangles)
    {
        if (mcPLayer.hitTestObject(rectangle)) {

       }
        }
    }

var rectangles:Array = []; // a list of all the rectangles we've made so far
 function spawnRectangle():void {
    var rectangle:Shape = new Shape();
    rectangle.graphics.beginFill(randomColor()); // choosing the colour for the fill, here it is red
    rectangle.graphics.drawRect(0, 10, 480, 45.49); // (x spacing, y spacing, width, height)
    rectangle.graphics.endFill();
    addChild(rectangle); // adds the rectangle to the stage
    rectangles.push(rectangle); // adds the rectangle to our list of rectangles




}
var colors:Array = [0xFF0000, 0x00FF00, 0x0000FF];

function randomColor():uint
{
    return colors[int(Math.random()*colors.length)];
}
function moveAllRectangles():void {
    for each (var rectangle:* in rectangles) {
            rectangle.y +=2;
        if (rectangle.y == 550){
            removeChild(rectangle)
        }

                    }

    }

function onTimer(e:TimerEvent):void {
        moveAllRectangles();

}
function onSpawnTimer(e:TimerEvent):void {
    spawnRectangle();
}
btnRed.addEventListener(MouseEvent.CLICK, fred);
btnGreen.addEventListener(MouseEvent.CLICK, fgreen);
btnBlue.addEventListener(MouseEvent.CLICK, fblue);

function fred (e:MouseEvent):void{
 var myColorTransform = new ColorTransform();
myColorTransform.color = 0xFF0000;
mcPLayer.transform.colorTransform = myColorTransform;
}

function fgreen (e:MouseEvent):void{
 var myColorTransform = new ColorTransform();
myColorTransform.color = 0x00FF00;
mcPLayer.transform.colorTransform = myColorTransform;
}
function fblue (e:MouseEvent):void{
 var myColorTransform = new ColorTransform();
myColorTransform.color = 0x0066CC;
mcPLayer.transform.colorTransform = myColorTransform;
}

function delayedFunctionCall(delay:int, func:Function) {
    var timer:Timer = new Timer(delay, 1);
    timer.addEventListener(TimerEvent.TIMER, func);
    timer.start();
}

1 Answers1

0

There are a few ways you could accomplish this. One easy way would be to do what has been suggested in the comments and use a ColorTransform.

That would look like this:

//call this function anytime the player needs to change color (and also right at the start with the default color)
function changePlayerColor(color:uint):void {
    //create a new color transform object
    var clr:ColorTransform = new ColorTransform();
    clr.color = color; //give it a color
    mcPlayer.transform.colorTransform = clr; //attach it to the player (which just tints the movie clip with that color)
} 

function spawnRectangle():void {
    var rectangle:Shape = new Shape();
    rectangle.graphics.beginFill(0); //doesn't matter what color you fill with, as the color transform below will tint it

    //create a new color transform, then assign the color property
    var clr:ColorTransform = new ColorTransform();
    clr.color = randomColor();

    //assign the newly created color transform to the rectangle
    rectangle.transform.colorTransform = clr;

    rectangle.graphics.drawRect(0, 0, 480, 45.49);
    rectangle.graphics.endFill();
    addChild(rectangle);

    rectangle.x = 0;
    rectangle.y = 10;

    rectangles.push(rectangle);
}

function fcollision(e:TimerEvent):void {
    for each(var rectangle:Shape in rectangles){
        if (mcPLayer.hitTestObject(rectangle) && mcPlayer.transform.colorTransform.color === rectangle.transform.colorTransform.color) {
            //there was a hit test, and the colors match
        }
    }
}

If the above is too simple (eg you don't want your player tinted to a solid color for aesthetic reasons), then you could just add a dynamic property to the player that tells you their color:

function changePlayerColor(color:uint):void {
     //since movie clips are dynamic, you can just make up a property on it and give it a value like the next line
     mcPlayer.myColor = color;

     //now do what need to do to make the player look the way you'd like
}

Then check against that:

if (mcPLayer.hitTestObject(rectangle) && mcPlayer.myColor === rectangle.transform.colorTransform.color){

}
BadFeelingAboutThis
  • 14,445
  • 2
  • 33
  • 40