i am currently making a flash \"pond\" with fishes in it, and i have the ability to add food pellets onto the pond, how should i make the movement of my fishes to the food x,y l
You could use a couple of Tween objects to adjust your fishes' x/y coords so that they move toward the food. What's nice is that you could get an ease in/ease out effect pretty easily this way.
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/transitions/Tween.html
This is a quick and easy way to do what you're after:
public function moveToFood(food:Food):void
{
x -= (x - food.x) / 40;
y -= (y - food.y) / 40;
}
For something a little nicer you'll probably need to look at your own small artificial intelligence for the fish (something like picking the nearest food, moving toward it at a constant pace and then starting to feed on it).
Download the tweenLite library at http://www.greensock.com/tweenlite/ and add it to your project.
you can then call for tweenlite like this:
TweenLite.to(fish, timeToGoToFood, {x: food.x, y: food.y, ease: yourEasing});
The easing can be chosen from some preprogrammed easingfunctions of tweenLite. Cubic.easeout or Cubic.easein will work best for your fishes i think. :)
This should explain exactly how to move your objects around. Obviously you will need to change the Sprite to whatever class your using for your fish/food/etc. Your fish object will either need a property for speed. such as: public var speed:int = 5; Or you can just define one in your main simulation for all the fish. ( I would prefer having variable speed fish myself)
// This can be done faster but this is to show you how it works.
public function moveObject(obj:Sprite, target:Sprite):void
{
// We start by getting the distances along the x and y axis
var dx:Number = target.x - obj.x;
var dy:Number = target.y - obj.y;
// Basic distance check with pythagorean theorem. We don't need
// to get the Square Roots because if it is smaller squared it
// will still be smaller once we get the square roots and thus
// will just be a waste of time.
if (dx * dx + dy * dy < obj.speed * obj.speed)
{
// Since we are within one time step of speed we will go past it
// if we keep going so just lock the position in place.
obj.x = target.x;
obj.y = target.y;
}
else
{
// we aren't there yet so lets rock.
// get the angle in radians given the distance along the x and y axis.
var angleRads:Number = Math.atan2(dy, dx);
// get our velocity along the x and y axis
// NOTE: remember how the flash coordinate system is laid out.
// we need to calc cos along the x and sin along the y.
var vx:Number = Math.cos(angleRads) * obj.speed;
var vy:Number = Math.sin(angleRads) * obj.speed;
// now that we have our speeds we can add it to the objects
// current position and thus create a nice smooth movement per
// frame.
obj.x += vx;
obj.y += vy;
// This will lock the rotation of the object to the direction
// the object is traveling in.
// NOTE: don't forget when you make your objects that for flash
// rotation of Zero = pointing to the right (+x)
obj.rotation = angleRads * 180 / Math.PI;
}
}
Hope this helps, any questions just ask.
Edit: You don't need to add a reference to the stage in a Sprite or MovieClip they already have access to the stage.