Skip to content

Commit f132837

Browse files
Philipp Fleischhackercfkh
Philipp Fleischhacker
authored andcommitted
[STCC-123] - Fix key sprites not being added correctly (#59)
* Only add sprites to the scene once. * Correctly add all keys to listened_keys * Fix workaround for space key
1 parent 5e92672 commit f132837

File tree

4 files changed

+76
-47
lines changed

4 files changed

+76
-47
lines changed

config/default.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ name: Scratch2Catrobat Converter
44
short_name: S2CC
55
version: 0.9.0
66
build_name: Aegean cat
7-
build_number: 918
7+
build_number: 915
88

99
;-------------------------------------------------------------------------------
1010
[CATROBAT]

src/scratchtocatrobat/converter/converter.py

+73-44
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ def _placeholder_for_unmapped_blocks_to(*args):
109109
def _key_to_broadcast_message(key_name):
110110
return "key " + key_name + " pressed"
111111

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+
112118
def _background_look_to_broadcast_message(look_name):
113119
return "start background scene: " + look_name
114120

@@ -647,26 +653,33 @@ def _key_pressed_script_workaround_script(key, x_pos, y_pos, catrobat_scene):
647653
#load key file and create sprite with looks
648654
key_filename = _key_filename_for(key)
649655
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)
664674

665675
#when tapped script
666676
when_tapped_script = catbase.WhenScript()
667677
when_tapped_script.addBrick(catbricks.BroadcastBrick(key_message))
668678
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
670683

671684
@staticmethod
672685
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):
675688
#TODO: different names for key pressed block case, key pressed script case
676689
key_message = _key_to_broadcast_message(key)
677690
#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)
692709

693710
#while tapped set global key var to 1
694711
when_tapped_script = catbase.WhenScript()
@@ -708,10 +725,12 @@ def _key_pressed_block_workaround_script(key, x_pos, y_pos, catrobat_scene):
708725
bricks.append(catbricks.WaitUntilBrick(catformula.Formula(not_touching_fe)))
709726
#set uservariable to 0
710727
bricks.append(catbricks.SetVariableBrick(catformula.Formula(0), key_user_variable))
711-
712728
when_tapped_script.getBrickList().addAll(bricks)
713729
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
715734

716735
@staticmethod
717736
def _add_key_sprites_to(catrobat_scene, listened_keys):
@@ -720,29 +739,39 @@ def _add_key_sprites_to(catrobat_scene, listened_keys):
720739
space_letters_width_offset = 4
721740
letters_per_row = 12
722741
space_exists = False
742+
723743
listened_keys_names = [key_tuple[0] for key_tuple in listened_keys]
724744
if "space" in listened_keys_names:
725745
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
732757
y_pos = -(scratch.STAGE_HEIGHT_IN_PIXELS / 2) + y_offset + 40 * height_pos
733758
x_pos = -(scratch.STAGE_WIDTH_IN_PIXELS / 2) + x_offset + 40 * (width_pos + 1)
759+
760+
key_sprite_added = False
734761
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)
736763
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+
738768
if space_exists:
739-
listened_keys.add(("space","listenedKeys"))
740769
y_pos = -(scratch.STAGE_HEIGHT_IN_PIXELS / 2) + y_offset + 40
741770
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)
746775

747776
@staticmethod
748777
def _update_xml_header(xml_header, scratch_project_id, program_name, scratch_project_instructions,

src/scratchtocatrobat/scratch/scratch.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ def read_md5_to_resource_path_mapping():
628628
listened_keys += [(argument, "listenedKeys") for argument in script.arguments]
629629

630630
try:
631-
self.listened_keys.union(listened_keys)
631+
self.listened_keys.update(listened_keys)
632632
except AttributeError:
633633
self.listened_keys = set(listened_keys)
634634
# TODO: rename

src/scratchtocatrobat/tools/logger.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def _log_level_for_string(log_level_string):
4141
def setup_logging():
4242
import os
4343
from datetime import datetime
44-
from tools import helpers
44+
from scratchtocatrobat.tools import helpers
4545
log.setLevel(logging.DEBUG)
4646

4747
log_dir = helpers.config.get("PATHS", "logging")

0 commit comments

Comments
 (0)