Learning
레슨 8 / 8·15분

Blockly 레퍼런스

기본 블록 카테고리

  • Logic — controls_if, logic_compare, logic_operation, logic_negate, logic_boolean
  • Loops — controls_repeat_ext, controls_whileUntil, controls_for, controls_forEach, controls_flow_statements
  • Math — math_number, math_arithmetic, math_single, math_random_int, math_modulo
  • Text — text, text_join, text_length, text_print, text_prompt_ext
  • Lists — lists_create_with, lists_length, lists_getIndex, lists_setIndex, lists_sort
  • Variables — variables_get, variables_set (자동 생성)
  • Functions — procedures_defnoreturn, procedures_defreturn, procedures_callnoreturn, procedures_callreturn

핵심 API

javascript
// ── 워크스페이스 API ──
// Blockly.inject(element, options) — 워크스페이스 생성
// workspace.clear() — 모든 블록 제거
// workspace.dispose() — 워크스페이스 완전 삭제
// workspace.getAllBlocks() — 모든 블록 배열 반환
// workspace.getBlockById(id) — ID로 블록 찾기
// workspace.undo(false) — 실행 취소
// workspace.undo(true) — 다시 실행
// Blockly.svgResize(workspace) — 크기 재계산

// ── 블록 API ──
// block.getFieldValue(name) — 필드 값 반환
// block.setFieldValue(value, name) — 필드 값 설정
// block.getInputTargetBlock(name) — 입력에 연결된 블록
// block.getNextBlock() — 다음 블록
// block.getPreviousBlock() — 이전 블록
// block.dispose() — 블록 삭제

// API 카테고리 요약
var apiCategories = {
  workspace: ["inject", "clear", "dispose", "getAllBlocks", "undo"],
  block: ["getFieldValue", "setFieldValue", "getNextBlock", "dispose"],
  serialization: ["save", "load"],
  events: ["BLOCK_CREATE", "BLOCK_DELETE", "BLOCK_CHANGE", "BLOCK_MOVE"]
};

window.alert("API 카테고리: " + Object.keys(apiCategories).join(", "));

커스텀 블록 정의 패턴

javascript
// 커스텀 블록 정의 템플릿
// Blockly.Blocks["my_custom_block"] = {
//   init: function() {
//     // 입력 종류
//     this.appendDummyInput()       // 필드만 포함하는 입력
//       .appendField("라벨");
//     this.appendValueInput("VALUE") // 값 입력 (둥근 소켓)
//       .setCheck("Number");        // 타입 제한
//     this.appendStatementInput("DO") // 문장 입력 (C자 형태)
//       .setCheck(null);            // 모든 문장 블록 허용
//
//     // 연결부 설정
//     this.setPreviousStatement(true, null); // 위쪽 연결
//     this.setNextStatement(true, null);     // 아래쪽 연결
//     this.setOutput(true, "Number");        // 출력 (값 블록)
//
//     // 외관
//     this.setColour(230);         // 색상 (0-360 색상 값)
//     this.setTooltip("설명");     // 툴팁
//     this.setHelpUrl("URL");      // 도움말 링크
//   }
// };

// 필드 종류 요약
var fieldTypes = {
  FieldTextInput: "텍스트 입력 필드",
  FieldNumber: "숫자 입력 필드 (최소/최대 설정 가능)",
  FieldDropdown: "드롭다운 선택 필드",
  FieldCheckbox: "체크박스 필드",
  FieldColour: "색상 선택 필드",
  FieldAngle: "각도 선택 필드",
  FieldImage: "이미지 표시 필드",
  FieldLabel: "읽기 전용 텍스트"
};

for (var key in fieldTypes) {
  window.alert(key + ": " + fieldTypes[key]);
}

이벤트 타입 정리

  • Blockly.Events.BLOCK_CREATE — 블록 생성 시
  • Blockly.Events.BLOCK_DELETE — 블록 삭제 시
  • Blockly.Events.BLOCK_CHANGE — 블록 필드 값 변경 시
  • Blockly.Events.BLOCK_MOVE — 블록 이동/연결 시
  • Blockly.Events.VAR_CREATE — 변수 생성 시
  • Blockly.Events.VAR_DELETE — 변수 삭제 시
  • Blockly.Events.UI — UI 상호작용 (선택, 열기/닫기 등)
  • Blockly.Events.FINISHED_LOADING — 직렬화 로드 완료 시

직렬화와 저장

javascript
// ── JSON 직렬화 (권장) ──
// 저장
// var state = Blockly.serialization.workspaces.save(workspace);
// var json = JSON.stringify(state);

// 불러오기
// var state = JSON.parse(json);
// Blockly.serialization.workspaces.load(state, workspace);

// ── XML 직렬화 (레거시) ──
// 저장
// var xml = Blockly.Xml.workspaceToDom(workspace);
// var xmlText = Blockly.Xml.domToText(xml);

// 불러오기
// var xml = Blockly.Xml.textToDom(xmlText);
// Blockly.Xml.domToWorkspace(xml, workspace);

// 직렬화 비교
var serializationMethods = {
  JSON: {
    save: "Blockly.serialization.workspaces.save()",
    load: "Blockly.serialization.workspaces.load()",
    note: "권장, 최신 API"
  },
  XML: {
    save: "Blockly.Xml.workspaceToDom()",
    load: "Blockly.Xml.domToWorkspace()",
    note: "레거시, 하위 호환"
  }
};

window.alert("직렬화 방법: JSON (권장), XML (레거시)");
💡

공식 문서: developers.google.com/blockly 에서 최신 API와 튜토리얼을 확인하세요. Blockly는 활발히 업데이트되므로, npm의 blockly 패키지를 최신 버전으로 유지하는 것이 좋습니다.