今回は基本PCがあればだれでもできるJSONハック
のやり方はわかった前提でなんかコードを書いていきたいと思います
初心者なので間違ってるかもしれないことを覚悟して読んでください
間違ってたらscratchまで連絡をお願いします
0. 基本
基本の解説
project.json
{
"targets": [
{
"isStage": true, // ステージならこれはtrue そうでないならfalse
"name": "Stage", // 名前
"variables": { // 変数一覧 多分グローバル変数はすべてここ
"`jEk@4|i[#Fk?(8x)AV.-my variable": [ // 変数のid
"my variable", // 変数の名前
0 // 変数の値
]
},
"lists": {}, // リスト一覧
"broadcasts": {}, // メッセージなど
"blocks": {}, // そのスプライトのブロック(あとで解説)
"comments": {}, // コメント(メモみたいなやつ)
"currentCostume": 0, // 多分最初のコスチューム(1つ目は0, 2つ目は1...という感じ)
"costumes": [ // コスチューム一覧(あまりいじることはないので読み飛ばしてよい)
{
"name": "背景1", // 名前
"dataFormat": "svg", // ファイル形式
"assetId": "cd21514d0531fdffb22204e0ec5ed84a", // ファイル名
"md5ext": "cd21514d0531fdffb22204e0ec5ed84a.svg", // ファイル名(拡張子付き)
"rotationCenterX": 240,
"rotationCenterY": 180
}
],
"sounds": [], // 音
"volume": 100, // 音量
"layerOrder": 0, // 奥行
"tempo": 60, // 音楽拡張機能のテンポ
"videoTransparency": 50, // ビデオの透明度?
"videoState": "on", // ビデオ
"textToSpeechLanguage": null // 音声合成拡張機能の言語(例:"ja"など)
},
{
"isStage": false, // ステージならこれはtrue そうでないならfalse
"name": "スプライト1", // 名前
"variables": {}, // 変数
"lists": {}, // リスト
"broadcasts": {}, // メッセージ
"blocks": { // ブロック(大体ここいじる)
"a": { // ブロックid
"opcode": "motion_movesteps", // ブロック種類のid この場合()歩歩く
"next": null, // 次に来るブロックのid ないときはnull
"parent": null, // このブロックが埋まっているブロックのid ないときはnull
"inputs": { // 入力
"STEPS": [ // 入力のid
3, // ナニコレ(いじるな)
"b", // 中に埋まっている
[
4, // ナニコレ2
"10" // 入力の値(この場合歩数)
]
]
},
"fields": {}, // |
"shadow": false, // | 知 ら な い
"topLevel": true, // 親がいるかどうか
"x": 297, // x座標
"y": 262 // y座標
}
},
"comments": {}, // コメント
"currentCostume": 0, // 前にも言ったね
"costumes": [ // ここらへんももういいね?
{
"name": "コスチューム1",
"bitmapResolution": 1,
"dataFormat": "svg",
"assetId": "bcf454acf82e4504149f7ffe07081dbc",
"md5ext": "bcf454acf82e4504149f7ffe07081dbc.svg",
"rotationCenterX": 48,
"rotationCenterY": 50
}
// 本当はこの下にブロックIDbがあったんだが面倒だったので解説なし
],
"sounds": [],
"volume": 100,
"layerOrder": 1, // 奥行
"visible": true, // 見えるか
"x": 0,
"y": 0,
"size": 100, // 大きさ
"direction": 90, // 向き
"draggable": false, // ドラッグできるか?
"rotationStyle": "all around" // 回転方法
}
],
"monitors": [], // ここいじるとブロックなしプロジェクトができたり
"extensions": [], // 知ってる人教えて...
"meta": { // データ
"semver": "3.0.0",
"vm": "0.2.0",
"agent": "", // UserAgent これを使って同一人物か判定するものがあるが
// 学タブ勢には誤作動を起こしやすいため正確性に欠ける
"platform": { // | ターボワープで作ったという印
"name": "TurboWarp", // | (解説しやすかったから)
"url": "https://turbowarp.org/" // | scratchで作るとこの部分はない
}
}
}
大体のブロックの形の解説
project.json
{
"opcode": "id", // ここにはブロックの種類を表すidを入れる
"next": null, // もし下に何かつながってるならそいつのidを入れる
"parent": null, // もしこのブロックが何かのほかのブロックにはめ込まれてるならそいつのidを入れる
"inputs": { // 入力 なけりゃ空(例えば真偽値のブロックに何もはめ込まれていない、真の空
"値1": [
1, // 型の種類(1は値、2は真偽値などなど。後で解説しようかな)
// "id", // もしブロックを入れるならここにidを入れる
[
4, // 値の種類
"10" // 入力する値
]
]
},
"fields": {},
"shadow": false,
"topLevel": true,
"x": "0", // x position
"y": "0" // y position
}
inputに入れられる形の解説
値
project.json
"inputs": {
"値1": [
1, // 値だから1
// "id" // もしブロックを入れるならここにidを入れる
[
4, // ふつうの値なので4
"値" // 入力値
]
]
}
真偽値
project.json
"inputs": {
"値1": [
2,
"id" // 直接入力はできないためid必須!!
]
}
色(実は値の一種)
project.json
"inputs": {
"値1": [
1,
// "id" // もしブロックを入れるならここにidを入れる
[
9, // 色なので9
"#ffffff" // カラーコード
]
]
}
選ぶメニュー
実は、選ぶメニューは値だが特殊で、メニューが別ブロックとして独立していて、それをparentでくっつけてます
project.json>id1
"inputs": {
"値1": [
1,
// "id" // もしブロックを入れるならここにidを入れる
[
1, // 1です
"id2" // 中のid
]
]
}
別ブロックとして書こう
project.json
"id2": {
"opcode": "id",
"next": null,
"parent": "id1",
"inputs": {},
"fields": { // メニューの時はここに入れるんだよね
"値1": [
"値",
null
]
},
"shadow": true,
"topLevel": false
}
後忘れてるのあったら言ってください
面倒になったので続きは別で出します