smalruby-editor 0.1.20 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +3 -10
  4. data/app/assets/javascripts/blocks/control.js.coffee.erb +2 -1
  5. data/app/assets/javascripts/blocks/data.js.coffee.erb +2 -1
  6. data/app/assets/javascripts/blocks/etc.js.coffee.erb +2 -1
  7. data/app/assets/javascripts/blocks/events.js.coffee.erb +5 -4
  8. data/app/assets/javascripts/blocks/field_character.js.coffee.erb +9 -0
  9. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +171 -54
  10. data/app/assets/javascripts/blocks/looks.js.coffee.erb +2 -1
  11. data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -16
  12. data/app/assets/javascripts/blocks/operators.js.coffee.erb +2 -1
  13. data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
  14. data/app/assets/javascripts/blocks/ruby.js.coffee.erb +2 -1
  15. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +25 -3
  16. data/app/assets/javascripts/blocks/sound.js.coffee.erb +2 -1
  17. data/app/assets/javascripts/generators/ruby.js.coffee.erb +27 -5
  18. data/app/assets/javascripts/models/source_code.js.coffee +20 -7
  19. data/app/assets/javascripts/views/main_menu_view.js.coffee +5 -7
  20. data/app/assets/stylesheets/editor.css.scss +5 -1
  21. data/app/assets/stylesheets/toolbox.css.scss.erb +29 -24
  22. data/app/controllers/source_codes_controller.rb +7 -36
  23. data/app/helpers/editor_helper.rb +9 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_button_down_or_up.rb +25 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_button_not_use_pullup.rb +18 -0
  26. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver.rb +22 -0
  27. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_set_speed.rb +20 -0
  28. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_speed.rb +24 -0
  29. data/app/models/concerns/ruby_to_block/block/hardware_on_button_down_or_up.rb +19 -0
  30. data/app/models/concerns/ruby_to_block/block/hardware_operation.rb +15 -0
  31. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_set_speed.rb +22 -0
  32. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_speed.rb +26 -0
  33. data/app/models/concerns/ruby_to_block/block/ruby_p.rb +19 -0
  34. data/app/models/concerns/ruby_to_block/block/{motion_reach_wall.rb → sensing_reach_wall.rb} +1 -1
  35. data/app/models/concerns/ruby_to_block/block/text.rb +3 -2
  36. data/app/models/source_code.rb +20 -0
  37. data/app/views/editor/_toolbox.html.haml +84 -63
  38. data/app/views/editor/index.html.haml +1 -1
  39. data/demos/adjust_2wd_car.rb.xml +179 -0
  40. data/demos/car_chase.rb.xml +129 -126
  41. data/demos/hardware_led.rb.xml +7 -4
  42. data/demos/pong.rb.xml +17 -14
  43. data/demos/star.rb.xml +115 -112
  44. data/lib/smalruby_editor.rb +16 -0
  45. data/lib/smalruby_editor/version.rb +3 -3
  46. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js → application-734570836cdba680c1568220a51af40f.js} +216 -86
  47. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js.gz → application-734570836cdba680c1568220a51af40f.js.gz} +0 -0
  48. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css → application-898cb749439fba4ce44cffeac1216201.css} +37 -9
  49. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css.gz → application-898cb749439fba4ce44cffeac1216201.css.gz} +0 -0
  50. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  51. data/smalruby-editor.gemspec +2 -1
  52. data/spec/acceptance/block_mode/blocks/events/on_hit.feature +2 -0
  53. data/spec/acceptance/block_mode/blocks/hardware/button_down_or_up.feature +79 -0
  54. data/spec/acceptance/block_mode/blocks/hardware/button_not_use_pullup.feature +61 -0
  55. data/spec/acceptance/block_mode/blocks/hardware/motor_driver.feature +73 -0
  56. data/spec/acceptance/block_mode/blocks/hardware/motor_driver_speed.feature +93 -0
  57. data/spec/acceptance/block_mode/blocks/hardware/on_button_down_or_up.feature +87 -0
  58. data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car_speed.feature +111 -0
  59. data/spec/acceptance/block_mode/blocks/motion/reach_wall.feature +1 -1
  60. data/spec/acceptance/block_mode/blocks/operators/text.feature +38 -0
  61. data/spec/acceptance/block_mode/blocks/sensing/hit.feature +98 -52
  62. data/spec/acceptance/block_mode/blocks/sensing/reach_wall.feature +98 -0
  63. data/spec/acceptance/block_mode/demo.feature +3 -1
  64. data/spec/acceptance/standalone/save.feature +51 -0
  65. data/spec/helpers/editor_helper_spec.rb +20 -0
  66. data/spec/javascripts/models/source_code_spec.coffee +40 -0
  67. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +269 -0
  68. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +1 -1
  69. data/spec/models/concerns/ruby_to_block/block/{motion_reach_wall_spec.rb → sensing_reach_wall_spec.rb} +2 -2
  70. data/spec/models/concerns/ruby_to_block/block/text_spec.rb +39 -0
  71. data/spec/models/concerns/ruby_to_block_spec.rb +2 -2
  72. data/spec/models/source_code_spec.rb +53 -0
  73. data/spec/steps/base_steps.rb +5 -0
  74. metadata +56 -12
  75. data/demos/rgb_led_anode.rb.xml +0 -83
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ # language: ja
3
+ @javascript
4
+ 機能: hardware_on_button_down_or_up - 「ボタン[▼PIN]が[▼押された]とき」ブロック
5
+ シナリオ: ブロックのみ配置する
6
+ 前提 "ブロック" タブを表示する
7
+
8
+ もし 次のブロックを配置する:
9
+ """
10
+ %block{:type => "hardware_on_button_down_or_up", :x => "0", :y => "0"}
11
+ %field{:name => "PIN"}<
12
+ D2
13
+ %field{:name => "DOU"}<
14
+ down
15
+ """
16
+ かつ ブロックからソースコードを生成する
17
+
18
+ ならば テキストエディタのプログラムは "" であること
19
+
20
+ シナリオ: キャラクターとブロックを配置する
21
+ 前提 "ブロック" タブを表示する
22
+ かつ 次のキャラクターを追加する:
23
+ | name | costumes | x | y | angle |
24
+ | car1 | car1.png | 0 | 0 | 0 |
25
+
26
+ もし 次のブロックを配置する:
27
+ """
28
+ %block{:type => "character_new", :x => "21", :y => "15"}
29
+ %field{:name => "NAME"}<
30
+ car1
31
+ %statement{:name => "DO"}
32
+ %block{:type => "hardware_on_button_down_or_up", :x => "0", :y => "0"}
33
+ %field{:name => "PIN"}<
34
+ D2
35
+ %field{:name => "DOU"}<
36
+ down
37
+ """
38
+ かつ ブロックからソースコードを生成する
39
+
40
+ ならば テキストエディタのプログラムは以下であること:
41
+ """
42
+ require "smalruby"
43
+
44
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
45
+
46
+ car1.on(:button_down, "D2") do
47
+
48
+ end
49
+
50
+ """
51
+
52
+ シナリオ: キャラクターとイベントとブロックを配置する
53
+ 前提 "ブロック" タブを表示する
54
+ かつ 次のキャラクターを追加する:
55
+ | name | costumes | x | y | angle |
56
+ | car1 | car1.png | 0 | 0 | 0 |
57
+
58
+ もし 次のブロックを配置する:
59
+ """
60
+ %block{:type => "character_new", :x => "21", :y => "15"}
61
+ %field{:name => "NAME"}<
62
+ car1
63
+ %statement{:name => "DO"}
64
+ %block{:type => "events_on_start"}
65
+ %statement{:name => "DO"}
66
+ %block{:type => "hardware_on_button_down_or_up", :x => "0", :y => "0"}
67
+ %field{:name => "PIN"}<
68
+ D2
69
+ %field{:name => "DOU"}<
70
+ up
71
+ """
72
+ かつ ブロックからソースコードを生成する
73
+
74
+ ならば テキストエディタのプログラムは以下であること:
75
+ """
76
+ require "smalruby"
77
+
78
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
79
+
80
+ car1.on(:start) do
81
+
82
+ on(:button_up, "D2") do
83
+
84
+ end
85
+ end
86
+
87
+ """
@@ -0,0 +1,111 @@
1
+ # encoding: utf-8
2
+ # language: ja
3
+ @javascript
4
+ 機能: hardware_two_wheel_drive_car_{speed,set_speed} - 「2WD車[▼PIN]の[▼LOR]の{速度%,速度を<SPEED>%にする}」ブロック
5
+ 背景:
6
+ 前提 "ブロック" タブを表示する
7
+ かつ 次のキャラクターを追加する:
8
+ | name | costumes | x | y | angle |
9
+ | car1 | car1.png | 0 | 0 | 0 |
10
+
11
+ シナリオ: ブロックのみ、キャラクターとブロック、キャラクターとイベントとブロックをそれぞれ配置する
12
+ # ブロックのみ配置する
13
+ もし 次のブロック("two_wheel_drive_car_{speed,set_speed}")を配置する:
14
+ """
15
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
16
+ %value{:name => "ARG"}
17
+ %block{:type => "hardware_two_wheel_drive_car_speed"}
18
+ %field{:name => "PIN"}<
19
+ D5
20
+ %field{:name => "LOR"}<
21
+ left
22
+ %next
23
+ %block{:type => "hardware_two_wheel_drive_car_set_speed"}
24
+ %field{:name => "PIN"}<
25
+ D5
26
+ %field{:name => "LOR"}<
27
+ left
28
+ %value{:name => "SPEED"}
29
+ %block{:type => "math_number"}
30
+ %field{:name => "NUM"}<
31
+ 50
32
+ """
33
+ かつ ブロックからソースコードを生成する
34
+
35
+ ならば テキストエディタのプログラムは以下であること:
36
+ """
37
+ require "smalruby"
38
+
39
+ p("")
40
+
41
+ """
42
+
43
+ # キャラクターとブロックを配置する
44
+ もし 次のブロック("hardware_two_wheel_drive_car_{speed,set_speed}")を配置する:
45
+ """
46
+ %block{:type => "character_new", :x => "21", :y => "15"}
47
+ %field{:name => "NAME"}<
48
+ car1
49
+ %statement{:name => "DO"}
50
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
51
+ %value{:name => "ARG"}
52
+ %block{:type => "hardware_two_wheel_drive_car_speed"}
53
+ %field{:name => "PIN"}<
54
+ D5
55
+ %field{:name => "LOR"}<
56
+ left
57
+ %next
58
+ %block{:type => "hardware_two_wheel_drive_car_set_speed"}
59
+ %field{:name => "PIN"}<
60
+ D5
61
+ %field{:name => "LOR"}<
62
+ left
63
+ %value{:name => "SPEED"}
64
+ %block{:type => "math_number"}
65
+ %field{:name => "NUM"}<
66
+ 50
67
+ """
68
+ かつ ブロックからソースコードを生成する
69
+
70
+ ならば テキストエディタのプログラムは以下を含むこと:
71
+ """
72
+ p(car1.two_wheel_drive_car("D5").left_speed)
73
+ car1.two_wheel_drive_car("D5").left_speed = 50
74
+ """
75
+
76
+ # キャラクターとイベントとブロックを配置する
77
+ もし 次のブロック("hardware_two_wheel_drive_car_{speed,set_speed}")を配置する:
78
+ """
79
+ %block{:type => "character_new", :x => "21", :y => "15"}
80
+ %field{:name => "NAME"}<
81
+ car1
82
+ %statement{:name => "DO"}
83
+ %block{:type => "events_on_start"}
84
+ %statement{:name => "DO"}
85
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
86
+ %value{:name => "ARG"}
87
+ %block{:type => "hardware_two_wheel_drive_car_speed"}
88
+ %field{:name => "PIN"}<
89
+ D5
90
+ %field{:name => "LOR"}<
91
+ right
92
+ %next
93
+ %block{:type => "hardware_two_wheel_drive_car_set_speed"}
94
+ %field{:name => "PIN"}<
95
+ D5
96
+ %field{:name => "LOR"}<
97
+ right
98
+ %value{:name => "SPEED"}
99
+ %block{:type => "math_number"}
100
+ %field{:name => "NUM"}<
101
+ 50
102
+ """
103
+ かつ ブロックからソースコードを生成する
104
+
105
+ ならば テキストエディタのプログラムは以下を含むこと:
106
+ """
107
+ car1.on(:start) do
108
+ p(two_wheel_drive_car("D5").right_speed)
109
+ two_wheel_drive_car("D5").right_speed = 50
110
+ end
111
+ """
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # language: ja
3
3
  @javascript
4
- 機能: motion_reach_wall - 「条件:端に着いた」ブロック
4
+ 機能: motion_reach_wall - 「条件:端に触れた」ブロック (後方互換性)
5
5
  シナリオ: ブロックのみ配置する
6
6
  前提 "ブロック" タブを表示する
7
7
 
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ # language: ja
3
+ @javascript
4
+ 機能: text - 「"文章"」ブロック
5
+ 背景:
6
+ 前提 "ブロック" タブを表示する
7
+
8
+ シナリオ: ブロックを配置する
9
+ もし 次のブロック("text")を配置する:
10
+ """
11
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
12
+ %value{:name => "ARG"}
13
+ %block{:type => "text"}
14
+ %field{:name => "TEXT"}<
15
+ こんにちは
16
+ """
17
+ かつ ブロックからソースコードを生成する
18
+
19
+ ならば テキストエディタのプログラムは以下を含むこと:
20
+ """
21
+ p("こんにちは")
22
+ """
23
+
24
+ シナリオ: ダブルクォーテーションを含む文章を設定したブロックを配置する
25
+ もし 次のブロック("text")を配置する:
26
+ """
27
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true"}
28
+ %value{:name => "ARG"}
29
+ %block{:type => "text"}
30
+ %field{:name => "TEXT"}<
31
+ ""
32
+ """
33
+ かつ ブロックからソースコードを生成する
34
+
35
+ ならば テキストエディタのプログラムは以下を含むこと:
36
+ """
37
+ p("\"\"")
38
+ """
@@ -10,11 +10,11 @@
10
10
  | car2 | car2.png | 0 | 0 | 0 |
11
11
 
12
12
  もし 次のブロックを配置する:
13
- """
14
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
15
- %field{:name => "CHAR"}<
16
- car2
17
- """
13
+ """
14
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
15
+ %field{:name => "CHAR"}<
16
+ car2
17
+ """
18
18
  かつ ブロックからソースコードを生成する
19
19
 
20
20
  ならば テキストエディタのプログラムは "" であること
@@ -27,22 +27,22 @@
27
27
  | car2 | car2.png | 0 | 0 | 0 |
28
28
 
29
29
  もし 次のブロックを配置する:
30
- """
31
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
32
- %value{:name => "ARG"}
33
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
34
- %field{:name => "CHAR"}<
35
- car2
36
- """
30
+ """
31
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
32
+ %value{:name => "ARG"}
33
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
34
+ %field{:name => "CHAR"}<
35
+ car2
36
+ """
37
37
  かつ ブロックからソースコードを生成する
38
38
 
39
39
  ならば テキストエディタのプログラムは以下であること:
40
- """
41
- require "smalruby"
40
+ """
41
+ require "smalruby"
42
42
 
43
- p("")
43
+ p("")
44
44
 
45
- """
45
+ """
46
46
 
47
47
  シナリオ: キャラクターと文とブロックを配置する
48
48
  前提 "ブロック" タブを表示する
@@ -52,27 +52,32 @@
52
52
  | car2 | car2.png | 0 | 0 | 0 |
53
53
 
54
54
  もし 次のブロックを配置する:
55
- """
56
- %block{:type => "character_new", :x => "21", :y => "15"}
57
- %field{:name => "NAME"}<
58
- car1
59
- %statement{:name => "DO"}
60
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
61
- %value{:name => "ARG"}
62
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
63
- %field{:name => "CHAR"}<
64
- car2
65
- """
55
+ """
56
+ %block{:type => "character_new", :x => "21", :y => "15"}
57
+ %field{:name => "NAME"}<
58
+ car1
59
+ %statement{:name => "DO"}
60
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
61
+ %value{:name => "ARG"}
62
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
63
+ %field{:name => "CHAR"}<
64
+ car2
65
+ %next
66
+ %block{:type => "character_new", :x => "21", :y => "15"}
67
+ %field{:name => "NAME"}<
68
+ car2
69
+ """
66
70
  かつ ブロックからソースコードを生成する
67
71
 
68
72
  ならば テキストエディタのプログラムは以下であること:
69
- """
70
- require "smalruby"
73
+ """
74
+ require "smalruby"
71
75
 
72
- car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
73
- p(car1.hit?(car2))
76
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
77
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
78
+ p(car1.hit?(car2))
74
79
 
75
- """
80
+ """
76
81
 
77
82
  シナリオ: キャラクターとイベントと文とブロックを配置する
78
83
  前提 "ブロック" タブを表示する
@@ -82,29 +87,70 @@
82
87
  | car2 | car2.png | 0 | 0 | 0 |
83
88
 
84
89
  もし 次のブロックを配置する:
85
- """
86
- %block{:type => "character_new", :x => "21", :y => "15"}
87
- %field{:name => "NAME"}<
88
- car1
89
- %statement{:name => "DO"}
90
- %block{:type => "events_on_start"}
91
- %statement{:name => "DO"}
92
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
93
- %value{:name => "ARG"}
94
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
95
- %field{:name => "CHAR"}<
96
- car2
97
- """
90
+ """
91
+ %block{:type => "character_new", :x => "21", :y => "15"}
92
+ %field{:name => "NAME"}<
93
+ car1
94
+ %statement{:name => "DO"}
95
+ %block{:type => "events_on_start"}
96
+ %statement{:name => "DO"}
97
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
98
+ %value{:name => "ARG"}
99
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
100
+ %field{:name => "CHAR"}<
101
+ car2
102
+ %next
103
+ %block{:type => "character_new", :x => "21", :y => "15"}
104
+ %field{:name => "NAME"}<
105
+ car2
106
+ """
98
107
  かつ ブロックからソースコードを生成する
99
108
 
100
109
  ならば テキストエディタのプログラムは以下であること:
101
- """
102
- require "smalruby"
110
+ """
111
+ require "smalruby"
103
112
 
104
- car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
113
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
114
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
105
115
 
106
- car1.on(:start) do
107
- p(hit?(car2))
108
- end
116
+ car1.on(:start) do
117
+ p(hit?(car2))
118
+ end
109
119
 
110
- """
120
+ """
121
+
122
+ シナリオ: 配置していないキャラクターは常に偽にする
123
+ 前提 "ブロック" タブを表示する
124
+ かつ 次のキャラクターを追加する:
125
+ | name | costumes | x | y | angle |
126
+ | car1 | car1.png | 0 | 0 | 0 |
127
+ | car2 | car2.png | 0 | 0 | 0 |
128
+
129
+ もし 次のブロックを配置する:
130
+ """
131
+ %block{:type => "character_new", :x => "21", :y => "15"}
132
+ %field{:name => "NAME"}<
133
+ car1
134
+ %statement{:name => "DO"}
135
+ %block{:type => "events_on_start"}
136
+ %statement{:name => "DO"}
137
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
138
+ %value{:name => "ARG"}
139
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
140
+ %field{:name => "CHAR"}<
141
+ car2
142
+ """
143
+ かつ ブロックからソースコードを生成する
144
+
145
+ ならば テキストエディタのプログラムは以下であること:
146
+ """
147
+ require "smalruby"
148
+
149
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
150
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
151
+
152
+ car1.on(:start) do
153
+ p(hit?(car2))
154
+ end
155
+
156
+ """
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+ # language: ja
3
+ @javascript
4
+ 機能: sensing_reach_wall - 「条件:端に触れた」ブロック
5
+ シナリオ: ブロックのみ配置する
6
+ 前提 "ブロック" タブを表示する
7
+
8
+ もし 次のブロックを配置する:
9
+ """
10
+ %block{:type => "sensing_reach_wall", :x => "0", :y => "0"}
11
+ """
12
+ かつ ブロックからソースコードを生成する
13
+
14
+ ならば テキストエディタのプログラムは "" であること
15
+
16
+ シナリオ: 条件分岐とブロックを配置する
17
+ 前提 "ブロック" タブを表示する
18
+
19
+ もし 次のブロックを配置する:
20
+ """
21
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
22
+ %value{:name => "COND"}
23
+ %block{:type => "sensing_reach_wall"}
24
+ """
25
+ かつ ブロックからソースコードを生成する
26
+
27
+ ならば テキストエディタのプログラムは以下であること:
28
+ """
29
+ require "smalruby"
30
+
31
+ if false
32
+
33
+ end
34
+
35
+ """
36
+
37
+ シナリオ: キャラクターと条件分岐とブロックを配置する
38
+ 前提 "ブロック" タブを表示する
39
+ かつ 次のキャラクターを追加する:
40
+ | name | costumes | x | y | angle |
41
+ | car1 | car1.png | 0 | 0 | 0 |
42
+
43
+ もし 次のブロックを配置する:
44
+ """
45
+ %block{:type => "character_new", :x => "21", :y => "15"}
46
+ %field{:name => "NAME"}<
47
+ car1
48
+ %statement{:name => "DO"}
49
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
50
+ %value{:name => "COND"}
51
+ %block{:type => "sensing_reach_wall"}
52
+ """
53
+ かつ ブロックからソースコードを生成する
54
+
55
+ ならば テキストエディタのプログラムは以下であること:
56
+ """
57
+ require "smalruby"
58
+
59
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
60
+ if car1.reach_wall?
61
+
62
+ end
63
+
64
+ """
65
+
66
+ シナリオ: キャラクターとイベントと条件分岐とブロックを配置する
67
+ 前提 "ブロック" タブを表示する
68
+ かつ 次のキャラクターを追加する:
69
+ | name | costumes | x | y | angle |
70
+ | car1 | car1.png | 0 | 0 | 0 |
71
+
72
+ もし 次のブロックを配置する:
73
+ """
74
+ %block{:type => "character_new", :x => "21", :y => "15"}
75
+ %field{:name => "NAME"}<
76
+ car1
77
+ %statement{:name => "DO"}
78
+ %block{:type => "events_on_start"}
79
+ %statement{:name => "DO"}
80
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
81
+ %value{:name => "COND"}
82
+ %block{:type => "sensing_reach_wall"}
83
+ """
84
+ かつ ブロックからソースコードを生成する
85
+
86
+ ならば テキストエディタのプログラムは以下であること:
87
+ """
88
+ require "smalruby"
89
+
90
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
91
+
92
+ car1.on(:start) do
93
+ if reach_wall?
94
+
95
+ end
96
+ end
97
+
98
+ """