oil_tanker: add new GooParticle emitter
This commit is contained in:
parent
45019768d5
commit
0ddfa9d866
@ -1,3 +1,11 @@
|
|||||||
[gd_resource type="AnimatedTexture" format=2]
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "BigGoo1"
|
||||||
|
columns = 10
|
||||||
|
rows = 11
|
||||||
|
skip_x_last_frames = 9
|
||||||
|
framerate = 5
|
||||||
|
11
images/goo/BigGoo2.tres
Normal file
11
images/goo/BigGoo2.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "BigGoo2"
|
||||||
|
columns = 8
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 5
|
@ -3,17 +3,22 @@ render_mode blend_mix;
|
|||||||
uniform int particles_anim_h_frames;
|
uniform int particles_anim_h_frames;
|
||||||
uniform int particles_anim_v_frames;
|
uniform int particles_anim_v_frames;
|
||||||
uniform bool particles_anim_loop;
|
uniform bool particles_anim_loop;
|
||||||
|
uniform int frame;
|
||||||
void vertex() {
|
void vertex() {
|
||||||
float h_frames = float(particles_anim_h_frames);
|
float h_frames = float(particles_anim_h_frames);
|
||||||
float v_frames = float(particles_anim_v_frames);
|
float v_frames = float(particles_anim_v_frames);
|
||||||
VERTEX.xy /= vec2(h_frames, v_frames);
|
VERTEX.xy /= vec2(h_frames, v_frames);
|
||||||
float particle_total_frames = float(particles_anim_h_frames * particles_anim_v_frames);
|
float particle_total_frames = float(particles_anim_h_frames * particles_anim_v_frames);
|
||||||
float particle_frame = floor(INSTANCE_CUSTOM.z * float(particle_total_frames));
|
// float particle_frame = floor(INSTANCE_CUSTOM.z * float(particle_total_frames));
|
||||||
if (!particles_anim_loop) {
|
|
||||||
particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);
|
// if (!particles_anim_loop) {
|
||||||
} else {
|
// particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);
|
||||||
particle_frame = mod(particle_frame, particle_total_frames);
|
// } else {
|
||||||
} UV /= vec2(h_frames, v_frames);
|
// particle_frame = mod(particle_frame, particle_total_frames);
|
||||||
|
// }
|
||||||
|
float particle_frame = float(frame);
|
||||||
|
|
||||||
|
UV /= vec2(h_frames, v_frames);
|
||||||
UV += vec2(mod(particle_frame, h_frames) / h_frames, floor(particle_frame / h_frames) / v_frames);
|
UV += vec2(mod(particle_frame, h_frames) / h_frames, floor(particle_frame / h_frames) / v_frames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
images/goo/goo1.tres
Normal file
11
images/goo/goo1.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo1"
|
||||||
|
columns = 4
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 4
|
11
images/goo/goo2.tres
Normal file
11
images/goo/goo2.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo2"
|
||||||
|
columns = 4
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 4
|
11
images/goo/goo3.tres
Normal file
11
images/goo/goo3.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo3"
|
||||||
|
columns = 4
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 4
|
11
images/goo/goo4.tres
Normal file
11
images/goo/goo4.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo4"
|
||||||
|
columns = 1
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 1
|
11
images/goo/goo5.tres
Normal file
11
images/goo/goo5.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo5"
|
||||||
|
columns = 1
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 1
|
11
images/goo/goo6.tres
Normal file
11
images/goo/goo6.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo6"
|
||||||
|
columns = 1
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 1
|
11
images/goo/goo7.tres
Normal file
11
images/goo/goo7.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo7"
|
||||||
|
columns = 1
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 1
|
11
images/goo/goo8.tres
Normal file
11
images/goo/goo8.tres
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/GooParticle.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
name = "goo8"
|
||||||
|
columns = 1
|
||||||
|
rows = 1
|
||||||
|
skip_x_last_frames = 0
|
||||||
|
framerate = 1
|
@ -24,6 +24,11 @@ _global_script_classes=[ {
|
|||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://scripts/game1/Flatfish.gd"
|
"path": "res://scripts/game1/Flatfish.gd"
|
||||||
}, {
|
}, {
|
||||||
|
"base": "Resource",
|
||||||
|
"class": "GooParticle",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://scripts/GooParticle.gd"
|
||||||
|
}, {
|
||||||
"base": "Node",
|
"base": "Node",
|
||||||
"class": "IntroScript",
|
"class": "IntroScript",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
@ -38,6 +43,7 @@ _global_script_class_icons={
|
|||||||
"DialogueAction": "",
|
"DialogueAction": "",
|
||||||
"DialogueBox": "",
|
"DialogueBox": "",
|
||||||
"Flatfish": "",
|
"Flatfish": "",
|
||||||
|
"GooParticle": "",
|
||||||
"IntroScript": "",
|
"IntroScript": "",
|
||||||
"LogEntity": ""
|
"LogEntity": ""
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,24 @@
|
|||||||
[gd_scene load_steps=13 format=2]
|
[gd_scene load_steps=28 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scripts/oil_tanker.gd" type="Script" id=1]
|
[ext_resource path="res://scripts/oil_tanker.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://images/oil_tanker/OilTanker.tres" type="SpriteFrames" id=2]
|
[ext_resource path="res://images/oil_tanker/OilTanker.tres" type="SpriteFrames" id=2]
|
||||||
[ext_resource path="res://images/oil_tanker/oilTankerInside_Background.png" type="Texture" id=3]
|
[ext_resource path="res://images/oil_tanker/oilTankerInside_Background.png" type="Texture" id=3]
|
||||||
[ext_resource path="res://scenes/SidePlayer.tscn" type="PackedScene" id=4]
|
[ext_resource path="res://scenes/SidePlayer.tscn" type="PackedScene" id=4]
|
||||||
[ext_resource path="res://images/oil_tanker/oilTankerInside_Foreground.png" type="Texture" id=5]
|
[ext_resource path="res://images/oil_tanker/oilTankerInside_Foreground.png" type="Texture" id=5]
|
||||||
|
[ext_resource path="res://scripts/GooEmitter.gd" type="Script" id=6]
|
||||||
|
[ext_resource path="res://images/goo/goo.shader" type="Shader" id=7]
|
||||||
|
[ext_resource path="res://images/goo/BigGoo1.tres" type="Resource" id=8]
|
||||||
|
[ext_resource path="res://images/goo/BigGoo1.png" type="Texture" id=9]
|
||||||
|
[ext_resource path="res://images/goo/BigGoo1_Outlines.png" type="Texture" id=10]
|
||||||
|
[ext_resource path="res://images/goo/BigGoo2.tres" type="Resource" id=11]
|
||||||
|
[ext_resource path="res://images/goo/goo5.tres" type="Resource" id=12]
|
||||||
|
[ext_resource path="res://images/goo/goo8.tres" type="Resource" id=13]
|
||||||
|
[ext_resource path="res://images/goo/goo4.tres" type="Resource" id=14]
|
||||||
|
[ext_resource path="res://images/goo/goo2.tres" type="Resource" id=15]
|
||||||
|
[ext_resource path="res://images/goo/goo7.tres" type="Resource" id=16]
|
||||||
|
[ext_resource path="res://images/goo/goo6.tres" type="Resource" id=17]
|
||||||
|
[ext_resource path="res://images/goo/goo1.tres" type="Resource" id=18]
|
||||||
|
[ext_resource path="res://images/goo/goo3.tres" type="Resource" id=19]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
extents = Vector2( 10, 27.9493 )
|
extents = Vector2( 10, 27.9493 )
|
||||||
@ -27,6 +41,13 @@ b = Vector2( -129.208, -5.53812 )
|
|||||||
[sub_resource type="SegmentShape2D" id=7]
|
[sub_resource type="SegmentShape2D" id=7]
|
||||||
b = Vector2( -87.4343, 42.6051 )
|
b = Vector2( -87.4343, 42.6051 )
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id=10]
|
||||||
|
shader = ExtResource( 7 )
|
||||||
|
shader_param/particles_anim_h_frames = 10
|
||||||
|
shader_param/particles_anim_v_frames = 11
|
||||||
|
shader_param/particles_anim_loop = true
|
||||||
|
shader_param/frame = null
|
||||||
|
|
||||||
[node name="Node2D" type="Node2D"]
|
[node name="Node2D" type="Node2D"]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
@ -37,6 +58,13 @@ centered = false
|
|||||||
[node name="Player" parent="InsideOilTanker" instance=ExtResource( 4 )]
|
[node name="Player" parent="InsideOilTanker" instance=ExtResource( 4 )]
|
||||||
position = Vector2( 192, 64.4552 )
|
position = Vector2( 192, 64.4552 )
|
||||||
|
|
||||||
|
[node name="GooEmitter" type="Node2D" parent="InsideOilTanker"]
|
||||||
|
position = Vector2( -43.5548, 47.7155 )
|
||||||
|
script = ExtResource( 6 )
|
||||||
|
goo_particles = [ ExtResource( 8 ), ExtResource( 11 ), ExtResource( 18 ), ExtResource( 15 ), ExtResource( 19 ), ExtResource( 14 ), ExtResource( 12 ), ExtResource( 17 ), ExtResource( 16 ), ExtResource( 13 ) ]
|
||||||
|
direction = Vector2( 1, 0 )
|
||||||
|
spawn_rate = 2
|
||||||
|
|
||||||
[node name="Foreground" type="Sprite" parent="InsideOilTanker"]
|
[node name="Foreground" type="Sprite" parent="InsideOilTanker"]
|
||||||
texture = ExtResource( 5 )
|
texture = ExtResource( 5 )
|
||||||
centered = false
|
centered = false
|
||||||
@ -86,6 +114,12 @@ position = Vector2( 204.978, 72.7017 )
|
|||||||
shape = SubResource( 7 )
|
shape = SubResource( 7 )
|
||||||
|
|
||||||
[node name="OilTanker" type="AnimatedSprite" parent="."]
|
[node name="OilTanker" type="AnimatedSprite" parent="."]
|
||||||
visible = false
|
|
||||||
frames = ExtResource( 2 )
|
frames = ExtResource( 2 )
|
||||||
centered = false
|
centered = false
|
||||||
|
|
||||||
|
[node name="GooExample" type="Sprite" parent="."]
|
||||||
|
visible = false
|
||||||
|
material = SubResource( 10 )
|
||||||
|
texture = ExtResource( 9 )
|
||||||
|
normal_map = ExtResource( 10 )
|
||||||
|
centered = false
|
||||||
|
70
scripts/GooEmitter.gd
Normal file
70
scripts/GooEmitter.gd
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
export(Array, Resource) var goo_particles = []
|
||||||
|
export(Vector2) var direction
|
||||||
|
export(int) var spawn_radius = 32
|
||||||
|
export(int) var spawn_rate = 1
|
||||||
|
export(int) var despawn_radius = 250
|
||||||
|
export(float) var movement_speed = 10
|
||||||
|
|
||||||
|
var goo_shader = preload('res://images/goo/goo.shader')
|
||||||
|
|
||||||
|
var delta_sum = 0
|
||||||
|
var time = 0
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
for particle in goo_particles:
|
||||||
|
particle.load_textures()
|
||||||
|
|
||||||
|
func emit():
|
||||||
|
var particle = goo_particles[rand_range(0, goo_particles.size())] as GooParticle
|
||||||
|
print(particle.name)
|
||||||
|
|
||||||
|
var instance = Particle.new()
|
||||||
|
instance.particle = particle
|
||||||
|
instance.material = ShaderMaterial.new()
|
||||||
|
instance.material.shader = goo_shader
|
||||||
|
instance.material.set_shader_param('particles_anim_h_frames', particle.columns)
|
||||||
|
instance.material.set_shader_param('particles_anim_v_frames', particle.rows)
|
||||||
|
instance.material.set_shader_param('particles_anim_loop', true)
|
||||||
|
instance.material.set_shader_param('frame', 0)
|
||||||
|
instance.texture = particle.texture
|
||||||
|
instance.normal_map = particle.normal_map
|
||||||
|
instance.shader_frame = 0
|
||||||
|
instance.position = Vector2(rand_range(0, spawn_radius), rand_range(0, spawn_radius))
|
||||||
|
instance.initial_y = instance.position.y
|
||||||
|
instance.initial_time = time
|
||||||
|
|
||||||
|
add_child(instance)
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
delta_sum += delta
|
||||||
|
time += delta
|
||||||
|
|
||||||
|
for child in get_children():
|
||||||
|
child.delta_sum += delta
|
||||||
|
while child.delta_sum >= 1.0 / child.particle.framerate:
|
||||||
|
child.delta_sum -= 1.0 / child.particle.framerate
|
||||||
|
child.shader_frame += 1
|
||||||
|
if child.shader_frame >= child.particle.frame_count:
|
||||||
|
child.shader_frame = 0
|
||||||
|
child.material.set_shader_param('frame', child.shader_frame)
|
||||||
|
|
||||||
|
child.position += direction * delta * movement_speed
|
||||||
|
child.position.y = child.initial_y + sin(time - child.initial_time) * 3
|
||||||
|
|
||||||
|
while delta_sum >= spawn_rate:
|
||||||
|
delta_sum -= spawn_rate
|
||||||
|
emit()
|
||||||
|
|
||||||
|
for child in get_children():
|
||||||
|
if child.position.length() > despawn_radius:
|
||||||
|
child.queue_free()
|
||||||
|
|
||||||
|
class Particle:
|
||||||
|
extends Sprite
|
||||||
|
var shader_frame = 0
|
||||||
|
var particle : GooParticle
|
||||||
|
var delta_sum : float = 0
|
||||||
|
var initial_y : int
|
||||||
|
var initial_time : float
|
21
scripts/GooParticle.gd
Normal file
21
scripts/GooParticle.gd
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
extends Resource
|
||||||
|
|
||||||
|
class_name GooParticle
|
||||||
|
|
||||||
|
export var name : String
|
||||||
|
export var columns : int = 1
|
||||||
|
export var rows : int = 1
|
||||||
|
export var skip_x_last_frames : int = 0
|
||||||
|
export var framerate = 5
|
||||||
|
|
||||||
|
var texture : Texture
|
||||||
|
var normal_map : Texture
|
||||||
|
var frame_count : int
|
||||||
|
|
||||||
|
var loaded = false
|
||||||
|
func load_textures():
|
||||||
|
if !loaded:
|
||||||
|
loaded = true
|
||||||
|
texture = load('res://images/goo/' + name + '.png')
|
||||||
|
normal_map = load('res://images/goo/' + name + '_Outlines.png')
|
||||||
|
frame_count = columns * rows - skip_x_last_frames
|
Loading…
Reference in New Issue
Block a user