Jūs varat sasniegt šo iespaidīgo vizuālo efektu, vienkārši pārvietojot objektus dažādos ātrumos.

Parallaksa ritināšana ir paņēmiens, ko izmanto daudzas 2D spēles, lai radītu dziļuma ilūziju un pievienotu spēles fonam vizuālu interesi. Tas panāk efektu, pārvietojot dažādus fona slāņus dažādos ātrumos attiecībā pret kameras kustību.

Godot 4 atvieglo paralakses ritināšanas ieviešanu nekā jebkad agrāk. Tā jaudīgais 2D dzinējs nodrošina iebūvētu atbalstu paralakses slāņiem, ļaujot ar minimālu piepūli izveidot satriecošus vizuālos efektus.

Godota spēles iestatīšana

Lai sāktu, izveidojiet jaunu 2D projektu Godot spēļu dzinējs un izveidojiet spēles ainu ar spēlētāja tēlu.

Šajā rakstā izmantotais kods ir pieejams šajā GitHub repozitorijs un to varat izmantot bez maksas saskaņā ar MIT licenci.

Šim piemēram pievienojiet a CharacterBody2D mezgls spēlētāju kustībai. Pievienojiet arī a CollisionShape2D ar taisnstūra formu un a Sprite2D lai attēlotu spēlētāja raksturu.

extends CharacterBody2D

var speed = 200

instagram viewer

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)

Izmantojot šo kodu, spēlētāja varonis var pārvietoties pa kreisi, pa labi, uz augšu un uz leju, izmantojot bulttaustiņus vai līdzīgas ievades.

Dažādu slāņu izveide ar ParallaxLayer mezgliem

Pēc tam izveidojiet paralakses efektu, pievienojot vairākus ParallaxLayer mezgli uz notikuma vietu. Katrs ParallaxLayer attēlos citu fona slāni. Lai panāktu pārliecinošu paralakses efektu, slāņiem, kas atrodas tālāk no kameras, vajadzētu kustēties lēnāk nekā tuvākajiem.

Pievienot StaticBody2D mezgli ar CollisionShape2D katrā ParallaxLayer lai fonā izveidotu dažus saduramus objektus. Šie saduramie objekti mijiedarbosies ar spēlētāju un citiem spēles elementiem, pievienojot spēlei lielāku dziļumu.

Šeit ir GDScript kods, lai izveidotu paralakses slāņus ar saduramiem objektiem:

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)

Izmantojot šo kodu, katrs paralakses slānis tagad satur a StaticBody2D mezgls ar a CollisionShape2D attēlo saduramus objektus fonā.

Šie saduramie objekti mijiedarbosies ar spēlētāja raksturu un citiem spēles elementiem, pievienojot spēlei lielāku dziļumu un sarežģītību.

Dažādu slāņu pārvietošana ar atšķirīgu ātrumu

Tagad, kad ir iestatīti paralakses slāņi, jums ir jāatjaunina to pozīcijas, pamatojoties uz spēlētāja kustību. Tas radīs paralakses efektu, kur kamerai tuvākie slāņi pārvietojas ātrāk nekā tie, kas atrodas tālāk.

Pievienojiet atskaņotāja ainai šādu GDScript kodu:

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 kods aprēķina paralakses slāņu kustību, pamatojoties uz atskaņotāja kustību, un attiecīgi atjaunina ParallaxBackground mezgla ritināšanas nobīdi. Ievērojiet negatīvās zīmes izmantošanu, lai nodrošinātu, ka slāņi pārvietojas pretējā spēlētāja kustības virzienā.

Paralakses ritināšana nejauši ievieš jūsu spēles fona pārsteiguma un neparedzamības elementu. Spēles laikā dinamiski ģenerējot un novietojot paralakses slāņus, jūs varat radīt spēlētājiem saistošāku un dinamiskāku pieredzi.

Lai ieviestu nejaušu paralakses ritināšanu, pievienojiet jaunus paralakses slāņus ar nejaušas kustības skalām un pozīcijām.

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 kods nosaka konstantes, lai kontrolētu paralakses slāņu nejaušību. Izmantojiet lerp funkciju, lai interpolētu vērtības starp MIN_SCALE un MAX_SCALE, ģenerējot nejaušu kustības skalu katram jaunam slānim. Šai funkcijai ir šāds paraksts:

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

Nododot rezultātu no randf() jo svars ļauj ģenerēt slāņus nejaušā mērogā.

The randf_range funkcija piedāvā citu veidu, kā ģenerēt nejaušas vērtības diapazonā. Šeit funkcija create_random_layer to izmanto, lai ģenerētu nejaušas pozīcijas jaunajiem slāņiem noteiktā diapazonā:

var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)

Jūsu demonstrācijas spēlei tagad vajadzētu izskatīties šādi:

Ieskaitot papildu funkcijas

Parallaksiskā ritināšana nodrošina stabilu pamatu uzlabošanai jūsu platformera spēle vizuālo pievilcību, taču varat to sasniegt vēl vairāk, iekļaujot papildu funkcijas. Šeit ir dažas idejas, kas jāņem vērā.

Fona objekti

Savos paralakses slāņos izveidojiet vairāk interaktīvu elementu, piemēram, peldošas platformas, kustīgus šķēršļus vai animētus fona varoņus. Šie objekti var pievienot jūsu platformera spēlei dziļumu un interaktivitāti.

Dinamiskais apgaismojums

Ieviesiet dinamiskus apgaismojuma efektus savos paralakses slāņos. Pievienojot gaismas avotus un ēnas, jūs varat radīt reālisma un dziļuma sajūtu spēles pasaulē. Godota apgaismojuma sistēma labi darbojas ar 2D spēlēm un var ievērojami uzlabot vizuālo kvalitāti.

Daļiņu efekti

Integrējiet daļiņu sistēmas savos paralakses slāņos, lai pievienotu smalkus vizuālos efektus. Krītošas ​​lapas, dreifējoši mākoņi vai dzirkstošās zvaigznes var uzlabot gaisotni un padarīt spēles pasauli dzīvāku. Jūs varat arī pievienojiet skaņas efektus bez autortiesībām uz savu spēli.

Dienas-nakts cikls

Ieviesiet dienas-nakts ciklu, kas maina paralakses slāņu krāsu un intensitāti atkarībā no spēles dienas laika. Šī dinamiskā funkcija var nodrošināt spēlētājiem nepārtraukti attīstošu pieredzi spēles gaitā.

Lai gan paralakses ritināšana var uzlabot jūsu spēles vizuālo izskatu, ir svarīgi ievērot dažus paraugpraksi, lai nodrošinātu vienmērīgu un patīkamu pieredzi.

Veiktspējas optimizācija

Ņemiet vērā paralakses slāņu skaitu un to sarežģītību. Pārāk daudz slāņu vai augstas izšķirtspējas līdzekļu var izraisīt veiktspējas problēmas, īpaši mazāk jaudīgās ierīcēs. Optimizējiet savu mākslas darbu un, ja iespējams, izmantojiet vienkāršotas sadursmes formas.

Slāņu izkārtojums

Pārdomāti sakārtojiet savus paralakses slāņus. Apsveriet vizuālo hierarhiju un vēlamo dziļuma efektu. Kamerai tuvākajiem slāņiem jāpārvietojas ātrāk, savukārt tālāk esošajiem – lēnāk.

Kameras robežas

Iestatiet kameras kustības robežas, lai novērstu nevēlamu tukšumu vai vizuālas kļūmes, kad spēlētājs sasniedz spēles pasaules malas. Tas spēlētājiem nodrošina nevainojamu pieredzi.

Testēšana un pielāgošana

Pārbaudiet savu paralakses ritināšanu dažādās ierīcēs un ekrānos, lai nodrošinātu, ka tā izskatās un labi darbojas dažādās platformās. Pielāgojot kustības skalas, slāņu pozīcijas un citus parametrus, var precīzi noregulēt paralakses efektu, lai iegūtu labākos rezultātus.

Nejaušas paralakses ritināšanas pievienošana var ievērojami uzlabot jūsu Godot spēles iesaistīšanās līmeni. Nejaušā paralakses ritināšana ietver dinamisku paralakses slāņu ģenerēšanu un pozicionēšanu spēles laikā.

To darot, jūs fonā radāt kustības un dinamisma sajūtu, liekot spēļu pasaulei justies dzīvai un neparedzamai. Spēlētāji piedzīvos pastāvīgi mainīgu vizuālo vidi, pievienojot viņu spēļu pieredzei papildu aizrautības slāni.