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

Паралаксно померање је техника коју многе 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Д у сваком ПараллакЛаиер да креирате неке објекте који се могу сударити у позадини. Ови предмети који се могу сударити ће комуницирати са играчем и другим елементима игре, додајући више дубине игри.

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

extends ParallaxBackground

func _ready():
# Create the first parallax layer
var layer1 = ParallaxLayer.new()
layer1.motion_scale = Vector2(0.2, 0.2)
add_child(layer1)

# Add a StaticBody2D with CollisionShape2D to the first layer
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)

# Create the second parallax layer
var layer2 = ParallaxLayer.new()
layer2.motion_scale = Vector2(0.5, 0.5)
add_child(layer2)

# Add a StaticBody2D with CollisionShape2D to the second layer
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)

# Create the third parallax layer
var layer3 = ParallaxLayer.new()
layer3.motion_scale = Vector2(1.0, 1.0)
add_child(layer3)

# Add a StaticBody2D with CollisionShape2D to the third layer
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)

# Update parallax layers based on player movement
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():
# Add a new parallax layer with a random motion scale
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)

# Add a StaticBody2D with CollisionShape2D to the new 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():
# Remove a random parallax 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 )

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

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

var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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