狙い
「Scratch3愛にあふれる人物」と自称いたします、私としましては。
GodotでもScratch3風な表現をしたいのです。
ちょいと試してみただけなので、詳しい解説をするつもりがないのですけど、興味があれば「いいね」で応援をお願いします。
関心ある同志が多いと勇気づけられたら、追加解説をするかも。
Godotとは?
- 軽量ながら本格ゲームエンジン(オープンソースで無料、商用利用可)
- Python風のGdscriptでコードを書くことができる
- ジョジョに利用者増加中(らしい)
Scratch3風な表現とは?
こんなかんじかな??
- Bitmap collisionを実現させたい
- SVG画像をScale拡大しても「くっきり」とした線で描画したい
- Sprite2Dをマウスでつかんでドラッグしたい
- 「ずっと」ブロックを「while」構文で書きたい
- しかも「ずっと」(while)を複数書いて並列動作っぽい動作をさせたい
Bitmap collision
見えている部分を使って衝突判定をします。
これを「Bitmap Collision」と呼んでよいのかは確信がないですけど(勝手に名前をつけた)。
これは当たっていない
これは当たっている
SVGをくっきりと描画
Scale=1.0
Scale=3.0
Sprite2Dをマウスでつかんでドラッグ
複数「ずっと」、並列動作っぽく
func _ready() -> void:
self._loop01() # ループ処理を起動
self._loop02() # ループ処理を起動
#
# _loop01, _loop02 は同時に動作する「疑似的な並列動作」
#
func _loop01() -> void:
while true:
await sleep(0.5) # 0.5秒待つ
next_svg_tex() # 次のコスチュームにする
await signal_process_loop # これを書くことで繰り返しタイミングを同期させる
func _loop02() -> void:
var target:Sprite2DExt = $"/root/Node2D/Niwatori" # 衝突判定をする相手のノード
while true:
if self._is_pixel_touched(target): # Bitmap Collision
self.modulate = Color(0.5, 0.5, 0.5) # やや暗くする
else:
self.modulate = Color(1, 1, 1) # 元の色に変える
await signal_process_loop # これを書くことで繰り返しタイミングを同期させる
環境
- Godot4.5
- Windows11
サンプル
後記
- 動作速度に懸念が残るのでチューンアップしたいです
- Scratch3でいうところの「クローン」でも動作するようにしたいです
書き忘れを追記
Scratch3からSVG画像を拝借
サンプルに使用したSVG画像は Scratch3のライブラリから拝借しました。
Scratch3のSVGをインポートしてみたら
Scratch3「カニ」(crab-x.svg) を Godotへ「インポート」してみたら
あら不思議!、おかしな描画になってしまいました。
どこかのネット記事でみたのですが、GodotのSVGレンダリングはThorvgを使っているようで、Thorvgには対応できないSVG画像があるのかもしれません。
Scratch3からの拝借方法
とりあえずの対応としては、以下をおすすめします。
「グループ化」をする!
Scratch3にて「グループ化」をすませたコスチュームであれば、ダウンロードして Godotへ食わせても「Thorvg」的には問題ないようです。
きれいに Godotで描画してくれました












