레슨 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 패키지를 최신 버전으로 유지하는 것이 좋습니다.