app/assets/javascripts/blocks/motion.js.coffee.erb
# 「動き」ジャンル
<%
category = 'motion'
require 'smalruby_editor'
require 'smalruby_editor/blockly_message_helper'
color = SmalrubyEditor::COLORS[category.to_sym]
%>
# ( )歩動かす
<% n = "#{category}_move" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.move') %>,
['STEP', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
arg = Blockly.Ruby.valueToCode(@, 'STEP', Blockly.Ruby.ORDER_NONE) || '0'
Blockly.Ruby.characterMethodCall_('move', "#{arg}")
# 時計回りに( )度回す
# 反時計回りに( )度回す
<%
[
['right', ''],
['left', '-'],
].each do |suffix, sign|
n = "#{category}_rotate_#{suffix}"
%>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm(".turn_#{suffix}_degrees") %>,
['ANGLE', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
arg = Blockly.Ruby.valueToCode(@, 'ANGLE', Blockly.Ruby.ORDER_NONE) || '0'
Blockly.Ruby.characterMethodCall_('rotate', "<%= sign %>#{arg}")
<% end %>
# ( )度に向ける
<% n = "#{category}_set_angle" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.point_in_direction') %>,
['ANGLE', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
angle = Blockly.Ruby.valueToCode(@, 'ANGLE', Blockly.Ruby.ORDER_NONE) || '0'
Blockly.Ruby.characterSetVariable_('angle', angle)
# マウスポインターへ向ける
<% n = "#{category}_point_towards_mouse" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput()
.appendField(<%= bm('.point_towards_mouse') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
"#{Blockly.Ruby.rn()}point_towards(:mouse)\n"
# [▼]へ向ける
<% n = "#{category}_point_towards_character" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.point_towards_character') %>,
['CHAR', new Smalruby.FieldCharacter()],
Blockly.ALIGN_RIGHT)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
char = @getCharacterFieldValue()
Blockly.Ruby.characterMethodCall_('point_towards', char)
# x座標を( )、y座標を( )にする
<% n = "#{category}_set_x_y" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.set_x_y') %>,
['X', ['Number'], Blockly.ALIGN_RIGHT],
['Y', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
x = Blockly.Ruby.valueToCode(@, 'X', Blockly.Ruby.ORDER_NONE) || '0'
y = Blockly.Ruby.valueToCode(@, 'Y', Blockly.Ruby.ORDER_NONE) || '0'
Blockly.Ruby.characterSetVariable_('position', "[#{x}, #{y}]")
# マウスポインターへ行く
<% n = "#{category}_go_to_mouse" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput()
.appendField(<%= bm('.go_to_mouse') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
Blockly.Ruby.characterMethodCall_('go_to(:mouse)')
# [▼]へ行く
# <% n = "#{category}_go_to_character" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.go_to_character') %>,
['CHAR', new Smalruby.FieldCharacter()],
Blockly.ALIGN_RIGHT)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
char = @getCharacterFieldValue()
Blockly.Ruby.characterMethodCall_("go_to(#{char})")
# ( )秒でx座標を( )、y座標を( )に変える
<% n = "#{category}_glide_to_x_y" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg('%1秒でx座標を%2、y座標を%3に変える',
['SEC', ['Number'], Blockly.ALIGN_RIGHT],
['X', ['Number'], Blockly.ALIGN_RIGHT],
['Y', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
sec = Blockly.Ruby.valueToCode(@, 'SEC', Blockly.Ruby.ORDER_NONE) || '0'
x = Blockly.Ruby.valueToCode(@, 'X', Blockly.Ruby.ORDER_NONE) || '0'
y = Blockly.Ruby.valueToCode(@, 'Y', Blockly.Ruby.ORDER_NONE) || '0'
"#{Blockly.Ruby.rn()}glide_to(second: #{sec}, x: #{x}, y: #{y})\n"
# x座標を( )ずつ変える
# x座標を( )にする
# y座標を( )ずつ変える
# y座標を( )にする
<%
[
['change_x_by', 'X', '+='],
['set_x', 'X', '='],
['change_y_by', 'Y', '+='],
['set_y', 'Y', '='],
].each do |suffix, name, operator|
n = "#{category}_#{suffix}"
%>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm(".#{suffix}") %>,
['<%= name %>', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
<%= name.downcase %> = Blockly.Ruby.valueToCode(@, '<%= name %>', Blockly.Ruby.ORDER_NONE) || '0'
Blockly.Ruby.characterSetVariable_('<%= name.downcase %>', <%= name.downcase %>, '<%= operator %>')
<% end %>
# もし端に着いたら、跳ね返る
<% n = "#{category}_turn_if_reach_wall" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput().appendField(<%= bm('.turn_if_reach_wall') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
Blockly.Ruby.characterMethodCall_('turn_if_reach_wall')
# 跳ね返る
<% n = "#{category}_turn" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput().appendField(<%= bm('.turn') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
Blockly.Ruby.characterMethodCall_('turn')
# [▼水平(X)]方向に跳ね返る
<% n = "#{category}_turn_xy" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
dropdown = [
[<%= bm('.turn_xy_x') %>, 'x'],
[<%= bm('.turn_xy_y') %>, 'y'],
]
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.turn_xy') %>,
['XY', new Blockly.FieldDropdown(dropdown)],
Blockly.ALIGN_RIGHT)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
xy = @getFieldValue('XY')
Blockly.Ruby.characterMethodCall_("turn_#{xy}")
# 回転方法を[▼]にする
<% n = "#{category}_set_rotation_style" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
dropdown = [
[<%= bm('.set_rotation_style_left_right') %>, 'left_right'],
[<%= bm('.set_rotation_style_none') %>, 'none'],
[<%= bm('.set_rotation_style_free') %>, 'free'],
]
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.set_rotation_style') %>,
['STYLE', new Blockly.FieldDropdown(dropdown)],
Blockly.ALIGN_RIGHT)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
style = @getFieldValue('STYLE')
Blockly.Ruby.characterSetVariable_('rotation_style', ":#{style}")
# 変数:x座標
# 変数:y座標
# 変数:向き
<%
%w(x y angle).each do |method|
n = "#{category}_self_#{method}"
%>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput().appendField(<%= bm(".self_#{method}") %>)
@setOutput(true, 'Number')
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
Blockly.Ruby.characterMethodCallInput_('<%= method %>')
<% end %>