Šį įspūdingą vizualinį efektą galite pasiekti tiesiog judindami objektus skirtingu greičiu.

Paralakso slinkimas yra technika, kurią naudoja daugelis 2D žaidimų, kad sukurtų gylio iliuziją ir padidintų žaidimo fonų vizualinį susidomėjimą. Šis efektas pasiekiamas perkeliant skirtingus fono sluoksnius skirtingu greičiu, palyginti su fotoaparato judėjimu.

„Godot 4“ leidžia lengviau nei bet kada įgyvendinti paralakso slinkimą. Jo galingas 2D variklis suteikia įmontuotą paralakso sluoksnių palaikymą, leidžiantį sukurti nuostabius vaizdo efektus su minimaliomis pastangomis.

„Godot“ žaidimo nustatymas

Norėdami pradėti, sukurkite naują 2D projektą Godot žaidimo variklis ir sukurkite žaidimo sceną su žaidėjo personažu.

Šiame straipsnyje naudojamas kodas pateikiamas čia GitHub saugykla ir jūs galite nemokamai naudotis pagal MIT licenciją.

Šiame pavyzdyje pridėkite a CharacterBody2D mazgas žaidėjo judėjimui. Taip pat pridėkite a CollisionShape2D su stačiakampio formos ir a Sprite2D reprezentuoti žaidėjo charakterį.

instagram viewer
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)

Naudodamas šį kodą, žaidėjo veikėjas gali judėti kairėn, dešinėn, aukštyn ir žemyn, naudodamas rodyklių klavišus ar panašias įvestis.

Įvairių sluoksnių kūrimas naudojant „ParallaxLayer“ mazgus

Tada sukurkite paralakso efektą pridėdami kelis ParallaxLayer mazgai į įvykio vietą. Kiekvienas ParallaxLayer parodys kitą fono sluoksnį. Norint pasiekti įtikinamą paralakso efektą, toliau nuo fotoaparato esantys sluoksniai turėtų judėti lėčiau nei arčiau esantys.

Papildyti StaticBody2D mazgai su CollisionShape2D kiekviename ParallaxLayer fone sukurti kai kuriuos susidūrimo objektus. Šie susiliejantys objektai sąveikaus su žaidėju ir kitais žaidimo elementais ir suteiks žaidimui daugiau gylio.

Štai GDScript kodas, skirtas sukurti paralaksinius sluoksnius su susiduriamais objektais:

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)

Naudojant šį kodą, kiekviename paralakso sluoksnyje dabar yra a StaticBody2D mazgas su a CollisionShape2D vaizduojantys susiduriamus objektus fone.

Šie susiliejantys objektai sąveikaus su žaidėjo personažu ir kitais žaidimo elementais ir suteiks žaidimui daugiau gylio ir sudėtingumo.

Skirtingų sluoksnių perkėlimas skirtingu greičiu

Dabar, kai nustatėte paralakso sluoksnius, turite atnaujinti jų pozicijas pagal žaidėjo judėjimą. Taip bus sukurtas paralakso efektas, kai arčiau kameros esantys sluoksniai juda greičiau nei esantys toliau.

Į grotuvo sceną pridėkite šį GDScript kodą:

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)

Šis kodas apskaičiuoja paralakso sluoksnių judėjimą pagal žaidėjo judėjimą ir atitinkamai atnaujina „ParallaxBackground“ mazgo slinkties poslinkį. Atkreipkite dėmesį į neigiamo ženklo naudojimą, kad užtikrintumėte, jog sluoksniai judėtų priešinga žaidėjo judėjimo kryptimi.

Atsitiktinis paralakso slinkimas suteikia žaidimo fone netikėtumo ir nenuspėjamumo. Žaidimo metu dinamiškai generuodami ir nustatydami paralakso sluoksnius, galite sukurti patrauklesnę ir dinamiškesnę žaidėjų patirtį.

Norėdami įgyvendinti atsitiktinį paralaksinį slinkimą, pridėkite naujų paralakso sluoksnių su atsitiktinio judesio skalėmis ir padėtys.

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)

Šis kodas apibrėžia konstantas, skirtas kontroliuoti paralakso sluoksnių atsitiktinumą. Naudoti lerp funkcija interpoliuoti reikšmes tarp MIN_SCALE ir MAX_SCALE, generuojant atsitiktinio judesio skalę kiekvienam naujam sluoksniui. Ši funkcija turi tokį parašą:

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

Rezultato perdavimas iš randf() nes svoris leidžia generuoti sluoksnius atsitiktine skale.

The randf_range funkcija siūlo kitą būdą, kaip generuoti atsitiktines vertes diapazone. Čia funkcija create_random_layer naudoja ją, kad sugeneruotų atsitiktines pozicijas naujiems sluoksniams nurodytame diapazone:

var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)

Jūsų demonstracinis žaidimas dabar turėtų atrodyti maždaug taip:

Įskaitant papildomas funkcijas

Paralakso slinkimas suteikia tvirtą pagrindą tobulinti jūsų platformingo žaidimo vizualinį patrauklumą, tačiau galite tai padaryti dar toliau įtraukdami papildomų funkcijų. Štai keletas idėjų, kurias reikia apsvarstyti.

Fono objektai

Sukurkite daugiau interaktyvių elementų savo paralakso sluoksniuose, pvz., plaukiojančias platformas, judančias kliūtis ar animuotus fono personažus. Šie objektai gali suteikti jūsų platformingo žaidimo gylio ir interaktyvumo.

Dinaminis apšvietimas

Įveskite dinaminius apšvietimo efektus savo paralakso sluoksniams. Pridėję šviesos šaltinių ir šešėlių galite sukurti žaidimo pasaulio tikroviškumo ir gylio jausmą. Godot apšvietimo sistema puikiai veikia su 2D žaidimais ir gali žymiai pagerinti vaizdo kokybę.

Dalelių efektai

Integruokite dalelių sistemas į savo paralakso sluoksnius, kad pridėtumėte subtilių vaizdo efektų. Krintantys lapai, slenkantys debesys ar putojančios žvaigždės gali pagerinti atmosferą ir padaryti žaidimo pasaulį gyvesnį. Tu taip pat gali pridėti garso efektus be autorių teisių į tavo žaidimą.

Diena-naktis ciklas

Įdiekite dienos ir nakties ciklą, kuris keičia paralakso sluoksnių spalvą ir intensyvumą pagal žaidimo paros laiką. Ši dinamiška funkcija gali suteikti žaidėjams nuolat tobulėjančios patirties žaidimo eigoje.

Nors paralakso slinkimas gali pagerinti jūsų žaidimo vaizdą, norint užtikrinti sklandžią ir malonią patirtį, būtina laikytis kai kurių geriausių praktikų.

Našumo optimizavimas

Atkreipkite dėmesį į paralakso sluoksnių skaičių ir jų sudėtingumą. Per daug sluoksnių arba didelės raiškos išteklių gali sukelti našumo problemų, ypač naudojant mažiau galingus įrenginius. Optimizuokite savo meno kūrinius ir, kur įmanoma, naudokite supaprastintas susidūrimo formas.

Sluoksnių išdėstymas

Apgalvotai išdėstykite paralakso sluoksnius. Apsvarstykite vizualinę hierarchiją ir norimą gylio efektą. Arčiausiai kameros esantys sluoksniai turėtų judėti greičiau, o toliau esantys lėčiau.

Kameros ribos

Nustatykite fotoaparato judėjimo ribas, kad išvengtumėte nepageidaujamos tuščios erdvės ar vaizdo trikdžių, kai žaidėjas pasiekia žaidimo pasaulio kraštus. Tai užtikrina sklandų žaidėjų patirtį.

Testavimas ir koregavimas

Išbandykite savo paralaksinį slinkimą įvairiuose įrenginiuose ir įvairių dydžių ekranuose, kad įsitikintumėte, jog jis gerai atrodo ir veikia įvairiose platformose. Pakeitus judesio skales, sluoksnių padėtis ir kitus parametrus, galima tiksliai sureguliuoti paralakso efektą, kad būtų pasiekti geriausi rezultatai.

Atsitiktinis paralaksinis slinkimas gali žymiai padidinti jūsų Godot žaidimo įsitraukimo lygį. Atsitiktinis paralakso slinkimas apima dinamišką paralakso sluoksnių generavimą ir išdėstymą žaidimo metu.

Tai darydami sukuriate judėjimo ir dinamiškumo jausmą fone, todėl žaidimų pasaulis jaučiasi gyvas ir nenuspėjamas. Žaidėjai patirs nuolat besikeičiančią vizualinę aplinką, kuri suteiks papildomo jaudulio žaidimų patirčiai.