123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- <?xml version="1.0" ?>
- <diagram author="Sam Pieters" name="Elevator Balls">
- <top>
- import sccd.runtime.libs.ui_v2 as ui
- import random
- import time
- CANVAS_DIMS = (800, 550)
- FLOOR_LENGTH = 350
- FLOOR_SPACE = 50
- FLOORS = 3
- </top>
- <inport name="ui" />
- <outport name="ui" />
- <class name="MainApp" default="true">
- <relationships>
- <association name="floor" class="Floor" min="2"/>
- <association name="button" class="ElevatorButton" />
- <association name="elevator" class="Elevator" min="1" max="1"/>
- </relationships>
- <attribute name="window_id" />
- <attribute name="canvas_id" />
- <attribute name="num_floors" />
- <attribute name="floor_dimensions" />
- <atrribute name="floor_height" />
- <inport name="field_ui"/>
- <constructor>
- <body>
- self.num_floors = 0
- self.button_num = FLOORS
- self.elevator_pos = None
- self.elevator_dim = None
- </body>
- </constructor>
- <scxml initial="creating_window">
- <state id="creating_window">
- <onentry>
- <raise port="ui" event="create_window">
- <parameter expr="CANVAS_DIMS[0]"/><!-- width -->
- <parameter expr="CANVAS_DIMS[1]"/><!-- height -->
- <parameter expr='"Bouncing Balls Elevator"'/><!-- title -->
- <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="window_created" target="../creating_canvas">
- <parameter name="window_id" type="int" />
- <script>
- self.window_id = window_id
- </script>
- <raise port="ui" event="bind_event">
- <parameter expr="window_id"/><!-- widget_id -->
- <parameter expr="ui.EVENTS.WINDOW_CLOSE"/><!-- tk_event -->
- <parameter expr="'window_close'"/><!-- sccd_event_name -->
- <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
- </raise>
- <raise port="ui" event="bind_event">
- <parameter expr="window_id"/><!-- widget_id -->
- <parameter expr="ui.EVENTS.KEY_PRESS"/><!-- tk_event -->
- <parameter expr="'key_press'"/><!-- sccd_event_name -->
- <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
- </raise>
- </transition>
- </state>
- <state id="creating_canvas">
- <onentry>
- <raise port="ui" event="create_canvas">
- <parameter expr="self.window_id"/><!-- window_id -->
- <parameter expr="CANVAS_DIMS[0]"/><!-- width -->
- <parameter expr="CANVAS_DIMS[1] - 150"/><!-- height -->
- <parameter expr="{'background':'#fff'}"/><!-- style -->
- <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="canvas_created" target="../create_elevator">
- <parameter name="canvas_id" type="int"/>
- <script>
- self.canvas_id = canvas_id
- </script>
- </transition>
- </state>
- <state id="create_elevator">
- <transition target="../creating">
- <raise scope="cd" event="create_instance">
- <parameter expr='"elevator"' />
- <parameter expr='"Elevator"' />
- <parameter expr="self.canvas_id" />
- </raise>
- </transition>
- </state>
- <state id="creating">
- <transition event="instance_created" target="../create_floors">
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- <raise scope="narrow" event="set_association_name" target="association_name">
- <parameter expr="association_name" />
- <parameter expr="self.canvas_id" />
- <parameter expr="self.window_id" />
- </raise>
- </transition>
- </state>
- <state id="create_floors">
- <transition target="../wait_created">
- <raise scope="cd" event="create_instance">
- <parameter expr='"floor"' />
- <parameter expr='"Floor"' />
- <parameter expr="self.canvas_id" />
- <parameter expr="self.num_floors" />
- </raise>
- <script>
- self.num_floors += 1
- </script>
- </transition>
- </state>
- <state id="wait_created">
- <transition event='instance_created' target='../wait_started'>
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- <!-- associate an instance -->
- <raise scope="cd" event="associate_instance">
- <parameter expr="association_name" />
- <parameter expr="'elevator/floors'" />
- </raise>
- </transition>
- </state>
- <state id="wait_started">
- <transition event="instance_started" target="../create_floors" cond="self.num_floors != FLOORS" />
- <transition event="instance_started" target="../create_controls" cond="self.num_floors == FLOORS" />
- </state>
- <state id="create_controls" initial="create_buttons">
- <state id="create_buttons" initial="create_a_button">
- <state id="create_a_button">
- <onentry>
- <raise scope="cd" event="create_instance">
- <parameter expr='"button"' />
- <parameter expr='"ElevatorButton"' />
- <parameter expr="self.window_id" />
- <parameter expr="self.canvas_id" />
- <parameter expr="self.button_num -1" />
- </raise>
- </onentry>
- <transition event='instance_created' target='../start_a_button'>
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- </transition>
- </state>
- <state id="start_a_button">
- <transition event="instance_started" target="../check_next" />
- </state>
- <state id="check_next">
- <transition target="../create_a_button" cond="self.button_num != 1">
- <script>
- self.button_num -= 1
- </script>
- </transition>
- <transition target="../../../running" cond="self.button_num == 1" />
- </state>
- </state>
- </state>
- <state id="running">
- <transition event='button_pressed' target='.'>
- <parameter name="floor_number" type="int"/>
- <raise scope="narrow" event="move_elevator" target="'elevator'">
- <parameter expr="floor_number" />
- </raise>
- </transition>
- </state>
- </scxml>
- </class>
- <class name="Floor">
- <attribute name="window_id" />
- <attribute name="canvas_id" />
- <attribute name="elevator_id" />
- <atrribute name="pos" />
- <inport name="floor_ui"/>
- <relationships>
- <association name="parent" class="MainApp" min="1" max="1" />
- <association name="balls" class="Ball" />
- </relationships>
- <constructor>
- <parameter name="canvas_id" />
- <parameter name="floor_num" />
- <body>
- <![CDATA[
- self.canvas_id = canvas_id;
- self.floor_num = floor_num;
- height = CANVAS_DIMS[1] - 150
- y_dim = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
- self.dim = {'x': FLOOR_LENGTH, 'y': y_dim};
- self.elevator_open = False
- self.elev_pos = None
- self.elev_dim = None
- self.elev_vel = None
- # start position from the bottom instead of from the top
- # self.pos = {'x': FLOOR_LENGTH / 2, 'y': (y_dim /2) + (self.floor_num * (y_dim + FLOOR_SPACE))};
- self.pos = {'x': FLOOR_LENGTH / 2, 'y': height - (y_dim /2) - ( self.floor_num * (y_dim + FLOOR_SPACE) )};
- ]]>
- </body>
- </constructor>
- <scxml initial="creating_floor">
- <state id="creating_floor">
- <onentry>
- <raise port="ui" event="create_rectangle">
- <parameter expr="self.canvas_id" />
- <parameter expr="self.pos['x']"/>
- <parameter expr="self.pos['y']"/>
- <parameter expr="self.dim['x']" />
- <parameter expr="self.dim['y']"/>
- <parameter expr="{'fill':'white', 'outline': 'black'}"/><!-- style -->
- <parameter expr="self.inports['floor_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="rectangle_created" target="../running">
- </transition>
- </state>
- <state id="running" initial="create_random_ball">
- <state id="create_random_ball" >
- <transition after="random.randint(2, 10)" target="../wait">
- <raise scope="cd" event="create_instance">
- <parameter expr='"balls"' />
- <parameter expr='"Ball"' />
- <parameter expr="self.canvas_id" />
- <parameter expr="self.floor_num" />
- <parameter expr="{'x': 10, 'y': self.pos['y']}" />
- <parameter expr="{'x': random.uniform(1.0, 5.0), 'y': random.uniform(-5.0, 5.0)}" />
- <parameter expr="self.elevator_open" />
- <parameter expr="self.elev_pos" />
- <parameter expr="self.elev_dim" />
- <parameter expr="self.elev_vel" />
- </raise>
- </transition>
- <transition event="open_elevator" target=".">
- <script>
- print("Elevator opened at:", self.floor_num)
- self.elevator_open = True
- </script>
- <raise scope="narrow" event="update_elevator_open" target="'balls'">
- <parameter expr="self.elevator_open" />
- </raise>
- </transition>
- <transition event="close_elevator" target=".">
- <script>
- print("Elevator closed at:", self.floor_num)
- self.elevator_open = False
- </script>
- <raise scope="narrow" event="update_elevator_open" target="'balls'">
- <parameter expr="self.elevator_open" />
- </raise>
- </transition>
- <transition event="update_bounds" target=".">
- <parameter name="elev_pos" />
- <parameter name="elev_dim" />
- <parameter name="elev_vel" />
- <script>
- self.elev_pos = elev_pos
- self.elev_dim = elev_dim
- self.elev_vel = elev_vel
- </script>
- <raise scope="narrow" event="update_elevator_bounds" target="'balls'">
- <parameter expr="elev_pos" />
- <parameter expr="elev_dim" />
- <parameter expr="elev_vel" />
- </raise>
- </transition>
- <transition event='transfer_ball' target='.'>
- <parameter name="link_id" type="int"/>
- <parameter name="prev_floor" type="int" />
- <parameter name="new_floor" type="int"/>
- <parameter name="pos" />
- <parameter name="vel" />
- <raise scope="cd" event="create_instance">
- <parameter expr='"balls"' />
- <parameter expr='"Ball"' />
- <parameter expr="self.canvas_id" />
- <parameter expr="new_floor" />
- <parameter expr="pos" />
- <parameter expr="{'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)}" />
- <parameter expr="self.elevator_open" />
- <parameter expr="self.elev_pos" />
- <parameter expr="self.elev_dim" />
- <parameter expr="self.elev_vel" />
- </raise>
- </transition>
- </state>
- <state id="wait">
- <transition event="instance_created" target="../create_random_ball">
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- <raise scope="narrow" event="set_association_name" target="association_name">
- <parameter expr="association_name" />
- </raise>
- </transition>
- </state>
- </state>
- </scxml>
- </class>
- <class name="ElevatorButton">
- <inport name="button_ui"/>
- <relationships>
- <association name="parent" class="MainApp" min="1" max="1" />
- </relationships>
- <constructor>
- <parameter name="window_id" />
- <parameter name="canvas_id" />
- <parameter name="number" />
- <body>
- self.window_id = window_id;
- self.canvas_id = canvas_id;
- self.button_id = None;
-
- self.dim = {'x': 120, 'y': (50 + (FLOORS * 30))}
- self.pos = {'x': CANVAS_DIMS[0] - ((self.dim['x'] / 2) + 10), 'y': (self.dim['y'] / 2) + 10}
- self.r = 10
- self.number = number;
- </body>
- </constructor>
- <scxml initial="creating">
- <state id="creating">
- <onentry>
- <raise port="ui" event="create_button">
- <parameter expr="self.window_id" />
- <parameter expr="self.number"/>
- <parameter expr="self.inports['button_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="button_created" target="../running">
- <parameter name="button_id"/>
- <script>
- self.button_id = button_id
- </script>
- <raise port="ui" event="bind_event">
- <parameter expr="button_id"/><!-- widget_id -->
- <parameter expr="ui.EVENTS.MOUSE_CLICK"/><!-- tk_event -->
- <parameter expr='"mouse_click"'/><!-- sccd_event_name -->
- <parameter expr="self.inports['button_ui']"/><!-- inport for response -->
- </raise>
- </transition>
- </state>
- <state id="running">
- <transition port='button_ui' event="mouse_click" target='.' cond="button == ui.MOUSE_BUTTONS.LEFT">
- <parameter name="x" />
- <parameter name="y" />
- <parameter name="button" />
- <raise event="button_pressed" scope="narrow" target="'parent'">
- <parameter expr="self.number" />
- </raise>
- </transition>
- </state>
- </scxml>
- </class>
- <class name="Elevator">
- <attribute name="window_id" />
- <attribute name="canvas_id" />
- <attribute name="elevator_id" />
- <atrribute name="pos" />
- <inport name="elevator_ui"/>
- <relationships>
- <association name="floors" class="Floor" />
- <association name="parent" class="MainApp" min="1" max="1" />
- </relationships>
- <constructor>
- <parameter name="canvas_id" />
- <body>
- <![CDATA[
- self.canvas_id = canvas_id;
- height = CANVAS_DIMS[1] - 150
- elevator_height = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
- self.dim = {'x': elevator_height, 'y': elevator_height};
- self.vel = -2;
- self.current_floor = 0;
- self.pos = {'x': FLOOR_LENGTH + (elevator_height / 2), 'y': (height - (elevator_height / 2))};
- self.next_pos = {'x': FLOOR_LENGTH / 2, 'y': None};
- self.smooth = 0.6; # value between 0 and 1
- ]]>
- </body>
- </constructor>
- <scxml initial="root">
- <state id="root" initial="waiting">
- <state id="waiting">
- <transition event="set_association_name" target="../creating_elevator">
- <parameter name="association_name" type="str" />
- <parameter name="canvas_id" type="int" />
- <parameter name="window_id" type="int" />
- <script>
- self.association_name = association_name
- self.canvas_id = canvas_id
- self.window_id = window_id
- </script>
- </transition>
- </state>
- <state id="creating_elevator">
- <onentry>
- <raise port="ui" event="create_rectangle">
- <parameter expr="self.canvas_id" />
- <parameter expr="self.pos['x']"/>
- <parameter expr="self.pos['y']"/>
- <parameter expr="self.dim['x']" />
- <parameter expr="self.dim['y']"/>
- <parameter expr="{'fill':'white', 'outline': 'black'}"/><!-- style -->
- <parameter expr="self.inports['elevator_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="rectangle_created" target="../running">
- <parameter name="canvas_id" type="int" />
- <parameter name="rect_id" type="int" />
- <script>
- self.elevator_id = rect_id
- </script>
- </transition>
- </state>
- <state id="running" initial="idle">
- <state id="idle">
- <onentry>
- <raise scope="narrow" event="update_bounds" target="'floors'">
- <parameter expr="self.pos" />
- <parameter expr="self.dim" />
- <parameter expr="self.vel" />
- </raise>
- <raise scope="narrow" event="open_elevator" target="f'floors[{self.current_floor}]'" />
- </onentry>
- <transition event="move_elevator" target="../move">
- <parameter name="floor_number" type="int"/>
- <raise scope="narrow" event="close_elevator" target="f'floors[{self.current_floor}]'" />
- <script>
- if self.current_floor < floor_number:
- self.vel = -2
- else:
- self.vel = 2
- self.current_floor = floor_number
-
- height = (CANVAS_DIMS[1] - 150)
- y_dim = (height - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
- self.next_pos['y'] = height - (y_dim /2) - (self.current_floor * (y_dim + FLOOR_SPACE));
- </script>
- </transition>
- </state>
- <state id="move">
- <onentry>
- <raise scope="narrow" event="update_bounds" target="'floors'">
- <parameter expr="self.pos" />
- <parameter expr="self.dim" />
- <parameter expr="self.vel" />
- </raise>
- </onentry>
- <transition after="0.02" target=".">
- <raise port="ui" event="set_element_pos">
- <parameter expr="self.canvas_id"/>
- <parameter expr="self.elevator_id"/>
- <parameter expr="self.pos['x']"/>
- <parameter expr="self.pos['y']"/>
- </raise>
- <script>
- self.pos['y'] += self.vel
- </script>
- </transition>
- <transition target="../idle" cond="(self.vel > 0 and self.pos['y'] > self.next_pos['y']) or (self.vel < 0 and self.pos['y'] < self.next_pos['y'])">
- </transition>
- </state>
- </state>
- </state>
- </scxml>
- </class>
- <class name="Ball">
- <attribute name="canvas_id" />
- <atrribute name="circle_id" />
- <attribute name="pos" />
- <inport name="ball_ui" />
- <relationships>
- <association name="parent" class="Floor" min="1" max="1" />
- </relationships>
- <constructor>
- <parameter name="canvas_id" />
- <parameter name="floor_num" />
- <parameter name="pos" />
- <parameter name="vel" />
- <parameter name="elevator_open" />
- <parameter name="rect_pos" />
- <parameter name="rect_dim" />
- <parameter name="rect_vel" />
- <body>
- <![CDATA[
- self.canvas_id = canvas_id;
- self.floor_num = floor_num;
- self.elevator_floor = 0;
- self.elevator_open = elevator_open;
- self.rect_pos = rect_pos
- self.rect_dim = rect_dim
- self.rect_vel = rect_vel
- self.r = 5.0;
- self.vel = vel;
- self.pos = pos;
- self.smooth = 0.6; # value between 0 and 1
- ]]>
- </body>
- </constructor>
- <destructor>
- </destructor>
- <scxml initial="main_behaviour">
- <state id="main_behaviour" initial="initializing">
- <state id="initializing">
- <transition event="set_association_name" target="../creating_circle">
- <parameter name="association_name" type="str" />
- <script>
- self.association_name = association_name
- </script>
- </transition>
- </state>
- <state id="creating_circle">
- <onentry>
- <raise port="ui" event="create_circle">
- <parameter expr="self.canvas_id"/><!-- canvas_id -->
- <parameter expr="self.pos['x']"/><!-- x -->
- <parameter expr="self.pos['y']"/><!-- y -->
- <parameter expr="self.r"/><!-- r -->
- <parameter expr="{'fill':'#000'}"/><!-- style -->
- <parameter expr="self.inports['ball_ui']"/><!-- inport for response -->
- </raise>
- </onentry>
- <transition event="circle_created" target="../bouncing">
- <parameter name="canvas_id"/>
- <parameter name="circle_id"/>
- <script>
- self.circle_id = circle_id
- </script>
- </transition>
- </state>
- <state id="bouncing">
- <transition cond="self.pos['x'] + self.r > self.rect_pos['x'] + (self.rect_dim['x'] / 2) and self.elevator_open" target=".">
- <script>
- self.prev_floor = self.floor_num
- </script>
- <raise scope="narrow" event="transfer_ball" target="'parent'" >
- <parameter expr="self.association_name" />
- <parameter expr="self.prev_floor" />
- <parameter expr="self.elevator_floor" />
- <parameter expr="self.pos" />
- <parameter expr="self.vel" />
- </raise>
- </transition>
- <transition after="0.02" target=".">
- <script>
- <![CDATA[
- floor_height = ((CANVAS_DIMS[1] - 150) - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
- floor_dim = {'x': FLOOR_LENGTH, 'y': floor_height};
- floor_pos = {'x': FLOOR_LENGTH / 2, 'y': (CANVAS_DIMS[1] - 150) - (floor_height /2) - ( self.floor_num * (floor_height + FLOOR_SPACE) )};
-
- if self.floor_num == -1:
- if self.pos['x'] - self.r < self.rect_pos['x'] - (self.rect_dim['x'] / 2):
- if self.elevator_open and self.vel['x'] < 0:
- print("Delivered ball from floor:", self.floor_num, "to:", self.elevator_floor)
- self.floor_num = self.elevator_floor
- elif self.vel['x'] >= 0:
- pass
- else:
- self.pos['x'] = self.rect_pos['x'] - (self.rect_dim['x'] / 2) + self.r
- self.vel['x'] = -self.vel['x']
- elif self.pos['x'] + self.r > self.rect_pos['x'] + (self.rect_dim['x'] / 2):
- self.pos['x'] = self.rect_pos['x'] + (self.rect_dim['x'] / 2) - self.r
- self.vel['x'] = -self.vel['x']
-
- # Check collision with the top and bottom borders
- if self.pos['y'] - self.r < self.rect_pos['y'] - (self.rect_dim['y'] / 2):
- self.pos['y'] = self.rect_pos['y'] - (self.rect_dim['y'] / 2) + self.r
- self.vel['y'] = -self.vel['y'] + self.rect_vel
- elif self.pos['y'] + self.r > self.rect_pos['y'] + (self.rect_dim['y'] / 2):
- self.pos['y'] = self.rect_pos['y'] + (self.rect_dim['y'] / 2) - self.r
- self.vel['y'] = -self.vel['y'] + self.rect_vel
- else:
- if self.pos['x'] - self.r < floor_pos['x'] - (floor_dim['x'] / 2):
- self.pos['x'] = floor_pos['x'] - (floor_dim['x'] / 2) + self.r
- self.vel['x'] = -self.vel['x']
- elif self.pos['x'] + self.r > floor_pos['x'] + (floor_dim['x'] / 2):
- if self.elevator_open and self.vel['x'] > 0:
- self.floor_num = -1
- elif self.vel['x'] <= 0:
- pass
- else:
- self.pos['x'] = floor_pos['x'] + (floor_dim['x'] / 2) - self.r
- self.vel['x'] = -self.vel['x']
-
- # Check collision with the top and bottom borders
- if self.pos['y'] - self.r < floor_pos['y'] - (floor_dim['y'] / 2):
- self.pos['y'] = floor_pos['y'] - (floor_dim['y'] / 2) + self.r
- self.vel['y'] = -self.vel['y']
- elif self.pos['y'] + self.r > floor_pos['y'] + (floor_dim['y'] / 2):
- self.pos['y'] = floor_pos['y'] + (floor_dim['y'] / 2) - self.r # Correct position
- self.vel['y'] = -self.vel['y']
- ]]>
- </script>
- <raise port="ui" event="move_element">
- <parameter expr="self.canvas_id"/>
- <parameter expr="self.circle_id"/>
- <parameter expr="self.vel['x']"/>
- <parameter expr="self.vel['y']"/>
- </raise>
- <script>
- self.pos['x'] += self.vel['x']
- self.pos['y'] += self.vel['y']
- </script>
- </transition>
- <transition target="../ball_delete" cond="self.pos['x'] - self.r < 2"/>
- <transition event="update_elevator_open" target=".">
- <parameter name="open_bool" />
- <script>
- self.elevator_open = open_bool
- print("Ball on floor floor_num:", self.floor_num, "went open")
- </script>
- </transition>
- <transition event="update_elevator_bounds" target=".">
- <parameter name="pos" type="dict" />
- <parameter name="dim" type="dict" />
- <parameter name="vel" type="int" />
- <script>
- self.rect_pos = pos
- self.rect_dim = dim
- self.rect_vel = vel
- </script>
- </transition>
- </state>
- <state id="ball_delete">
- <transition event="delete_self" target='../../deleted'>
- <raise event="delete_ball" scope="narrow" target="'floor'">
- <parameter expr='self.association_name' />
- </raise>
- <raise port="ui" event="destroy_element">
- <parameter expr="self.canvas_id" />
- <parameter expr="self.circle_id" />
- </raise>
- </transition>
- </state>
- </state>
- <state id='deleted' />
- </scxml>
- </class>
- </diagram>
|