【Godot】相机抖动

Godot 3.4.2

有以下方式

Camera2D 节点控制

Godot 实现镜头晃动震动效果,让场景变得更加惊险刺激吧!

extends Camera2D


export (OpenSimplexNoise) var noise : OpenSimplexNoise
export (float, 0, 1) var trauma : float = 0.5
export (float, 0, 1) var decay : float = 0.6
export var time_scale : float = 100
export var max_x : int = 150
export var max_y : int = 150
export var max_r : int = 25


var __time__ = 0.0


func _process(delta):
	__time__ += delta
	
	var shake = pow(trauma, 2)
	offset.x = noise.get_noise_3d(__time__ * time_scale, 0, 0) * max_x * shake
	offset.y = noise.get_noise_3d(0, __time__ * time_scale, 0) * max_y * shake
	rotation_degrees = noise.get_noise_3d(0, 0, __time__ * time_scale) * max_r * shake
	
	if trauma > 0: 
		trauma = clamp(trauma - (delta * decay), 0, 1)

Screen Shake

extends Camera2D
class_name ShakeCamera2D

export var decay = 0.8  # How quickly the shaking stops [0, 1].
export var max_offset = Vector2(100, 50)  # Maximum hor/ver shake in pixels.
export var max_roll = 0.1  # Maximum rotation in radians (use sparingly).
export (NodePath) var target  # Assign the node this camera will follow.

var trauma = 0.0  # Current shake strength.
var trauma_power = 2  # Trauma exponent. Use [2, 3].
onready var noise = OpenSimplexNoise.new()
var noise_y = 0

func _ready():
	randomize()
	noise.seed = randi()
	noise.period = 4
	noise.octaves = 2

func _process(delta):
	if target:
		global_position = get_node(target).global_position
	if trauma:
		trauma = max(trauma - decay * delta, 0)
		shake()
		
func shake():
	var amount = pow(trauma, trauma_power)
	noise_y += 1
	# Using noise
	rotation = max_roll * amount * noise.get_noise_2d(noise.seed, noise_y)
	offset.x = max_offset.x * amount * noise.get_noise_2d(noise.seed*2, noise_y)
	offset.y = max_offset.y * amount * noise.get_noise_2d(noise.seed*3, noise_y)
	# Pure randomness
#	rotation = max_roll * amount * rand_range(-1, 1)
#	offset.x = max_offset.x * amount * rand_range(-1, 1)
#	offset.y = max_offset.y * amount * rand_range(-1, 1)
	
func add_trauma(amount):
	trauma = min(trauma + amount, 1.0)
	

Tween 节点控制

GODOT ENGINE:屏幕振动效果的实现

extends Tween

class_name CameraShaker

export var camera_path : NodePath

var camera :Camera2D = null

func _ready():
	camera = get_node_or_null(camera_path)

func disturb_offset(strength : float):
	camera.offset.x = rand_range(-strength,strength)
	camera.offset.y = rand_range(-strength,strength)


func shake(strength : float,duration : float = 1.0):
	if  camera != null:
		interpolate_method(self,"disturb_offset",strength,0,duration,Tween.TRANS_SINE,Tween.EASE_OUT,0)
		start()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值