smalruby/smalruby-editor

View on GitHub
app/assets/javascripts/blocks/motion.js.coffee.erb

Summary

Maintainability
Test Coverage
# 「動き」ジャンル

<%
  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 %>