mirror of
https://github.com/klmp200/sarl-fireworks.git
synced 2024-12-26 09:41:10 +00:00
Readme
This commit is contained in:
parent
20027dd8ae
commit
ddbe90a1cb
BIN
Firework_en.pdf
Normal file
BIN
Firework_en.pdf
Normal file
Binary file not shown.
BIN
MVC_en.pdf
Normal file
BIN
MVC_en.pdf
Normal file
Binary file not shown.
130
README.md
Normal file
130
README.md
Normal file
@ -0,0 +1,130 @@
|
||||
# MVC pattern
|
||||
|
||||
This application follows a MVC (Model-View-Controller) pattern for the GUI communication.
|
||||
|
||||
![MVC pattern applied on this project](MVC_en.pdf)
|
||||
|
||||
|
||||
# Fireworks demonstration
|
||||
|
||||
|
||||
The goal of this demo is to bring out some fireworks using SARL agents.
|
||||
The application is composed of 4 agents. The whole structure holonic.
|
||||
|
||||
![Agents organization in the fireworks demo](Firework_en.pdf| width=150px |height=300px)
|
||||
|
||||
The main agent is the *LaunchingArea* which is linked with the GUI and and contains the other agents inside its inner context.
|
||||
This agent creates the *RocketLauncher*, one by rocket asked by the user. It also transmits the gravity and other parameters.
|
||||
This agent also registers the GUI on a dedicated OpenEventSpace for communication.
|
||||
|
||||
```Scala
|
||||
agent LaunchingArea {
|
||||
|
||||
...
|
||||
|
||||
/*
|
||||
* Get setup event from the GUI
|
||||
*/
|
||||
on SetupSettings {
|
||||
this.rocketsQuantity = occurrence.rocketsQuantity
|
||||
this.fireQuantity = occurrence.fireQuatity
|
||||
this.gravity = occurrence.gravity
|
||||
this.maxWidth = occurrence.maxWidth
|
||||
}
|
||||
|
||||
/*
|
||||
* Agent initialisation when spawned by the GUI
|
||||
* A communication space is opened between
|
||||
* the GUI and this agent
|
||||
*/
|
||||
on Initialize [!occurrence.parameters.empty] {
|
||||
var ctrl = occurrence.parameters.get(0) as FXMLViewerController
|
||||
var ispace = defaultContext.createSpace(
|
||||
OpenEventSpaceSpecification, UUID.randomUUID)
|
||||
ctrl.setGUISpace(ispace)
|
||||
ispace.register(asEventListener)
|
||||
|
||||
ctrl.listenAndDraw(grid)
|
||||
|
||||
info("Finishing initialization of Launching Area")
|
||||
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
![Application with the GUI](firework_screenshot.png| width=350px | height=300px)
|
||||
|
||||
Then, each RocketLauncher creates a *Rocket*. When this one is destroyed, the *RocketLauncher* is going to generate another one. This allows to displace the verification of the existence of the *Rocket* out of the LaunchingArea. It also isolates the *Rocket* and avoid that emitted events disrupt the managing of the simulation.
|
||||
|
||||
```Scala
|
||||
agent RocketLauncher {
|
||||
|
||||
...
|
||||
|
||||
/*
|
||||
* A new rocket is launched when the previous
|
||||
* one is destroyed
|
||||
*/
|
||||
on MemberLeft [!isFromMe(occurrence) && !exited] {
|
||||
// wake allows to send the event at the agent itself
|
||||
wake(new Launch)
|
||||
}
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
*Rocket* agents are the heart of this demo. Each one create a task with a fixed delay where they updates their position by writing it in a object shared with the GUI, here named *Positions*. When the *Rocket* reach the end of its lifetime, they create *Fire* agent within their inner context according to the quantity asked by the user and then wait for the destruction of every *Fire* to kill themselves.
|
||||
|
||||
```Scala
|
||||
agent Rocket {
|
||||
|
||||
...
|
||||
|
||||
on Initialize {
|
||||
|
||||
...
|
||||
|
||||
/*
|
||||
* Create a new background task to update
|
||||
* the agent position at a fixed delay
|
||||
*/
|
||||
move = atFixedDelay(
|
||||
Configuration.RocketLifeCycleSchedulingRate) [
|
||||
try {
|
||||
wake(new UpdateRocketPosition);
|
||||
} catch (e : Exception) {
|
||||
e.printStackTrace
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
on UpdateRocketPosition [isFromMe(occurrence) &&
|
||||
!frozen && !exploded] {
|
||||
var vect = new Vector(2)
|
||||
x = x + speedx
|
||||
y = y + speedy
|
||||
vect.clear()
|
||||
vect.add(x)
|
||||
vect.add(y)
|
||||
lifetime = lifetime - 10
|
||||
|
||||
/* Updates the Position object */
|
||||
if (grid !== null)
|
||||
grid.setRocketPosition(id, vect)
|
||||
if (lifetime <= 0) {
|
||||
exploded = true
|
||||
move.cancel(true)
|
||||
grid.hideHocketPosition(id)
|
||||
wake(new Explode)
|
||||
}
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
The *Fire* is the last agent of the demo. It have a list of positions and is subjected to gravity. As *Rocket* agent, the *Fire* launch a task at a fixed delay to update its actual position, add it at the end of the actual list and then update the *Positions* object. When its lifetime is over, the *Fire* is destroyed.
|
||||
|
||||
When the GUI is closed, an event *Exit* is sent to the *LaunchingArea* which transmits it to the other agents she owns. It waits for their elimination to destroy the next one, until itself.
|
BIN
firework_screenshot.png
Normal file
BIN
firework_screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 307 KiB |
Loading…
Reference in New Issue
Block a user