私はグラフィックライブラリlibsdl
(JavaのC SDL
のバインディング)とマルチエージェントライブラリJadeを使用します。libsdlクラスはすべてのJVMを使用します(コードの実行をブロックします)
私はlibsdl
で作成されたGUIクラスを作成するエージェントを持っています。作成後、エージェントのコードはもう実行されません。実際、実行しているのはGUIクラスだけです。
なぜですか?
それを修正する方法を知っている人はいますか?私は、GUIが私のプログラムの他のエージェントと並んで実行されるようにしたいが、一度それが実現されれば、すべてのJVMをそれ自身のために取る。ここで
は、私のコードの関連部分(第一、代理人)は次のとおりです。
package main;
import java.util.HashMap;
import java.util.Map;
import jade.core.Agent;
import jade.core.behaviours.TickerBehaviour;
import sdljava.SDLException;
public class Display extends Agent
{
private static final long serialVersionUID = 1L;
Map<String, Position> m_drones = new HashMap<String, Position>();
GUI m_gui = null;
protected void setup()
{
for(int i = 0 ; i < Constants.numberDrones ; i++)
{
String name = "Drone" + Integer.toString(i);
Position position = getFreePosition();
Object[] arguments = {i, position};
try
{
this.getContainerController().createNewAgent(name, "main.Drone", arguments).start();
}
catch(Exception exception)
{
System.out.println("Erreur : " + exception.getMessage());
System.exit(-1);
}
m_drones.put(name, position);
}
try
{
m_gui = new GUI(m_drones);
}
catch (SDLException | InterruptedException e)
{
e.printStackTrace();
}
addBehaviour(new RetrievePositions(this, Constants.retrievePositionsPeriod));
addBehaviour(new UpdateGUI(this, Constants.updateGUIPeriod));
}
Map<String, Position> getDrones()
{
return m_drones;
}
Position getFreePosition()
{
int x, y;
Position position = new Position(0, 0);
do
{
x = (int) Math.floor(Math.random() * Constants.environmentWidth) * Constants.dotSize;
y = (int) Math.floor(Math.random() * Constants.environmentHeight) * Constants.dotSize;
position.setPosition(x, y);
}
while(m_drones.containsValue(position));
return position;
}
}
class RetrievePositions extends TickerBehaviour
{
private static final long serialVersionUID = 1L;
Display display = (Display) this.myAgent;
Map<String, Position> drones = display.getDrones();
public RetrievePositions(Agent agent, long period)
{
super(agent, period);
}
public void onTick()
{
System.out.println("retrievePositions");
}
}
class UpdateGUI extends TickerBehaviour
{
private static final long serialVersionUID = 1L;
Display display = (Display) this.myAgent;
public UpdateGUI(Agent agent, long period)
{
super(agent, period);
}
protected void onTick()
{
System.out.println("updateGUI");
}
}
とGUI:
package main;
import java.util.HashMap;
import java.util.Map;
import sdljava.SDLException;
import sdljava.SDLMain;
import sdljava.event.SDLEvent;
import sdljava.video.SDLRect;
import sdljava.video.SDLSurface;
import sdljava.video.SDLVideo;
public class GUI
{
SDLSurface m_screen = null;
Map<String, SDLSurface> m_surfaces = new HashMap<String, SDLSurface>();
boolean m_running = true;
void initSurfaces(Map<String, Position> drones) throws SDLException
{
for(Map.Entry<String, Position> entry : drones.entrySet())
{
SDLSurface surface = SDLVideo.createRGBSurface(SDLVideo.SDL_HWSURFACE, Constants.dotSize, Constants.dotSize, 32, 0, 0, 0, 0);
SDLRect rect = new SDLRect(entry.getValue().getX(), entry.getValue().getY());
surface.fillRect(surface.mapRGB(Constants.droneRed, Constants.droneGreen, Constants.droneBlue));
surface.blitSurface(m_screen, rect);
m_surfaces.put(entry.getKey(), surface);
}
}
public GUI(Map<String, Position> drones) throws SDLException, InterruptedException
{
SDLMain.init(SDLMain.SDL_INIT_VIDEO);
m_screen = SDLVideo.setVideoMode(Constants.environmentWidth * Constants.dotSize,
Constants.environmentHeight * Constants.dotSize, 32, SDLVideo.SDL_DOUBLEBUF | SDLVideo.SDL_HWSURFACE);
SDLVideo.wmSetCaption("Flotte de drones en 2D", null);
initSurfaces(drones);
while(m_running)
{
SDLEvent event = SDLEvent.pollEvent();
if(event instanceof SDLEvent)
{
switch (event.getType())
{
case SDLEvent.SDL_QUIT:
m_running = false;
break;
}
}
m_screen.flip();
}
freeSurfaces();
SDLMain.quit();
}
public void updateGUI(Map<String, Position> drones) throws SDLException
{
for(Map.Entry<String, Position> entry : drones.entrySet())
{
SDLRect rect = new SDLRect(entry.getValue().getX(), entry.getValue().getY());
m_surfaces.get(entry.getKey()).updateRect(rect);
m_surfaces.get(entry.getKey()).blitSurface(m_screen, rect);
}
}
void freeSurfaces() throws SDLException
{
for(Map.Entry<String, SDLSurface> entry : m_surfaces.entrySet())
{
m_surfaces.get(entry.getKey()).freeSurface();
}
m_screen.freeSurface();
}
}
私は答えを見つけたと思います。興味のある人のために:翡翠の各エージェントは、独自のスレッドで実行されます。ですから、Display(GUIを作成したエージェント)に実行を継続するには、GUIを彼から切り離す必要があります。私がやる方法は、GUIをエージェントにすることです。だから、私はそのコンストラクタを呼び出すことによってGUIを作成する瞬間から、それは新しいスレッドを開始し、その命令の後にDisplayを実行し続けることができます。 答えは、GUIをエージェントにすることです。 'public class GUIはエージェントを拡張します { ... }' –