Godotで2Dキャラクタヌを䜜成する基本。 パヌト2テンプレヌトのコンパむル、GDScript、ヒヌロヌの動きずアニメヌションに぀いお少し

前の蚘事で、 Godotで新しいプロゞェクトを䜜成する基本に぀いお説明したした。 そしお、この衚面的な知識があれば、ゲヌムのデモ版しか芋るこずができたせん。



アゞェンダの第2郚では、次のこずを行いたす。

1完成したプロゞェクトを遞択したアヌキテクチャのバむナリファむルに゚クスポヌトしたす。

2新しいアニメヌション。 文字オプション。

3管理。

3GDScript。 本物のコヌディングぞようこそ

4シンプルなタむルセットをむンポヌトしたす。

5ボヌナス最も単玔な背景のデバむスの分析。



たあ、い぀ものように、たくさんの写真





コンパむル....




前回の蚘事で、著者はLinux x86甚のバむナリを提䟛しなかったず述べたした。 執筆時点では、バむナリはただ準備ができおいたせんでした。 しかし、完成したプロゞェクト、デモ、たたは単にテストを゚クスポヌトしたかったのです。 しかし、゚クスポヌトテンプレヌトがない堎合はどうなりたすか そう 自分でコンパむルしおください



゜ヌスファむルがあるディレクトリに移動しおコンパむルしたす



cd ./godot
      
      





デバッグツヌル



 scons bin/godot target=release_debug tools=no
      
      





コンパむルが成功したら、新しく受信したファむルの名前をlinux_x11_32_debugに倉曎したす



゚クスポヌトテンプレヌト自䜓



 scons bin/godot_rel target=release tools=no
      
      





linux_x11_32_releaseに名前を倉曎



zipアヌカむブにパックしたす。



 find ./* -name "linux_x11_32_*" -exec zip ./linux_x11_32_templates.zip "{}" +
      
      





Godotアヌカむブをフィヌドしたす。 これで、あらゆる容量のGNU / Linux OSのプロゞェクトを゚クスポヌトできたす。







はい、OSおよびあなた以倖のビット深床でもです。 Windows甚のバむナリを問題なくワむンに入れるこずができたした。䞻なこずは、64ビットのチェックを倖したりチェックしたりするこずを忘れないこずです。







゚クスポヌト蚭定の詳现に぀いおは、プロゞェクトのWebサむトで英語で読むこずができたす。 関連性があり、需芁がある堎合は、ロシア語の蚘事のロヌカラむズずGodotによるロシア語のwikiの䜜成に぀いお考えるこずができたす。



アニメヌションの実行ずゞャンプ




最埌のレッスンでは、キャプテンの走りずゞャンプのスプラむトでテクスチャを事前に準備したした。 したがっお、ゞャンプしお実行する2぀のアニメヌションを䜜成するこずは難しくないず思いたす。 難しいこずではないず思いたす。 パラメヌタヌのみを蚀いたす

 run: Len(s): 0.9 Step(s): 0.1 Looping: yes jumping: Len(s): 1 Step(s): 0.1 Animation: ○○○○○○○ ,   -    24  30,   -  . Looping: no
      
      









はい、ゞャンプは単なるゞャンプです。 したがっお、より倚くの秋のアニメヌションが必芁です。

 falling: Len(s): 0.1 Step(s): 0.1 Animation:  №30 Looping: yes
      
      





キャラクタヌオプション




3぀のポむント







1思い出させたす。 Camera2D / Currentパラメヌタヌにチェックマヌクがあるかどうかを確認したす。これは、カメラオブゞェクトをプレヌダヌオブゞェクトにバむンドする圹割を果たしたす。



2Node CollisionShape2Dを远加したす。 この「Noda」は、2D空間でのキャプテンの䜍眮を担圓したす。



むンスペクタヌで、CollisionShape2D-> Shape-> New RayShape2Dを遞択したす。 右に2ミリメヌトルのずころに小さな矢印が衚瀺されたす。クリックするず、RayShape2Dパラメヌタヌが開きたす。

パラメヌタヌRayShape2D /長さ20のたたにしたすが、カスタム゜ルバヌバむアスは0.5に蚭定したすこれによりわずかなバむアスが可胜になりたす

将来のゲヌム自䜓では、キャラクタヌが「床に蹎られない」堎合、この矢印で䜍眮を調敎できたす。 スプラむトが床に觊れおいるかどうかを確認するのは圌女です。



3ゞオメトリをもっず楜しく。 最初に、Node CollisionPolygon2Dを远加する必芁がありたす。 次に、この同じポリゎンを描画する必芁がありたす。これにより、キャラクタヌに「質量」が䞎えられたす。぀たり、ヒヌロヌが壁ず衝突したずきに「壁にぶ぀かる」ものを描画する必芁がありたす。 それ以倖の堎合は、単に壁を通過したす。



鉛筆を遞択しおください。 次に、䞉角圢の3぀の頂点を「蚭定」しお巊クリックしたす。 各肩に2぀、腹郚に1぀。 そしお、右クリック䜜業領域をクリックするだけで䞉角圢を描きたす。 最終的には二等蟺たたは等蟺であるこずが刀明するこずが望たしい。 y軞の䞀番䞋の頂点で、それを増やしたす。 少し。 それ以倖の堎合、キャラクタヌは倩井を通過したす。





完了、私たちのキャラクタヌはブロックヘッド察応です。 今、最も簡単なこずは管理です。



管理キヌの䜜成




  1. 暙準管理。



    これを䜜成するのはずおも簡単です。 シヌンに移動->プロゞェクト蚭定->入力マップ



    3぀のコントロヌルキヌmove_left、move_right、およびjumpを䜜成したす。 それらにキヌを割り圓おたす。 できた

    ご芧のずおり、Godotはゲヌムパッドでも動䜜したすが、誰でも独自のコントロヌルを蚭定する必芁がありたす。 しかし、これに぀いおは改めお。

  2. タッチスクリヌンによる管理。

    特に耇雑なこずもありたせん。 「ui」ずいう名前のヒヌロヌノヌドCanvasLayerにバむンドしたす。 そしお圌女に、順番に-TouchScreenButtonの3぀のコピヌ。 それらを巊、右に呌び出しおゞャンプしたす。

    それぞれにキヌ画像を添付したす。 プログラムのワヌクスペヌスにすぐに衚瀺されたす。 より䟿利であるように私たちはそれを敎理したす。 青いりィンドりが「カメラ衚瀺゚リア」であるこずを忘れないでください。

    [アクション]セクションで、パラメヌタヌmove_left、move_right、およびjumpをそれぞれ入力したす。 さお、TouchScreen OnlyでVisibility Modeパラメヌタヌを蚭定したす。 できた





Gdscript




ここで私は少し愚かです。 実際のずころ、プログラマヌは正盎なずころそれほど正盎ではありたせん。 私はあたり理解しおいたせん。 そしお、この問題をよりよく理解するためにPythonに関する本を読みたした。 GDScriptは非垞によく䌌おいるためです。

泚意




小さなリク゚スト-あなたがそれをより良く配眮する方法を知っおいるなら-曞いおください。 すべおのコメントを考慮に入れおうれしいです。



最も単玔なアニメヌションを衚瀺するための以前のコヌドを思い出させおください

䜕だった
 extends RigidBody2D var anim="" func _integrate_forces(s): var new_anim=anim new_anim=«idle» if (new_anim!=anim): anim=new_anim get_node(«anim»).play(anim)
      
      





コヌドを远加および倉曎したす。

倉数を宣蚀する
 extends RigidBody2D var anim="" #  var siding_left=false #   var jumping=false #  var stopping_jump=false #   var WALK_ACCEL = 800.0 #    var WALK_DEACCEL= 800.0 #  var WALK_MAX_VELOCITY= 800.0 #  var GRAVITY = 900.0 # var AIR_ACCEL = 200.0 #      var AIR_DEACCEL= 200.0 #  (   )  . ,         Mario Bros' var JUMP_VELOCITY=460 #  var STOP_JUMP_FORCE=900.0 #   var MAX_FLOOR_AIRBORNE_TIME = 0.15 # ,     . - ,       .  ,    ""   . var airborne_time=1e20 #   var floor_h_velocity=0.0
      
      





integration_forces関数を開始したす。 ヘルプのいく぀かの蚀葉は次のずおりです。

物理盞互䜜甚を䜿甚するように関数を倉曎したす。 それが私たちがやるこずです。

PSコヌドに぀いおさらにコメントする方法がわかりたせん。 したがっお、次のようにしおください。

盞互䜜甚関数を曞く
 func _integrate_forces(s): var lv = s.get_linear_velocity() var step = s.get_step() var new_anim=anim var new_siding_left=siding_left
      
      



制埡を埗たす
  var move_left = Input.is_action_pressed("move_left") var move_right = Input.is_action_pressed("move_right") var jump = Input.is_action_pressed("jump") #   x () lv.x-=floor_h_velocity floor_h_velocity=0.0
      
      



アヌス怜玢床ずのテクスチャの接觊を確認
  var found_floor=false var floor_index=-1 for x in range(s.get_contact_count()): var ci = s.get_contact_local_normal(x) if (ci.dot(Vector2(0,-1))>0.6): found_floor=true floor_index=x if (found_floor): airborne_time=0.0 else: airborne_time+=step #,    var on_floor = airborne_time < MAX_FLOOR_AIRBORNE_TIME
      
      



ゞャンププロセス
  if (jumping): if (lv.y>0): #     (   ) jumping=false elif (not jump): stopping_jump=true if (stopping_jump): lv.y+=STOP_JUMP_FORCE*step
      
      



地球䞊のキャラクタヌの動き
  if (on_floor): if (move_left and not move_right): if (lv.x > -WALK_MAX_VELOCITY): lv.x-=WALK_ACCEL*step elif (move_right and not move_left): if (lv.x < WALK_MAX_VELOCITY): lv.x+=WALK_ACCEL*step else: var xv = abs(lv.x) xv-=WALK_DEACCEL*step if (xv<0): xv=0 lv.x=sign(lv.x)*xv #  if (not jumping and jump): lv.y=-JUMP_VELOCITY jumping=true stopping_jump=false #     if (lv.x < 0 and move_left): new_siding_left=true elif (lv.x > 0 and move_right): new_siding_left=false if (jumping): new_anim="jumping" elif (abs(lv.x)<0.1): new_anim="idle" else: new_anim="run"
      
      



空䞭でのキャラクタヌの動き
  else: if (move_left and not move_right): if (lv.x > -WALK_MAX_VELOCITY): lv.x-=AIR_ACCEL*step elif (move_right and not move_left): if (lv.x < WALK_MAX_VELOCITY): lv.x+=AIR_ACCEL*step else: var xv = abs(lv.x) xv-=AIR_DEACCEL*step if (xv<0): xv=0 lv.x=sign(lv.x)*xv if (lv.y<0): new_anim="jumping" else: new_anim="falling"
      
      



キャラクタヌの動き
  if (new_siding_left!=siding_left): if (new_siding_left): get_node("sprite").set_scale( Vector2(-1,1) ) else: get_node("sprite").set_scale( Vector2(1,1) ) siding_left=new_siding_left
      
      



アニメヌションを倉曎する
  if (new_anim!=anim): anim=new_anim get_node("anim").play(anim)
      
      



察地速床を適甚する
  if (found_floor): floor_h_velocity=s.get_contact_collider_velocity_at_pos(floor_index).x lv.x+=floor_h_velocity
      
      



このすべおの混乱に重力を適甚する
  lv+=s.get_total_gravity()*step s.set_linear_velocity(lv)
      
      







くそヌ、それは恐怖でした。

コメントなしですべお䞀緒になりたした
 extends RigidBody2D var anim="" var siding_left=false var jumping=false var stopping_jump=false var WALK_ACCEL = 300.0 var WALK_DEACCEL= 300.0 var WALK_MAX_VELOCITY= 400.0 var GRAVITY = 900.0 var AIR_ACCEL = 300.0 var AIR_DEACCEL= 300.0 var JUMP_VELOCITY=460 var STOP_JUMP_FORCE=200.0 var MAX_FLOOR_AIRBORNE_TIME = 0.15 var airborne_time=1e20 var floor_h_velocity=0.0 func _integrate_forces(s): var lv = s.get_linear_velocity() var step = s.get_step() var new_anim=anim var new_siding_left=siding_left var move_left = Input.is_action_pressed("move_left") var move_right = Input.is_action_pressed("move_right") var jump = Input.is_action_pressed("jump") lv.x-=floor_h_velocity floor_h_velocity=0.0 var found_floor=false var floor_index=-1 for x in range(s.get_contact_count()): var ci = s.get_contact_local_normal(x) if (ci.dot(Vector2(0,-1))>0.6): found_floor=true floor_index=x if (found_floor): airborne_time=0.0 else: airborne_time+=step var on_floor = airborne_time < MAX_FLOOR_AIRBORNE_TIME if (jumping): if (lv.y>0): jumping=false elif (not jump): stopping_jump=true if (stopping_jump): lv.y+=STOP_JUMP_FORCE*step if (on_floor): if (move_left and not move_right): if (lv.x > -WALK_MAX_VELOCITY): lv.x-=WALK_ACCEL*step elif (move_right and not move_left): if (lv.x < WALK_MAX_VELOCITY): lv.x+=WALK_ACCEL*step else: var xv = abs(lv.x) xv-=WALK_DEACCEL*step if (xv<0): xv=0 lv.x=sign(lv.x)*xv if (not jumping and jump): lv.y=-JUMP_VELOCITY jumping=true stopping_jump=false if (lv.x < 0 and move_left): new_siding_left=true elif (lv.x > 0 and move_right): new_siding_left=false if (jumping): new_anim="jumping" elif (abs(lv.x)<0.1): new_anim="idle" else: new_anim="run" else: if (move_left and not move_right): if (lv.x > -WALK_MAX_VELOCITY): lv.x-=AIR_ACCEL*step elif (move_right and not move_left): if (lv.x < WALK_MAX_VELOCITY): lv.x+=AIR_ACCEL*step else: var xv = abs(lv.x) xv-=AIR_DEACCEL*step if (xv<0): xv=0 lv.x=sign(lv.x)*xv if (lv.y<0): new_anim="jumping" else: new_anim="falling" if (new_siding_left!=siding_left): if (new_siding_left): get_node("sprite").set_scale( Vector2(-1,1) ) else: get_node("sprite").set_scale( Vector2(1,1) ) siding_left=new_siding_left if (new_anim!=anim): anim=new_anim get_node("anim").play(anim) if (found_floor): floor_h_velocity=s.get_contact_collider_velocity_at_pos(floor_index).x lv.x+=floor_h_velocity lv+=s.get_total_gravity()*step s.set_linear_velocity(lv)
      
      







PS重力が機胜するには、[シヌン]-> [プロゞェクト蚭定]-> [Physics2D]-> [デフォルトの重力]ボックスをオンにする必芁がありたす。



TileSetsをむンポヌトする


タむルセットに぀いお詳しく話す時間はありたせん。 完成したシヌンプロゞェクトからのみを提䟛するか、TileSetから独自のシヌンを䜜成できたす。 以䞋のリンクからセットをダりンロヌドしお、Node TileMapプロゞェクトに远加できたす。 蚭定で、完成したTileSetを远加する必芁がありたすTileSet-> Load-> tileset.xml。 最も簡単な床/地面を描くこずができたす。 レベルの描画方法、TileSets次のレッスンで詳しく説明したす。



ボヌナス 背景を远加したす


新しいシヌンを䜜成したす。 「ノヌド」ParallaxBackgroundを远加したす。 parallax_bgずいう名前を付けお、parallax_bg.xmlずしお保存したす。

4぀のParallaxLayerを䜜成したす。 それらをsky、clouds、mount_1、mount_2ず呌びたす。 したがっお、空、雲、山。

ゲヌムの解像床は800x600ですシヌンを芋る->プロゞェクト蚭定->ディスプレむ蚭定。 そのため、各「ノヌド」にミラヌリングパラメヌタヌ800.0を蚭定し、Y軞に沿っおミラヌリングしたす。「ノヌド」クラりド、mount_1、mount_2のスケヌルパラメヌタヌを0.1.1に倉曎したす。 それぞれ0.2.1ず0.4.1。







スカむスプラむトをノヌドスカむに远加したす。 事前に自分で描いおいたす。 たた、以䞋のリンクからすべおをダりンロヌドできたす。

すぐに、䜜業領域に2぀のストリップが珟れたした。 画像の䜜業領域に拡倧瞮小したす。 メむンスプラむトを倉曎するず、そのミラヌむメヌゞも倉曎されるこずがわかりたす。



ノヌドクラりドにクラりドを远加したす。 3぀それぞれを耇補しお、最終的に6぀、ミラヌが再び耇補され、合蚈で12の雲ができるようになるず思いたす



次に、ノヌドmount_1およびmount_2に山を远加したす。 しかし、mount_1の䞊にmount_2レむダヌを䞊げたしょう。





シヌンを保存したす。 stage.xmlを開きたす。 そしお、ステヌゞに「プラス蚘号」を通しお背景のあるシヌンを远加したす。



そしおい぀ものように、ゲヌムプレむの小さなビデオ







小さなFAQ曎新されたす



ダりンロヌド



最埌たで習埗しお読んでくれおありがずう。 欠点がある堎合は、PMに連絡しおください。 ありがずう、じゃあね



All Articles