AnyLogic
Expand
Font size

Phase 3. Creating bombs

In the previous phases we created a new model, populated it with facilities, bomber aircrafts, defined behavior of aircrafts and their mission, specified animation shapes, added 3D view, camera, and protected area.

In this phase we will add bombs to our model and learn how to destroy facilities with them. To do that we must create interaction between the bomber and the target building. We will use yet another agent type,  Bomb. On approaching the attack distance, the bomber will drop a bomb onto the targeted building, which will change its state to Destroyed once the bomb reaches the building.

Although aircrafts carry bombs, the  Bomb agents will be located not inside the  Bomber agent in the model, but directly inside the  Main agent, that is, on the same level as the  bombers and the  buildings populations. It will be easier to place bombs in the same space with this model architecture.

Let us start with creating the  Bomb agent type and program its interaction with the building:

Create Bomb agent

  1. Drag the  Agent element from the  Agent palette onto the  Main diagram. Place it beside the  bombers population to the left of the model animation.
  2. Click Population of agents. You will be taken to the next step.
  3. Specify Bomb in the Agent type name field on the third step of the agent wizard. Click Next.
  4. Choose the Bomb animation shape in the Military section. Click Next.
  5. Create two parameters:
    • Click add new... to create a parameter.
    • Type target into the Parameter field.
    • Set Type to Other (additional drop-down list will appear next to it).
    • Select Building from the additional drop-down list of the parameter’s type (This will be the target building in the bomber mission).
    • In the same way create parameter bomber of type Bomber.
    • Click Next.
  6. Select the Create initially empty population, I will add agents at the model runtime option.
  7. Finally, click Finish.

The new agent population will be created with two parameters inside. You can observe them by double-clicking the  bombs population on the  Main diagram.

Now we need to adjust the scale of the animation shape to perfectly match the scale of the modeled space.

Adjust scale of the animation shape

  1. Click the black 2D animation shape of the bomb in the previously opened  Bomb diagram to open its Properties view.
  2. Set the Additional scale parameter to 300%. The animation shape will be resized on the  Bomb diagram.

Now we will make a bomb and the targeted building interact with each other by means of a statechart. The bomb will send the "You are destroyed" message to the building on hitting it, destroying itself immediately afterwards.

Start creating the statechart in the  Bomb diagram that you are currently in.

Create the interaction between the bomb and the building

  1. Switch to the  Agent palette to use its statechart section.
  2. Drag the  Statechart Entry Point element to the graphical editor of the  Bomb agent.

  3. Modify the Action parameter in the Properties of the  Statechart Entry Point element by typing in the following code:
    setXYZ( bomber.getX(), bomber.getY(), bomber.getZ() );

  4. Now click and drag the  State element from the Statechart section of the  Agent palette up to the previously drawn  Statechart Entry Point element on the  Bomb diagram. Release the mouse button when the green dot appears. It indicates that the two elements will be connected. Name it Falling.

  5. Type the following code into the Entry action parameter of the element’s Properties:
    moveTo( target.getX(), target.getY(), target.getZ() );

  6. Now drag the  Transition element to the  Falling state on the  Bomb diagram and connect them. Navigate to its properties and set the Triggered by parameter to Agent arrival.
  7. Drag the  Final State element to the agent diagram and connect it to the  Transition element. Type the following code into the Action field of its Properties to destroy the current bomb once the message has been delivered:
    main.remove_bombs( this );

We have completed the statechart and the only missing piece that is left is the bomber’s decision to drop a bomb. We will do it exactly upon arrival to the point directly above the target building (in the action of the transition going from  ToTarget and  Away states).

Define bomb dropping

  1. Click the  Main tab to switch to the top level agent diagram. We will further navigate to the  Bomber agent diagram from  Main.

  2. Double-click  bombers to open its diagram.
  3. Click the  Transition element to open its properties and modify the Action field by typing in the following code:
    main.add_bombs(target,this);
    On creating a new bomb, the bomber passes itself (this) and the target building to the bomb constructor parameters.

Let us run the model now and watch the bombs being dropped on the buildings in the 3D view mode.

As you can see, the bombs are falling down unnaturally slowly, that is because the initial speed of the bombs is set to the default 10 meters per second.

Define the speed of the bombs

  1. Click the  bombs population on the  Main diagram to navigate to its Properties.
  2. Set the Initial speed parameter of the Dimensions and movement section to 400, then click the speed units drop-down menu to the right of it and select kilometers per hour.

If you run the model now, you will see that bombs are falling faster in the 3D view mode.

Now we will add a boolean flag destroyed and some animation to the building hit by the bomb.

Modify the Building agent

  1. Navigate to building’s properties by double-clicking the  buildings on the  Main.
  2. Click and drag the  Variable element from the Agent Components section of the Agent palette onto the diagram and name it destroyed.
  3. The next step is to show the result of a bomb hitting the building, i.e. to implement the building’s reaction to the bomb explosion. Navigate to its Properties view and perform the following modifications:
    • Set Type parameter to boolean.
    • Type false into the Initial value field.

  4. Navigate to the 3D objects palette and drag Fire object to the  Building diagram. A dialog box will appear "3D Object’s size will change automatically to match with the agent’s scale". Click Yes.
  5. Navigate to Properties view of the object and perform the following changes:
    • Click the icon to the right of the Visible parameter to switch to the code field, then type destroyed into it. It will make the fire appear around the house once it has been bombed.
    • Set the Additional scale parameter to 800.
    • Set the Orientation parameter to Vertical.
    In the end the properties should be configured as displayed in the figure below.

  6. Move on to the Position section and set the Z parameter to 70.

Define how the bomb hits a building

  1. Double-click the  bombs population on the  Main to open its agent’s diagram.
  2. Click the  Transition element on the opened  Bomb diagram and type the following code in the Action field of its properties:
    Type target.destroyed = true;
    We are changing the state of the destroyed boolean flag of the building agent accessible here as target. This way we indicate that it has been destroyed and signal to change its animation.

Run the model to observe the building catching on fire when hit.

You must have noticed that, although all buildings are destroyed by the very first bomber attack, the new bombers are, nevertheless, sent to the target area. This happens because the mission assignment is done regardless of the state of the target assets. We will fix it now.

Modify mission assignment

  1. Navigate to the  Main and click the startMission event to open its Properties view.
  2. Type in the following code into the box of the Action section:

Run the model. As you can see, the bombers are sent to bomb the still intact facilities.

We have completed the third phase of the Air defense system tutorial.

Demo model: Air Defense System — Phase 3 Open the model page in AnyLogic Cloud. There you can run the model or download it (by clicking Model source files).
How can we improve this article?