@@ -109,6 +109,12 @@ def _placeholder_for_unmapped_blocks_to(*args):
109
109
def _key_to_broadcast_message (key_name ):
110
110
return "key " + key_name + " pressed"
111
111
112
+ def _get_existing_sprite_with_name (sprite_list , name ):
113
+ for sprite in sprite_list :
114
+ if sprite .getName () == name :
115
+ return sprite
116
+ return None
117
+
112
118
def _background_look_to_broadcast_message (look_name ):
113
119
return "start background scene: " + look_name
114
120
@@ -647,26 +653,33 @@ def _key_pressed_script_workaround_script(key, x_pos, y_pos, catrobat_scene):
647
653
#load key file and create sprite with looks
648
654
key_filename = _key_filename_for (key )
649
655
key_message = _key_to_broadcast_message (key )
650
- key_sprite = SpriteFactory ().newInstance (SpriteFactory .SPRITE_SINGLE , key_message )
651
- key_look = catcommon .LookData ()
652
- key_look .setLookName (key_message )
653
- key_look .setLookFilename (key_filename )
654
- key_sprite .getLookDataList ().add (key_look )
655
-
656
- #set looks and position via started script
657
- when_started_script = catbase .StartScript ()
658
- set_look_brick = catbricks .SetLookBrick ()
659
- set_look_brick .setLook (key_look )
660
- place_at_brick = catbricks .PlaceAtBrick (x_pos , y_pos )
661
- bricks = [place_at_brick , set_look_brick , catbricks .SetSizeToBrick (33 )]
662
- when_started_script .getBrickList ().addAll (bricks )
663
- key_sprite .addScript (when_started_script )
656
+ add_sprite_to_scene = False
657
+ key_sprite = _get_existing_sprite_with_name (catrobat_scene .getSpriteList (), key_message )
658
+ if key_sprite == None :
659
+ add_sprite_to_scene = True
660
+ key_sprite = SpriteFactory ().newInstance (SpriteFactory .SPRITE_SINGLE , key_message )
661
+ key_look = catcommon .LookData ()
662
+ key_look .setLookName (key_message )
663
+ key_look .setLookFilename (key_filename )
664
+ key_sprite .getLookDataList ().add (key_look )
665
+
666
+ #set looks and position via started script
667
+ when_started_script = catbase .StartScript ()
668
+ set_look_brick = catbricks .SetLookBrick ()
669
+ set_look_brick .setLook (key_look )
670
+ place_at_brick = catbricks .PlaceAtBrick (x_pos , y_pos )
671
+ bricks = [place_at_brick , set_look_brick , catbricks .SetSizeToBrick (33 )]
672
+ when_started_script .getBrickList ().addAll (bricks )
673
+ key_sprite .addScript (when_started_script )
664
674
665
675
#when tapped script
666
676
when_tapped_script = catbase .WhenScript ()
667
677
when_tapped_script .addBrick (catbricks .BroadcastBrick (key_message ))
668
678
key_sprite .addScript (when_tapped_script )
669
- catrobat_scene .addSprite (key_sprite )
679
+
680
+ if add_sprite_to_scene :
681
+ catrobat_scene .addSprite (key_sprite )
682
+ return add_sprite_to_scene
670
683
671
684
@staticmethod
672
685
def _key_pressed_block_workaround_script (key , x_pos , y_pos , catrobat_scene ):
@@ -675,20 +688,24 @@ def _key_pressed_block_workaround_script(key, x_pos, y_pos, catrobat_scene):
675
688
#TODO: different names for key pressed block case, key pressed script case
676
689
key_message = _key_to_broadcast_message (key )
677
690
#TODO: Check if sprite already exists
678
- key_sprite = SpriteFactory ().newInstance (SpriteFactory .SPRITE_SINGLE , key_message )
679
- key_look = catcommon .LookData ()
680
- key_look .setLookName (key_message )
681
- key_look .setLookFilename (key_filename )
682
- key_sprite .getLookDataList ().add (key_look )
683
-
684
- #set looks and position via started script
685
- when_started_script = catbase .StartScript ()
686
- set_look_brick = catbricks .SetLookBrick ()
687
- set_look_brick .setLook (key_look )
688
- place_at_brick = catbricks .PlaceAtBrick (x_pos , y_pos )
689
- bricks = [place_at_brick , set_look_brick , catbricks .SetSizeToBrick (33 )]
690
- when_started_script .getBrickList ().addAll (bricks )
691
- key_sprite .addScript (when_started_script )
691
+ add_sprite_to_scene = False
692
+ key_sprite = _get_existing_sprite_with_name (catrobat_scene .getSpriteList (), key_message )
693
+ if key_sprite == None :
694
+ add_sprite_to_scene = True
695
+ key_sprite = SpriteFactory ().newInstance (SpriteFactory .SPRITE_SINGLE , key_message )
696
+ key_look = catcommon .LookData ()
697
+ key_look .setLookName (key_message )
698
+ key_look .setLookFilename (key_filename )
699
+ key_sprite .getLookDataList ().add (key_look )
700
+
701
+ #set looks and position via started script
702
+ when_started_script = catbase .StartScript ()
703
+ set_look_brick = catbricks .SetLookBrick ()
704
+ set_look_brick .setLook (key_look )
705
+ place_at_brick = catbricks .PlaceAtBrick (x_pos , y_pos )
706
+ bricks = [place_at_brick , set_look_brick , catbricks .SetSizeToBrick (33 )]
707
+ when_started_script .getBrickList ().addAll (bricks )
708
+ key_sprite .addScript (when_started_script )
692
709
693
710
#while tapped set global key var to 1
694
711
when_tapped_script = catbase .WhenScript ()
@@ -708,10 +725,12 @@ def _key_pressed_block_workaround_script(key, x_pos, y_pos, catrobat_scene):
708
725
bricks .append (catbricks .WaitUntilBrick (catformula .Formula (not_touching_fe )))
709
726
#set uservariable to 0
710
727
bricks .append (catbricks .SetVariableBrick (catformula .Formula (0 ), key_user_variable ))
711
-
712
728
when_tapped_script .getBrickList ().addAll (bricks )
713
729
key_sprite .addScript (when_tapped_script )
714
- catrobat_scene .addSprite (key_sprite )
730
+
731
+ if add_sprite_to_scene :
732
+ catrobat_scene .addSprite (key_sprite )
733
+ return add_sprite_to_scene
715
734
716
735
@staticmethod
717
736
def _add_key_sprites_to (catrobat_scene , listened_keys ):
@@ -720,29 +739,39 @@ def _add_key_sprites_to(catrobat_scene, listened_keys):
720
739
space_letters_width_offset = 4
721
740
letters_per_row = 12
722
741
space_exists = False
742
+
723
743
listened_keys_names = [key_tuple [0 ] for key_tuple in listened_keys ]
724
744
if "space" in listened_keys_names :
725
745
space_exists = True
726
- listened_keys = set (key_tuple for key_tuple in listened_keys if key_tuple == "space" )
727
- for idx , key_tuple in enumerate (listened_keys ):
728
- if space_exists and idx > 3 :
729
- idx = idx + space_letters_width_offset
730
- width_pos = idx % letters_per_row
731
- height_pos = int (idx / letters_per_row ) + 1
746
+ space_variants = []
747
+ key_pos = 0
748
+ for key_tuple in listened_keys :
749
+ if key_tuple [0 ] == "space" :
750
+ space_variants .append (key_tuple [1 ])
751
+ continue
752
+ if space_exists and key_pos == 4 :
753
+ key_pos = key_pos + space_letters_width_offset
754
+
755
+ width_pos = key_pos % letters_per_row
756
+ height_pos = int (key_pos / letters_per_row ) + 1
732
757
y_pos = - (scratch .STAGE_HEIGHT_IN_PIXELS / 2 ) + y_offset + 40 * height_pos
733
758
x_pos = - (scratch .STAGE_WIDTH_IN_PIXELS / 2 ) + x_offset + 40 * (width_pos + 1 )
759
+
760
+ key_sprite_added = False
734
761
if (key_tuple [1 ] == "listenedKeys" ):
735
- Converter ._key_pressed_script_workaround_script (key_tuple [0 ], x_pos , y_pos ,catrobat_scene )
762
+ key_sprite_added = Converter ._key_pressed_script_workaround_script (key_tuple [0 ], x_pos , y_pos ,catrobat_scene )
736
763
elif (key_tuple [1 ] == "keyPressedBrick" ):
737
- Converter ._key_pressed_block_workaround_script (key_tuple [0 ], x_pos , y_pos ,catrobat_scene )
764
+ key_sprite_added = Converter ._key_pressed_block_workaround_script (key_tuple [0 ], x_pos , y_pos ,catrobat_scene )
765
+ if key_sprite_added :
766
+ key_pos += 1
767
+
738
768
if space_exists :
739
- listened_keys .add (("space" ,"listenedKeys" ))
740
769
y_pos = - (scratch .STAGE_HEIGHT_IN_PIXELS / 2 ) + y_offset + 40
741
770
x_pos = 0
742
- if ( key_tuple [ 1 ] == "listenedKeys" ) :
743
- Converter ._key_pressed_script_workaround_script (key_tuple [ 0 ] , x_pos , y_pos ,catrobat_scene )
744
- elif ( key_tuple [ 1 ] == "keyPressedBrick" ) :
745
- Converter ._key_pressed_block_workaround_script (key_tuple [ 0 ] , x_pos , y_pos ,catrobat_scene )
771
+ if "listenedKeys" in space_variants :
772
+ Converter ._key_pressed_script_workaround_script ("space" , x_pos , y_pos ,catrobat_scene )
773
+ if "keyPressedBrick" in space_variants :
774
+ Converter ._key_pressed_block_workaround_script ("space" , x_pos , y_pos ,catrobat_scene )
746
775
747
776
@staticmethod
748
777
def _update_xml_header (xml_header , scratch_project_id , program_name , scratch_project_instructions ,
0 commit comments