smalruby-editor 0.1.20 → 0.1.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby-editor might be problematic. Click here for more details.

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,24 @@
1
+ module RubyToBlock
2
+ module Block
3
+ class HardwareMotorDriverSpeed < Value
4
+ include CharacterOperation
5
+
6
+ blocknize '^\s*' + CHAR_RE +
7
+ 'motor_driver\("(D(?:3|5|6|9|10|11))"\)\.speed\s*$',
8
+ value: true
9
+
10
+ def self.process_match_data(md, context)
11
+ md2 = regexp.match(md[type])
12
+
13
+ character = get_character(context, md2[1])
14
+ return false if context.receiver && context.receiver != character
15
+
16
+ block = new(fields: { PIN: md2[2] })
17
+ context.add_value(block)
18
+ block.character = character
19
+
20
+ true
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ module RubyToBlock
2
+ module Block
3
+ class HardwareOnButtonDownOrUp < CharacterEvent
4
+ include HardwareOperation
5
+
6
+ blocknize '^\s*' + CHAR_RE +
7
+ 'on\(:button_(down|up),' + DIO_PIN_RE + '\)\s+' +
8
+ 'do\s*$',
9
+ statement: true, indent: true
10
+
11
+ def self.process_match_data(md, context)
12
+ md2 = regexp.match(md[type])
13
+ add_character_event_blocks(context, md2[1],
14
+ new(fields: { PIN: md2[3], DOU: md2[2] }))
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ # ハードウェアのメソッドや属性に共通するメソッドや定数を定義するモジュール
5
+ module HardwareOperation
6
+ extend ActiveSupport::Concern
7
+
8
+ DIO_PIN_RE = '\s*"(D(?:[2-9]|10|11|12|13))"\s*'
9
+ PWM_PIN_RE = '\s*"(D(?:3|5|6|9|10|11))"\s*'
10
+ AIO_PIN_RE = '\s*"(A[0-5])"\s*'
11
+ TWO_WHEEL_DRIVE_CAR_PIN_RE = '\s*"(D[56])"\s*'
12
+ LOR_RE = '(left|right)'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class HardwareTwoWheelDriveCarSetSpeed < CharacterMethodCall
5
+ include HardwareOperation
6
+
7
+ blocknize '^\s*' + CHAR_RE +
8
+ 'two_wheel_drive_car\(' + TWO_WHEEL_DRIVE_CAR_PIN_RE + '\)\.' +
9
+ LOR_RE + '_speed\s*=\s*(\S+)\s*$',
10
+ statement: true, inline: true
11
+
12
+ def self.process_match_data(md, context)
13
+ md2 = regexp.match(md[type])
14
+ add_character_method_call_block(context, md2[1],
15
+ new(fields: { PIN: md2[2],
16
+ LOR: md2[3] }),
17
+ SPEED: md2[4])
18
+ true
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module RubyToBlock
2
+ module Block
3
+ class HardwareTwoWheelDriveCarSpeed < Value
4
+ include CharacterOperation
5
+ include HardwareOperation
6
+
7
+ blocknize '^\s*' + CHAR_RE +
8
+ 'two_wheel_drive_car\(' + TWO_WHEEL_DRIVE_CAR_PIN_RE + '\)\.' +
9
+ LOR_RE + '_speed\s*$',
10
+ value: true
11
+
12
+ def self.process_match_data(md, context)
13
+ md2 = regexp.match(md[type])
14
+
15
+ character = get_character(context, md2[1])
16
+ return false if context.receiver && context.receiver != character
17
+
18
+ block = new(fields: { PIN: md2[2], LOR: md2[3] })
19
+ context.add_value(block)
20
+ block.character = character
21
+
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class RubyP < CharacterMethodCall
5
+ blocknize '^\s*p\((.+)\)\s*$',
6
+ statement: true, inline: true
7
+
8
+ def self.process_match_data(md, context)
9
+ block = new
10
+ context.add_block(block)
11
+
12
+ md2 = regexp.match(md[type])
13
+ process_value_string(context, block, md2[1], :ARG)
14
+
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module RubyToBlock
3
3
  module Block
4
- class MotionReachWall < Value
4
+ class SensingReachWall < Value
5
5
  include CharacterOperation
6
6
 
7
7
  blocknize '^\s*' + CHAR_RE + 'reach_wall\?\s*$',
@@ -2,11 +2,12 @@
2
2
  module RubyToBlock
3
3
  module Block
4
4
  class Text < Value
5
- blocknize '^\s*"([^"]*)"\s*$', value: true
5
+ blocknize '^\s*"(.*)"\s*$', value: true
6
6
 
7
7
  def self.process_match_data(md, context)
8
8
  md2 = regexp.match(md[type])
9
- context.add_value(new(fields: { TEXT: md2[1] }))
9
+ text = md2[1].gsub(/\\"/, '"')
10
+ context.add_value(new(fields: { TEXT: text }))
10
11
 
11
12
  true
12
13
  end
@@ -64,6 +64,26 @@ class SourceCode < ActiveRecord::Base
64
64
  Digest::SHA256.hexdigest(data)
65
65
  end
66
66
 
67
+ # ソースコードの概要を取得する
68
+ def summary
69
+ res = {}
70
+ if /\.xml\z/ =~ filename
71
+ res[:filename] = filename.sub(/\.xml\z/, '')
72
+
73
+ doc = Nokogiri::HTML.parse(data)
74
+ if (attr = doc.xpath('//character[1]/@costumes').first)
75
+ res[:imageUrl] = "/smalruby/assets/#{attr.value}"
76
+ end
77
+ text = doc.xpath('//block[@type="ruby_comment"][1]' +
78
+ '/field[@name="COMMENT"]/text()').first
79
+ res[:title] = text.to_s if text
80
+ else
81
+ res[:filename] = filename
82
+ end
83
+ res[:title] = filename unless res[:title]
84
+ res
85
+ end
86
+
67
87
  private
68
88
 
69
89
  def validate_filename
@@ -49,9 +49,6 @@
49
49
  -# もし端に着いたら、跳ね返る
50
50
  %block{:type => "#{category}_turn_if_reach_wall"}
51
51
 
52
- -# 条件:端に着いた
53
- %block{:type => "#{category}_reach_wall"}
54
-
55
52
  -# 跳ね返る
56
53
  %block{:type => "#{category}_turn"}
57
54
 
@@ -85,15 +82,14 @@
85
82
  - category = 'hardware'
86
83
  %category{:name => 'アクチュエータ'}
87
84
  -#- subcategory = 'servo'
88
- -# サーボ[▼ピン]を( )度(5~180)にする
85
+ -# サーボ[▼PIN]を( )度(5~180)にする
89
86
  -#%block{:type => "#{category}_#{subcategory}_set_position"}
90
87
  = toolbox_number_value('POS', 90)
91
88
 
92
89
  - subcategory = 'two_wheel_drive_car'
93
- -# 2WD車[▼ピン]を( )秒[▼コマンド]
90
+ -# 2WD車[▼PIN]を( )秒[▼コマンド]
94
91
  %block{:type => "#{category}_#{subcategory}_run"}
95
- %field{:name => 'PIN'}<
96
- D6
92
+ = toolbox_pin_field('D5')
97
93
  = toolbox_number_value('SEC', 1)
98
94
  %value{:name => 'COMMAND'}
99
95
  %block{:type => "#{category}_#{subcategory}_commands"}
@@ -103,30 +99,42 @@
103
99
  %field{:name => 'COMMAND'}<
104
100
  forward
105
101
 
106
- -# 2WD車[▼ピン]を進める
102
+ -# 2WD車[▼PIN]を進める
107
103
  %block{:type => "#{category}_#{subcategory}_forward"}
108
- %field{:name => 'PIN'}<
109
- D6
104
+ = toolbox_pin_field('D5')
110
105
 
111
- -# 2WD車[▼ピン]をバックさせる
106
+ -# 2WD車[▼PIN]をバックさせる
112
107
  %block{:type => "#{category}_#{subcategory}_backward"}
113
- %field{:name => 'PIN'}<
114
- D6
108
+ = toolbox_pin_field('D5')
115
109
 
116
- -# 2WD車[▼ピン]を左に曲げる
110
+ -# 2WD車[▼PIN]を左に曲げる
117
111
  %block{:type => "#{category}_#{subcategory}_turn_left"}
118
- %field{:name => 'PIN'}<
119
- D6
112
+ = toolbox_pin_field('D5')
120
113
 
121
- -# 2WD車[▼ピン]を右に曲げる
114
+ -# 2WD車[▼PIN]を右に曲げる
122
115
  %block{:type => "#{category}_#{subcategory}_turn_right"}
123
- %field{:name => 'PIN'}<
124
- D6
116
+ = toolbox_pin_field('D5')
125
117
 
126
- -# 2WD車[▼ピン]を止める
118
+ -# 2WD車[▼PIN]を止める
127
119
  %block{:type => "#{category}_#{subcategory}_stop"}
128
- %field{:name => 'PIN'}<
129
- D6
120
+ = toolbox_pin_field('D5')
121
+
122
+ -# 2WD車[▼PIN]の[▼LOR]の速度を<SPEED>%にする
123
+ %block{:type => "#{category}_#{subcategory}_set_speed"}
124
+ = toolbox_pin_field('D5')
125
+ = toolbox_number_value('SPEED', 100)
126
+
127
+ - subcategory = 'motor_driver'
128
+ -# (モータードライバ[▼PIN]で)モーターを[▼正転させる]
129
+ %block{:type => "#{category}_#{subcategory}"}
130
+ = toolbox_pin_field('D6')
131
+ %field{:name => 'METHOD'}<
132
+ forward
133
+
134
+ -# (モータードライバ[▼PIN]の)モーターの速度を<SPEED>%にする
135
+ %block{:type => "#{category}_#{subcategory}_set_speed"}
136
+ = toolbox_pin_field('D6')
137
+ = toolbox_number_value('SPEED', 100)
130
138
 
131
139
  - category = 'looks'
132
140
  %category{:name => '見た目'}
@@ -173,17 +181,17 @@
173
181
 
174
182
  - category = 'hardware'
175
183
  - subcategory = 'led'
176
- -# LED[▼ピン]をオンにする
184
+ -# LED[▼PIN]をオンにする
177
185
  %block{:type => "#{category}_#{subcategory}_on"}
178
186
 
179
- -# LED[▼ピン]をオフにする
187
+ -# LED[▼PIN]をオフにする
180
188
  %block{:type => "#{category}_#{subcategory}_off"}
181
189
 
182
190
  -#- subcategory = 'rgb_led'
183
- -# RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
191
+ -# RGB LED[▼アノード]コモン[▼PIN]を[カラー]にする
184
192
  -#%block{:type => "#{category}_#{subcategory}_on"}
185
193
 
186
- -# RGB LED[▼アノード]コモン[▼ピン]をオフにする
194
+ -# RGB LED[▼アノード]コモン[▼PIN]をオフにする
187
195
  -#%block{:type => "#{category}_#{subcategory}_off"}
188
196
 
189
197
  -#- subcategory = 'seven_segment_display'
@@ -247,11 +255,8 @@
247
255
  -# センサー[▼PIN]が変化したとき
248
256
  %block{:type => "#{category}_on_sensor_change"}
249
257
 
250
- -# ボタン[▼]を押したとき
251
- -#%block{:type => "#{category}_on_button_down"}
252
-
253
- -# ボタン[▼]を離したとき
254
- -#%block{:type => "#{category}_on_button_up"}
258
+ -# ボタン[▼PIN]が[▼押された]とき
259
+ %block{:type => "#{category}_on_button_down_or_up"}
255
260
 
256
261
  - category = 'control'
257
262
  %category{:name => '制御'}
@@ -295,53 +300,65 @@
295
300
 
296
301
  - category = 'sensing'
297
302
  %category{:name => '調べる'}
298
- -# 条件:キーボードの[▼キー]が[▼押された]
299
- %block{:type => "#{category}_input_key_push_or_down"}
300
- = toolbox_key_field
303
+ %category{:name => '一般'}
304
+ -# 条件:端に触れた
305
+ %block{:type => "#{category}_reach_wall"}
306
+
307
+ -# 条件:キーボードの[▼キー]が[▼押された]
308
+ %block{:type => "#{category}_input_key_push_or_down"}
309
+ = toolbox_key_field
301
310
 
302
- -# 条件:マウスの[▼左ボタン]が[▼押された]
303
- %block{:type => "#{category}_input_mouse_push_or_down"}
311
+ -# 条件:マウスの[▼左ボタン]が[▼押された]
312
+ %block{:type => "#{category}_input_mouse_push_or_down"}
304
313
 
305
- -# 変数:マウスのx座標
306
- %block{:type => "#{category}_input_mouse_pos_x"}
314
+ -# 変数:マウスのx座標
315
+ %block{:type => "#{category}_input_mouse_pos_x"}
307
316
 
308
- -# 変数:マウスのy座標
309
- %block{:type => "#{category}_input_mouse_pos_y"}
317
+ -# 変数:マウスのy座標
318
+ %block{:type => "#{category}_input_mouse_pos_y"}
310
319
 
311
- -# 条件:[▼キャラクター]に触れた
312
- %block{:type => "#{category}_hit"}
320
+ -# 条件:[▼キャラクター]に触れた
321
+ %block{:type => "#{category}_hit"}
313
322
 
314
- -# [ ]と聞いて待つ
315
- -#%block{:type => "#{category}_ask"}
316
- -# = toolbox_text_value('TEXT', 'あなたのお名前は?')
323
+ -# [ ]と聞いて待つ
324
+ -#%block{:type => "#{category}_ask"}
325
+ -# = toolbox_text_value('TEXT', 'あなたのお名前は?')
317
326
 
318
- -# 変数:答え
319
- -#%block{:type => "#{category}_answer"}
327
+ -# 変数:答え
328
+ -#%block{:type => "#{category}_answer"}
320
329
 
321
- -# 変数:タイマー
322
- -#%block{:type => "#{category}_timer_count"}
330
+ -# 変数:タイマー
331
+ -#%block{:type => "#{category}_timer_count"}
323
332
 
324
- -# タイマーをリセット
325
- -#%block{:type => "#{category}_timer_reset"}
333
+ -# タイマーをリセット
334
+ -#%block{:type => "#{category}_timer_reset"}
326
335
 
327
- -# 変数:[▼キャラクター]の[▼プロパティ]
328
- %block{:type => "#{category}_character_property"}
336
+ -# 変数:[▼キャラクター]の[▼プロパティ]
337
+ %block{:type => "#{category}_character_property"}
329
338
 
330
- -# 変数:現在の[▼時]
331
- %block{:type => "#{category}_time_now"}
339
+ -# 変数:現在の[▼時]
340
+ %block{:type => "#{category}_time_now"}
332
341
 
333
- -# 変数:2000年からの日数
334
- -#%block{:type => "#{category}_days_since_2000"}
342
+ -# 変数:2000年からの日数
343
+ -#%block{:type => "#{category}_days_since_2000"}
335
344
 
336
345
  - category = 'hardware'
337
- -# センサー[▼PIN]
338
- %block{:type => "#{category}_sensor_value"}
346
+ %category{:name => 'ハードウェア'}
347
+ -# センサー[▼PIN]
348
+ %block{:type => "#{category}_sensor_value"}
349
+ = toolbox_pin_field('A0')
350
+
351
+ -# 条件:ボタン[▼PIN]が[▼押された]
352
+ %block{:type => "#{category}_button_down_or_up"}
353
+ = toolbox_pin_field('D3')
339
354
 
340
- -# 条件:ボタン[▼]を押している
341
- -#%block{:type => "#{category}_button_down"}
355
+ -# 2WD車[▼PIN]の[▼LOR]の速度%
356
+ %block{:type => "#{category}_two_wheel_drive_car_speed"}
357
+ = toolbox_pin_field('D5')
342
358
 
343
- -# 条件:ボタン[▼]を離している
344
- -#%block{:type => "#{category}_button_up"}
359
+ -# (モータードライバ[▼PIN]の)モーターの速度(%)
360
+ %block{:type => "#{category}_motor_driver_speed"}
361
+ = toolbox_pin_field('D6')
345
362
 
346
363
  - category = 'operators'
347
364
  %category{:name => '演算'}
@@ -448,3 +465,7 @@
448
465
  %category{:name => 'ハードウェア'}
449
466
  -# ハードウェアを準備する
450
467
  %block{:type => "#{category}_init_hardware"}
468
+
469
+ -# ボタン[▼PIN]のプルアップ抵抗を使わない
470
+ %block{:type => "#{category}_button_not_use_pullup"}
471
+ = toolbox_pin_field('D3')
@@ -127,4 +127,4 @@
127
127
 
128
128
  - if raspberrypi?
129
129
  %script{type: "text/javascript"}
130
- $(function() { $('div[id=":5"]').hide(); });
130
+ $(function() { $('div[id=":7"]').hide(); });
@@ -0,0 +1,179 @@
1
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2
+ <character name="car1" x="170" y="266" costumes="car2.png" angle="241" rotation_style="left_right" />
3
+ <character name="car2" x="420" y="260" costumes="car2.png" angle="0" rotation_style="left_right" />
4
+ <character name="frog1" x="276" y="88" costumes="frog1.png" angle="0" />
5
+ <block type="hardware_init_hardware" x="177" y="30" />
6
+ <block type="ruby_comment" x="178" y="70">
7
+ <field name="COMMENT">2WD車の左右のモーターを調整する</field>
8
+ <next>
9
+ <block type="character_new">
10
+ <field name="NAME">frog1</field>
11
+ <statement name="DO">
12
+ <block type="events_on_start">
13
+ <statement name="DO">
14
+ <block type="looks_say" inline="true">
15
+ <value name="TEXT">
16
+ <block type="text">
17
+ <field name="TEXT">クリックすると前と後ろに動かすよ。←、→で左右のモーターの速度を調整できるよ</field>
18
+ </block>
19
+ </value>
20
+ </block>
21
+ </statement>
22
+ <next>
23
+ <block type="events_on_click">
24
+ <statement name="DO">
25
+ <block type="hardware_two_wheel_drive_car_run" inline="true">
26
+ <field name="PIN">D5</field>
27
+ <value name="SEC">
28
+ <block type="math_number">
29
+ <field name="NUM">2</field>
30
+ </block>
31
+ </value>
32
+ <value name="COMMAND">
33
+ <block type="hardware_two_wheel_drive_car_commands">
34
+ <field name="COMMAND">forward</field>
35
+ </block>
36
+ </value>
37
+ <next>
38
+ <block type="hardware_two_wheel_drive_car_run" inline="true">
39
+ <field name="PIN">D5</field>
40
+ <value name="SEC">
41
+ <block type="math_number">
42
+ <field name="NUM">2</field>
43
+ </block>
44
+ </value>
45
+ <value name="COMMAND">
46
+ <block type="hardware_two_wheel_drive_car_commands">
47
+ <field name="COMMAND">backward</field>
48
+ </block>
49
+ </value>
50
+ </block>
51
+ </next>
52
+ </block>
53
+ </statement>
54
+ <next>
55
+ <block type="events_on_key_push_or_down">
56
+ <field name="KEY">K_LEFT</field>
57
+ <field name="POD">push</field>
58
+ <statement name="DO">
59
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
60
+ <field name="PIN">D5</field>
61
+ <field name="LOR">left</field>
62
+ <value name="SPEED">
63
+ <block type="operators_minus" inline="true">
64
+ <value name="A">
65
+ <block type="hardware_two_wheel_drive_car_speed">
66
+ <field name="PIN">D5</field>
67
+ <field name="LOR">left</field>
68
+ </block>
69
+ </value>
70
+ <value name="B">
71
+ <block type="math_number">
72
+ <field name="NUM">1</field>
73
+ </block>
74
+ </value>
75
+ </block>
76
+ </value>
77
+ <next>
78
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
79
+ <field name="PIN">D5</field>
80
+ <field name="LOR">right</field>
81
+ <value name="SPEED">
82
+ <block type="math_number">
83
+ <field name="NUM">100</field>
84
+ </block>
85
+ </value>
86
+ </block>
87
+ </next>
88
+ </block>
89
+ </statement>
90
+ <next>
91
+ <block type="events_on_key_push_or_down">
92
+ <field name="KEY">K_RIGHT</field>
93
+ <field name="POD">push</field>
94
+ <statement name="DO">
95
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
96
+ <field name="PIN">D5</field>
97
+ <field name="LOR">left</field>
98
+ <value name="SPEED">
99
+ <block type="math_number">
100
+ <field name="NUM">100</field>
101
+ </block>
102
+ </value>
103
+ <next>
104
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
105
+ <field name="PIN">D5</field>
106
+ <field name="LOR">right</field>
107
+ <value name="SPEED">
108
+ <block type="operators_minus" inline="true">
109
+ <value name="A">
110
+ <block type="hardware_two_wheel_drive_car_speed">
111
+ <field name="PIN">D5</field>
112
+ <field name="LOR">right</field>
113
+ </block>
114
+ </value>
115
+ <value name="B">
116
+ <block type="math_number">
117
+ <field name="NUM">1</field>
118
+ </block>
119
+ </value>
120
+ </block>
121
+ </value>
122
+ </block>
123
+ </next>
124
+ </block>
125
+ </statement>
126
+ </block>
127
+ </next>
128
+ </block>
129
+ </next>
130
+ </block>
131
+ </next>
132
+ </block>
133
+ </statement>
134
+ </block>
135
+ </next>
136
+ </block>
137
+ <block type="character_new" x="179" y="617">
138
+ <field name="NAME">car1</field>
139
+ <statement name="DO">
140
+ <block type="events_on_start">
141
+ <statement name="DO">
142
+ <block type="control_loop">
143
+ <statement name="DO">
144
+ <block type="looks_say" inline="true">
145
+ <value name="TEXT">
146
+ <block type="hardware_two_wheel_drive_car_speed">
147
+ <field name="PIN">D5</field>
148
+ <field name="LOR">left</field>
149
+ </block>
150
+ </value>
151
+ </block>
152
+ </statement>
153
+ </block>
154
+ </statement>
155
+ </block>
156
+ </statement>
157
+ </block>
158
+ <block type="character_new" x="588" y="612">
159
+ <field name="NAME">car2</field>
160
+ <statement name="DO">
161
+ <block type="events_on_start">
162
+ <statement name="DO">
163
+ <block type="control_loop">
164
+ <statement name="DO">
165
+ <block type="looks_say" inline="true">
166
+ <value name="TEXT">
167
+ <block type="hardware_two_wheel_drive_car_speed">
168
+ <field name="PIN">D5</field>
169
+ <field name="LOR">right</field>
170
+ </block>
171
+ </value>
172
+ </block>
173
+ </statement>
174
+ </block>
175
+ </statement>
176
+ </block>
177
+ </statement>
178
+ </block>
179
+ </xml>