Windows käsurida
Igale arvutile on töötamiseks paigaldatud operatsioonisüsteem (näiteks MS...
Paneme selles peatükis oma tegelaskuju mööda maad jooksma ja hüppama.
Alustame kõige pealt sellest, et hoiame mängija ja keskkonna eraldi ehk teeme uue stseeni (Scene>New Scene) ja sõlme (Node2D). Sõlme nimeks näiteks “Level1”.
Lingime stseeni Player.tscn.
Ja paneme sõlme nimeks “Player”.
Player sõlme peal on nupp “Open In Editor“, mis aitab avada lingitud stseeni. Salvesta!
Eelmises peatükis kasutasime velocity = Vector2(SPEED,0)
funktsiooni, kus muutsime x-suunda ja y-suund ehk ülevalt-alla on 0. Gravitatsiooni lisamiseks peame muutma y-suunda. Seepärast võiks x- ja y-suunda lahku lüüa velocity.x = SPEED
. Siis saame suurendada y-suunda mingi arvu võrra. Samas võiks selle läbi korrutada ka _deltaga
, mis tagab, et mängu füüsika töötab ühtlaselt erinevatel riistvaradel ja erinevate kaadrisageduste juures.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | extends CharacterBody2D const SPEED = 300 const GRAVITY = 980 func _process(_delta): #velocity = Vector2(SPEED,0) velocity.y += _delta * GRAVITY if Input.is_action_pressed("ui_right") and not Input.is_action_pressed("ui_left"): #velocity = Vector2(SPEED,grav) velocity.x = SPEED $Sprite2D.flip_h = false elif Input.is_action_pressed("ui_left") and not Input.is_action_pressed("ui_right"): #velocity = Vector2(-SPEED,grav) velocity.x = -SPEED $Sprite2D.flip_h = true else: velocity.x = 0 move_and_slide() |
Kuna me tegime Player
-stseeni esimesena, siis määrati see põhistseeniks. Aga nüüd soovime, et Level1 oleks selleks. Tee Level1.tscn peal parem klikk ja vali Set As Main Scene.
Nüüd kui käivitad, peaks tegelaskuju allapoole langema.
Enne kui edasi läheme, siis lisame liikumise omaette funktsiooniks func run()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | extends CharacterBody2D const SPEED = 300 const GRAVITY = 980 func _process(_delta): velocity.y += _delta * GRAVITY run() move_and_slide() func run(): #Liigutab vasakule/paremale if Input.is_action_pressed("ui_right") and not Input.is_action_pressed("ui_left"): #velocity = Vector2(SPEED,grav) velocity.x = SPEED $Sprite2D.flip_h = false elif Input.is_action_pressed("ui_left") and not Input.is_action_pressed("ui_right"): #velocity = Vector2(-SPEED,grav) velocity.x = -SPEED $Sprite2D.flip_h = true else: velocity.x = 0 |
1 2 |
Leia eelmises peatükis näidatud veebilehtedelt omale sobilik maapind või kasuta sama, mida mina (näiteks https://www.gameart2d.com/free-platformer-game-tileset.html). Lohista pilt oma projektiaknasse.
Et oleks lihtsam maapinnaga töötada, muudame alusruudustiku suurust 64×64 pikslit ja paneme selle haakuma. Snapping Options>Configure Spap…>Grid Step.
Maapinna loomiseks loo uus sõlm StaticBody2D ja selle sisse Sprite2D.
Lohista maaping Sprite>Texture aknasse
Kuna maapinna fail on liiga suur, siis lohista see väiksemaks. Kuna vaikimisi haakub kujund keskkoha kaudu, siis lülita sisse Snap Relative.
Nüüd aga kui mäng käivitada, siis tegelaskuju kukub läbi maapinna. See juhtub sellepärast, et puudub sõlm, mis tuvastab objektide kokkupuutumist. Sellest annavad märku ka Scene aknas olevad hoiatused.
Hoiatusel klikkides saamegi teada, et puudu on CollisionShape2D või CollisionPolygon2D.
Võtame esimesena ette Player.tscn ja lisame uue sõlme CollisionShape2D.
Nüüd liigub hoiatus edasi ja sel uus probleem – kujund määramata. Vali CollisionShape2D>Shape alt sobilik kujund ja määra ära, milline reageerib teistega. Lisades samasuguse kujundi nagu mul praegu, siis pea alune tühi ala on ka reageeriv.
Tee sama maapinna kujundiga. siinkohal on kujundkindlasti lihtsam
Testi, kas tegelaskuju vajub läbi maa või mitte.
Et saaksime maapinda dubleerida, võtame selle kõigepealt gruppi
Seejärel lisame maapinna Node2d alla.
Nüüd dubleeri maapinda (Ground) ja tekita kaart, kus tegelaskuju saaks ringi hüpata.
Paneme tegelase hüppama, kui oleme ühe korra vajutanud klahvi üles (Input.is_action_just_pressed("ui_up")
). JUMP_FORCE määrab, kui kõrgele ta hüppab. Muuda GRAVITY väärtust, et hüppamine tunduks piisavalt hea.
Tingimuslausesse lisasin is_on_floor()
meetodi, et hüpata saab ainult siis, kui jalad maapinda puutuvad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | extends CharacterBody2D const SPEED = 300 const GRAVITY = 2000 const JUMP_FORCE = -600 func _process(_delta): velocity.y += _delta * GRAVITY jump() run() move_and_slide() func run(): ... func jump(): if is_on_floor() and Input.is_action_just_pressed("ui_up"): velocity.y = JUMP_FORCE |