この質問は、実際のメソッドをキューに入れて呼び出す方法に関連しています。とにかく、私は(結局のところ)匿名のクラスのアイデアを採用することにしました。問題は、匿名クラスをリンクリストに追加すると、実際にはすぐにexecute()が呼び出されることです...そしてそうではないはずです。Execute()は後で呼び出されます。とにかく、これは私が持っているものです:
private LinkedList<AgentAction> actions;
public boolean blockingSensor;
this.actions.add( new AgentAction(this) {
public void execute() {
//setRotationalVelocity(0);
kinematic.setWheelsVelocity(0,0);
this.agent.setBlockingSensors(false);
this.agent.printLCD("Turn, blocking = "+this.agent.blockingSensor);
}
public Object getValue() {
return null;
}
});
//this is essentially the main()
public void performBehavior()
{
//make sure to only call run() each tick, not every ms
if ( this.oldCounter < getCounter() )
{
if ( !isWorking() )
{
run();
}
this.oldCounter = getCounter();
this.actions.removeFirst().execute();
}
}
abstract class AgentAction
{
SimbadAgent agent;
public AgentAction(SimbadAgent a)
{
this.agent = a;
}
public abstract void execute();
public abstract Object getValue();
}
run()は、子クラスによって実装される抽象メソッドです。実行されるのではなく、追加されたときに印刷される理由がわかりません。これは、performBehavior()が実際にはティックごとに1回ではなく複数回実行されていることを意味することを理解していますが、そうではありません。