Како имплементирати померање паралаксе у Годоту

Паралаксно померање је техника коју многе 2Д игре користе да би створиле илузију дубине и додале визуелни интерес позадини игре. Ефекат постиже померањем различитих слојева позадине различитим брзинама у односу на кретање камере.

Годот 4 чини лакшим него икад имплементацију померања паралаксе. Његов моћни 2Д механизам пружа уграђену подршку за паралаксе слојеве, омогућавајући вам да креирате запањујуће визуелне ефекте уз минималан напор.

Подешавање игре Годот

Да бисте започели, направите нови 2Д пројекат у Годот гаме енгине-у и поставите сцену игре са ликом играча.

Код који се користи у овом чланку доступан је у овом ГитХуб спремиште и бесплатан је за коришћење под МИТ лиценцом.

За овај пример, додајте ЦхарацтерБоди2Д чвор за кретање играча. Такође додајте ЦоллисионСхапе2Д са обликом правоугаоника и Сприте2Д за представљање лика играча.

 extends CharacterBody2D

var speed = 200

func _physics_process(delta):
    var velocity = Vector2()

    if Input.is_action_pressed('ui_right'):
        velocity.x += 1

    if Input.is_action_pressed('ui_left'):
        velocity.x -= 1

    if Input.is_action_pressed('ui_down'):
        velocity.y += 1

    if Input.is_action_pressed('ui_up'):
        velocity.y -= 1

    velocity = velocity.normalized() * speed
    move_and_collide(velocity * delta)

Са овим кодом, лик играча може да се креће лево, десно, горе и доле помоћу тастера са стрелицама или сличних уноса.

Креирање различитих слојева са ПараллакЛаиер чворовима

Затим креирајте ефекат паралаксе додавањем више ПараллакЛаиер чворова на сцену. Сваки ПараллакЛаиер ће представљати другачији слој позадине. Да би се постигао убедљив ефекат паралаксе, слојеви који су удаљенији од камере треба да се крећу спорије од оних који су ближе.

Додајте СтатицБоди2Д чворове са ЦоллисионСхапе2Д у сваки ПараллакЛаиер да бисте креирали неке сукобљиве објекте у позадини. Ови предмети који се могу сударити ће комуницирати са играчем и другим елементима игре, додајући више дубине игри.

  Најбоље светлосне траке за монитор у 2023

Ево ГДСцрипт кода за креирање слојева паралаксе са објектима који се могу сударати:

 extends ParallaxBackground

func _ready():
    
    var layer1 = ParallaxLayer.new()
    layer1.motion_scale = Vector2(0.2, 0.2)
    add_child(layer1)

    
    var static_body1 = StaticBody2D.new()
    layer1.add_child(static_body1)

    var collision_shape1 = CollisionShape2D.new()
    var shape1 = RectangleShape2D.new()
    shape1.extents = Vector2(32, 32)
    collision_shape1.shape = shape1
    static_body1.add_child(collision_shape1)

    
    var layer2 = ParallaxLayer.new()
    layer2.motion_scale = Vector2(0.5, 0.5)
    add_child(layer2)

    
    var static_body2 = StaticBody2D.new()
    layer2.add_child(static_body2)

    var collision_shape2 = CollisionShape2D.new()
    var shape2 = RectangleShape2D.new()
    shape2.extents = Vector2(64, 64)
    collision_shape2.shape = shape2
    static_body2.add_child(collision_shape2)

    
    var layer3 = ParallaxLayer.new()
    layer3.motion_scale = Vector2(1.0, 1.0)
    add_child(layer3)

    
    var static_body3 = StaticBody2D.new()
    layer3.add_child(static_body3)

    var collision_shape3 = CollisionShape2D.new()
    var shape3 = RectangleShape2D.new()
    shape3.extents = Vector2(128, 128)
    collision_shape3.shape = shape3
    static_body3.add_child(collision_shape3)

Са овим кодом, сваки слој паралаксе сада садржи чвор СтатицБоди2Д са ЦоллисионСхапе2Д који представља објекте који се могу сударати у позадини.

Ови предмети који се могу сударити ће бити у интеракцији са карактером играча и другим елементима игре, додајући више дубине и сложености игри.

Померање различитих слојева различитом брзином

Сада када сте поставили своје паралаксе слојеве, морате да ажурирате њихове позиције на основу кретања играча. Ово ће створити ефекат паралаксе, где се слојеви који су ближе камери померају брже од оних који су удаљенији.

Додајте следећи ГДСцрипт код на сцену Плаиер:

 extends CharacterBody2D

func _physics_process(delta):
    ...
    move_and_collide(velocity * delta)

    
    var parallax_background = get_parent()
    var motion = -velocity * delta
    parallax_background.set_scroll_offset(parallax_background.scroll_offset + motion)

Овај код израчунава кретање паралаксних слојева на основу кретања играча и у складу с тим ажурира померање померања чвора ПараллакБацкгроунд. Обратите пажњу на употребу негативног знака како бисте осигурали да се слојеви крећу у супротном смеру од кретања играча.

Насумично померање паралаксе уноси елемент изненађења и непредвидљивости у позадину ваше игре. Динамичким генерисањем и позиционирањем паралаксних слојева током играња, можете створити занимљивије и динамичније искуство за играче.

Да бисте применили насумично померање паралаксе, додајте нове слојеве паралаксе са насумичним скалама и позицијама кретања.

 extends ParallaxBackground

const MAX_LAYERS = 5
const MIN_SCALE = 0.2
const MAX_SCALE = 1.5
const MIN_SPEED = 0.01
const MAX_SPEED = 0.03
const MIN_X_POSITION = -500
const MAX_X_POSITION = 500
const MIN_Y_POSITION = -300
const MAX_Y_POSITION = 300

func _ready():
    for i in range(MAX_LAYERS):
        create_random_layer()

func create_random_layer():
    
    var layer = ParallaxLayer.new()
    var scale = lerp(MIN_SCALE, MAX_SCALE, randf())
    layer.motion_scale = Vector2(scale, scale)

    var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)
    var y_position = randf_range(MIN_Y_POSITION, MAX_Y_POSITION)
    layer.global_transform.origin.x = x_position
    layer.global_transform.origin.y = y_position

    add_child(layer)

    
    var static_body = StaticBody2D.new()
    layer.add_child(static_body)

    var collision_shape = CollisionShape2D.new()
    var shape = RectangleShape2D.new()
    shape.extents = Vector2(32, 32)
    collision_shape.shape = shape
    static_body.add_child(collision_shape)

func remove_random_layer():
    
    if get_child_count() > 0:
        var random_index = randi() % get_child_count()
        var layer_to_remove = get_child(random_index)
        remove_child(layer_to_remove)

Овај код дефинише константе за контролу насумице слојева паралаксе. Користите функцију лерп да интерполирате вредности између МИН_СЦАЛЕ и МАКС_СЦАЛЕ, генеришући насумичну скалу кретања за сваки нови слој. Ова функција има следећи потпис:

 Variant lerp ( Variant from, Variant to, float weight ) 

Преношење резултата из рандф() као тежине омогућава вам да генеришете слојеве са насумичном скалом.

  13 најбољих алата за маркетинг садржаја за раст и ангажовање

Функција рандф_ранге нуди још један начин генерисања случајних вредности унутар опсега. Овде, функција цреате_рандом_лаиер је користи да генерише насумичне позиције за нове слојеве унутар одређеног опсега:

 var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION) 

Ваша демо игра би сада требала изгледати отприлике овако:

Укључујући додатне функције

Паралакс померање пружа солидну основу за побољшање визуелне привлачности ваше платформерске игре, али то можете ићи још даље тако што ћете укључити додатне функције. Ево неколико идеја које треба размотрити.

Позадински објекти

Направите више интерактивних елемената у слојевима паралаксе, као што су плутајуће платформе, покретне препреке или анимирани позадински ликови. Ови објекти могу додати дубину и интерактивност вашој игри платформе.

Динамично осветљење

Уведите динамичке светлосне ефекте у своје паралаксе слојеве. Додавањем извора светлости и сенки можете створити осећај реализма и дубине у свету игре. Годоов систем осветљења добро функционише са 2Д играма и може значајно да побољша визуелни квалитет.

Партицле Еффецтс

Интегришите системе честица у своје паралаксе да бисте додали суптилне визуелне ефекте. Опадајуће лишће, лебдећи облаци или светлуцаве звезде могу побољшати амбијент и учинити да се свет игре осећа живљим. У своју игру можете додати и звучне ефекте без ауторских права.

Циклус дан-ноћ

Спроведите циклус дан-ноћ који мења боју и интензитет слојева паралаксе у зависности од доба дана у игри. Ова динамичка функција може пружити играчима искуство које се стално развија док напредују кроз игру.

Иако померање паралаксе може да побољша визуелни изглед ваше игре, неопходно је да следите неке најбоље праксе да бисте обезбедили глатко и пријатно искуство.

  Како да контролишете осветљеност лампе вашег иПхоне-а

Оптимизација перформанси

Имајте на уму број слојева паралаксе и њихову сложеност. Превише слојева или средстава високе резолуције може довести до проблема са перформансама, посебно на мање моћним уређајима. Оптимизујте своје уметничко дело и користите поједностављене облике судара где је то могуће.

Распоред слојева

Пажљиво распоредите слојеве паралаксе. Узмите у обзир визуелну хијерархију и жељени ефекат дубине. Слојеви који су најближи камери требало би да се крећу брже, док би они који су удаљенији требало да се крећу спорије.

Границе камере

Поставите границе за кретање камере да бисте спречили нежељени празан простор или визуелне грешке када играч дође до ивица света игре. Ово осигурава беспрекорно искуство за играче.

Тестирање и подешавање

Тестирајте померање паралаксе на различитим уређајима и величинама екрана да бисте били сигурни да изгледа и добро функционише на различитим платформама. Подешавањем скала покрета, положаја слојева и других параметара можете фино подесити ефекат паралаксе за најбоље резултате.

Додавање насумичног померања паралаксе може значајно да побољша ниво ангажовања ваше игре Годот. Насумично померање паралаксе укључује динамичко генерисање и позиционирање слојева паралаксе током игре.

Радећи ово, стварате осећај кретања и динамике у позадини, чинећи да се свет игре осећа живим и непредвидивим. Играчи ће искусити визуелно окружење које се стално мења, додајући додатни слој узбуђења њиховом искуству играња.