нет, не совсем ))
ключевое - событие диспатчится (генерируется) на нижнем уровне, а слушается на верхнем.
Но именно так писать нельзя.
Добавлено через 21 минуту
Вот, как-то так. Работоспособность не проверял, но должно работать
1. Наверху создаем локацию и ставим слушателя. AppEvent - это собственный класс события, позволяющий передавать параметры.

Код AS3:
public class Controller extends Sprite
{
private var location:Location;
public function Controller() : void
{
setLocation();
}
private function setLocation() : void
{
location = new Location();
location.addEventListener("eventFromPers", eventFromPersHandler);
addChild(location);
}
private function eventFromPersHandler(e:AppEvent) : void
{
trace("Поступило событие от перса: ", e.data);
}
}
2. На уровне локации ничего не делаем, просто ставим перса:

Код AS3:
public class Location extends Sprite
{
private var pers:Pers;
public function Location() : void
{
setPers();
}
private function setPers() : void
{
pers = new Pers();
addChild(pers);
}
}
3. На уровне перса обрабатываем нажатие на кнопку и отсылаем событие наверх

Код AS3:
public class Pers extends Sprite
{
private var persMC:PersMC; // мувик из библиотеки с кнопкой sendEvent
public function Pers() : void
{
initPers();
}
private function initPers() : void
{
persMC = new persMC();
persMC.sendEvent.addEventListener(MouseEvent.CLICK, mouseClickHandler);
addChild(persMC);
}
private function mouseClickHandler(e:Event) : void
{
var eventData:String = "с персом все в порядке";
var appEvent:AppEvent = new AppEvent("eventFromPers",eventData,true)
dispatchEvent(appEvent);
}
}
Собственный класс события для передачи параметра, как вариант:

Код AS3:
public class AppEvent extends Event {
protected var _data:Object;
public function AppEvent(type:String, data:Object, bubbles:Boolean = false, cancelable:Boolean = false) {
_data = data;
super(type, bubbles, cancelable);
}
override public function clone():Event {
return new AppEvent(type, data, bubbles, cancelable);
}
public function get data():Object { return _data; }
}