Godotチュートリアル中国語版-簡単な2 Dゲーム(Simple 2 D Game,Pong!)


卓球Pong
この簡単なチュートリアルでは、基本的な卓球ゲームを作成します.エンジンのプレゼンテーションには複雑な例が多いが,ここでは基本機能を備えた2 Dゲームを紹介すべきである.
リソースAssets
このチュートリアルには、卓球パッド、卓球、臨界線などのリソースが含まれています.
シーン設定Scene Setup
従来、ゲームは640*400の解像度に設定されていた.解像度の設定は、プロジェクト設定project settingで設定できます.既定の背景色は黒に設定する必要があります.
プロジェクトのルートディレクトリにNode 2 Dタイプのノードを作成します.これは2 Dエンジンで最も基本的なノードタイプです.次に、スプライト(Spriteタイプノード)とそれ自体のテクスチャを追加します.最後のシーンは次のようになります(ピンポンは真ん中にあります).
シーンのツリー階層は、次のように見えます.
シーンをpong.scnとして保存し、エンジニアリングプロパティのメインシーンに設定します(main_scene)
Input Actions Setup入力動作構成
Keyboard,Joypad,Mouse,TouchScreen(MutiTouch)のような入力専用の方法がたくさんあります.しかし、これは卓球ゲームにすぎず、卓球マットの上下移動を制御するだけです.
すべての入力方法を処理するには、呪いがかかり、多くのコードを書く必要がある可能性があります.実際には、多くのゲームが制御者のカスタマイズを許可しているため、処理入力が悪化している.ここで、Godotは入力アクションを作成し、1つのアクションが定義されると、それをアクティブにする方法が追加されます.
[プロジェクトプロパティ]ダイアログボックスを再度開きますが、[Input Map]タブを選択し、4つのアクションを追加します.
「left_move_up」、「left_move_down」、「right_move_up」、「right_move_down」は、使用するキー値をバインドします.左はA/Z、右はUp/Down
次の図を示します.
Script
現在のシーンのルートノードにスクリプトを作成して開きます(前のレッスンで説明したように)、スクリプトはNode 2 Dから継承されます.
extends Node2D

func _ready():
    pass

コンストラクション関数では、2つのことを完了する必要があります.1つはプロセスを実行できるようにすることであり、いくつかの有用な値を保存することである.たとえば、ウィンドウScreenとPadのサイズです.
extends Node2D

var screen_size
var pad_size

func _ready():
    screen_size = get_viewport_rect().size
    pad_size = get_node("left").get_texture().get_size()
    set_process(true)

次に、ゲームに使用する値を追加します.
#speed of the ball (in pixels/second0

var ball_speed = 80
#direction of the ball (normal vector)

var direction = Vector2(-1,0)
#constant for pad speed (also in pixels/second)

const PAD_SPEED = 150

最後に、関数を処理します.
func _process(delta):

いくつかの計算に使用する値を得るには、まず球の位置と、マットの矩形(Rect 2)領域があり、精霊Spritesはテクスチャの中心点を参照しているので、小さな調整(size/2)を追加する必要があります.
  var ball_pos = get_node("ball").get_pos()
    var left_rect = Rect2( get_node("left").get_pos() - pad_size/2, pad_size )
    var right_rect = Rect2( get_node("right").get_pos() - pad_size/2, pad_size )

ボールの座標は取得できるので、統合は簡単になるはずです.
 ball_pos+=direction*ball_speed*delta

すると、ボールには新しい座標があります.それはすべてのものを検出する必要があります.まず床と屋根です.
if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):
        direction.y = -direction.y

マットが接触した場合、ボールの方向を変更し、速度を少し増やします.
if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)):
        direction.x=-direction.x
        ball_speed*=1.1
        direction.y=randf()*2.0-1
        direction = direction.normalized()

ボールがスクリーンの外に出たら、ゲームは終わります.ゲームの再開:
if (ball_pos.x<0 or ball_pos.x>screen_size.x):
        ball_pos=screen_size*0.5 #ball goes to screen center
        ball_speed=80
        direction=Vector2(-1,0)

ボールに関するものが完成したら、ボールのノードの位置を更新します.
get_node("ball").set_pos(ball_pos)

プレイヤーの入力に応じてパッドの位置を更新し、ここで入力類が重要になります.
 #move left pad  
    var left_pos = get_node("left").get_pos()

    if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")):
        left_pos.y+=-PAD_SPEED*delta
    if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")):
        left_pos.y+=PAD_SPEED*delta

    get_node("left").set_pos(left_pos)

    #move right pad 
    var right_pos = get_node("right").get_pos()

    if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")):
        right_pos.y+=-PAD_SPEED*delta
    if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")):
        right_pos.y+=PAD_SPEED*delta

    get_node("right").set_pos(right_pos)

これは簡単な2 Dゲームです!ここで、簡単な卓球ゲームは数行のコードで完成しました.