The simplest solution is, as you say, a boolean variable to indicate if a fish is caught, but you also need a persistent reference to the caught fish, and rather than also have a boolean, you can simply check if this reference is null or not:
At the very top add this:
var caughtFish:mcMainFish;//This will be 'null' at first, but that's what you need.
Then, amend your game loop function:
private function gameLoop(e:Event):void
{
if(caughtFish == null)
checkPlayerHitFish();
else
trackFish();//We'll make this function in a moment
checkFishHitBucket();
checkMainFishOffScreen();
}
This way, the program will only run the loop to check if a fish is caught if none are currently caught. Now, you can amend the condition inside checkPlayerHitFish:
if (currentFish.hitTestObject(playerHook))
{
caughtFish = currentFish;//Make caughtFish point to this fish
currentFish.stopFish();//Not sure what this function does?
}
...finally, you can add a new function, trackFish(), which controls the position of the fish if, and only if, caughtFish is not null - since we just made it point to currentFish, it is no longer null!
function trackFish(){
caughtFish.x = playerHook.x;
caughtFish.y = playerHook.y;
}
This will also allow you to remove the listener - it broke it before because there was no persistent reference to a caught fish (caughtFish), so every frame it would test for a collision again. Once the player catches a fish, it no longer needs to check for collisions.
When the player has the fish in the bucket, you can simply add this statement:
caughtFish = null;
...and this will set the program to look for collisions again.