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
func _physics_process(delta):
var velocity = Vector2()if Input.is_action_pressed('ui_right'):
velocity.x += 1if Input.is_action_pressed('ui_left'):
velocity.x -= 1if Input.is_action_pressed('ui_down'):
velocity.y += 1if 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 = 300func _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_positionadd_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.