俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

Godot 音シュー09「キー入力で得点。」

本日2度目の更新。腰イテー。 で、そろそろ「音ゲー」っぽくなりそうな予感がしてきたぞ。いいタイミングでキーが押せたら得点するようにしよう。キー入力得点管理もすでに学習済みなので、そんなに難しくはあるまい。

f:id:ore2wakaru:20180616152211p:plain


得点管理

得点管理はもちろん、グローバル変数で行うじゃろー。

前やった様に(玉転がしの13 参照)、スクリプトパネルの [File] > [New] から適当な名前のファイルを作成し、メニューの [Project] > [Project Settings] > [AutoLoad] で設定する。ファイル名は出来るだけ短いのがいいな。グローバル変数の利点はそこだからな。

ファイルネーム:G.gd
コード:

extends Node

var myScore = 0

f:id:ore2wakaru:20180616161302p:plain

設定完了。

これで、どっからでも "G.myScore += 10" とかで得点を加算できる。シーンが変わっても得点は維持される。。。 あれ? 今回はシーン(曲)が変わったら得点を破棄しないといけないのかな? 前の曲の点か残ってたらおかしいもんね。もしかしたら、もしかするね。ま、あとでやろう。


キー入力

キー入力はもちろんメニューの [Project] > [Project Settings] > [Input Map] で設定する。

f:id:ore2wakaru:20180616153616p:plain


得点表示用ラベル

コードを書く前に、得点表示用の「Label」ノードを追加しておこう。

f:id:ore2wakaru:20180616165133p:plain

  1. カウントダウン用のラベルをリネームした。スクリプト中でも使っているので、リネームしておく事を忘れずに。(コレ自動でやってくんねーかなー)
  2. ただ、"Score:"って書いただけ。
  3. ここが得点表示の場所。Alignは右寄せにしといた方がいいかな。


スクリプト

先ずは、左エリア用のすくりぷとダケで説明。他のエリアは同じようにやればいい。

f:id:ore2wakaru:20180616171314p:plain

L4~5

  • 修正する時やや楽をするため、カラーを変数に持たせただけ。

L7

  • 得点表示用のラベルを操作するからね。変数用意。

f:id:ore2wakaru:20180616171459p:plain

L13

  • いつもみたいにget_node()するんだけど、親ノード方向にさかのぼっていく時には自動で候補ノードを出してくれない。(出せよー。) で、指定を間違えないように注意。

f:id:ore2wakaru:20180616171950p:plain

L15~19

  • キー入力のチェック + 色のチェック + 得点加算 + 得点表示。
  • キューブがエリアに入ってる時はアルベドカラーなので、それを利用すればイイよね。
  • str()はカッコ内の変数をストリング(string)型に変換する内蔵関数。変数"myScore"は整数(int)型、ラベルのTextに入れられるのはストリング型のもの。だからコレで変換する必要がある。

f:id:ore2wakaru:20180616172621p:plain

L24 / L29

  • 色を変数から入れるようにしただけ。

これでどお?


テスト

f:id:ore2wakaru:20180616174655g:plain

エラーもなく、得点もちゃんと入るな。よし! だが、なんでもかんでも10点だな。GoodGreatCool!!、で得点を変えないといけないか。それとMissでは減点な。

あとあれだな、今回は左側のエリアだけだけど、ほんとは、上下左右見てないといけないから、コレ、相当難しいな。覚えゲーになるか? そーするとチトつまらんな。

ま、もうちょい先に進めてから考えるか。


いる? 左エリア用。

extends MeshInstance

var spaMat      #自身が持つSpaialMaterialの情報操作用
var colorIn =  Color("#ff0000")
var colorOut = Color("#ffffff")

var nLabel      #得点表示用Label_score2の操作用

func _ready():
    #メッシュとマテリアルが入ってないとエラーになるから注意
    spaMat = get_surface_material(0)            #0番目に入ってるヤツの情報ゲット
    
    nLabel = get_node("../../../Label_score2")  #得点表示用Label_score2ゲット

func _process(delta):
    if Input.is_action_just_pressed("myA"):
        if spaMat.albedo_color == colorIn:
            G.myScore = G.myScore + 10
            nLabel.text = str(G.myScore)

#キューブ入ったよ(signal from 「Area_l」)
func _on_Area_l_body_entered(body):
    #色変えるぜ
    spaMat.albedo_color = colorIn

#キューブ出たよ(signal from 「Area_l」)
func _on_Area_l_body_exited(body):
    #色戻すぜ
    spaMat.albedo_color = colorOut