From 04dec8327539d65c08cf8bcfe8aecc4d2aef02e6 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Thu, 22 Jun 2023 18:01:24 -0400 Subject: [PATCH] eels reborn --- graphics/enemy/eel_body.png | Bin 610 -> 4326 bytes graphics/enemy/eel_head.png | Bin 718 -> 4423 bytes graphics/enemy/eel_tail.png | Bin 624 -> 4327 bytes maps/test_room.tscn | 13 ++-- objects/enemy/eel.gd | 58 +++++++++-------- objects/enemy/eel.tscn | 125 +++++++++++++++++++----------------- 6 files changed, 104 insertions(+), 92 deletions(-) diff --git a/graphics/enemy/eel_body.png b/graphics/enemy/eel_body.png index 087b22992a23926ea132d6a35f28f8d9550a9ee9..58588acd204db6c71082405d2cd48c1f8e825802 100644 GIT binary patch literal 4326 zcmeHKYj6|S6<#J_Y6r_Wyh37{WqAiyyLzpp#RA)sj0K3uwy;fJ&T98c-rB2ONoz}X zDHtaN+)yB7GNlk3Ofl)CE+HX=goJ=Y88Zcf6E}sVZbEpJ;7Mw`;Bje6)4MA_)68@{ z)BLkE((a!7-S3?9-E+^}t@W&0mYnoJ5`rMft{g`mye7ckgdZvYnT6-H@X}S~Et2z? zC@O_TKVJq=xl#fsi1B^|iGBKu+)sp4z5CXp+|UzyGZHtq z%(@%1%y_jk@K4(L%Ivd^Rgrm{O{E`w;obFm@_EkwNcW+&Et726%<9PnflITy?y;=h z`j&IjlRXdZlioUYws2qX$)k(k8`tp1&mGTu>g)JzDK$BB=Dt3CsSgv6v={vO;!jp| z^sIa?R-sK0vKnJg7jJC3T>p*r%Qy2MbfncyJ9K6B!#iCXFsEeo?);8B-o;J!=ay&9 zEY05jal*B$UC$KPre?Iy?LORgW9L#a@|Q1D?p%2EW^(v&#Ybyz&v*zy#%$#6c8|+$ z@6R1({L;^!x8iJn4JqzFHcq)8zQ|tbju25+5 zto2NOvqv^gqleX=aGp{T=xbVj(LfT`Cy3QT?mFq(4rrOiK2Nw$GmLJGYcc$f< z>i)j5spa7t_y>=^{fAw>*N6#!?YTbZU|U+|efJhUGd4Bpl}j1ZseNyB>@Uh`Tet7& z^_O~9T+2IiWK8zfO7Gsxio2KBcfIr2Zzt})y`v^^?>DDIOR_hd)VBV{`a$n&SBk56#!BTk+PT z9X)?)Z@GET_J)Ib=9A4c$%6e~9np0DP3ZjkbHn+6uS3Q?8UCWDthOE&X^e-(Sma(w zv!bA7IMD~RF+qY=iXiDrV-mxb0vYvz03Wnro$s8$P@c14g(f%Ymh7N}N7{Hj%6 zwyKo1a@f)(N$D{f5(q$M(3nsbjL4@pms3~P@~qUC2?nr zuh3&llF;-p=cn@=*?ko7$%d84vP2U^G#b@L4O%fAAaqu%l_2$mUXMcr9;pn&}%JY1$? zIF(Oayf z!E7LLv&C%2jTWm8_gReqr%ZmM&+pfnecVurN5VX;N~UaRR0N{Y&?H6c^ zg_A~_9D)})-e38@(8}gP)8k8?!$+Y1O4StKQTZSge~Ler@#!}&!c+iG zjT3Ukhu9J(7yz()^p$JBo&TOv09GSMnJFU@D z^xofg{OoJV)hL2ApK7%{Ti1YY`Fbuj_1UDw=H|rt-Jf1C6j$%))!g{7c~||REnAt* g(#3?&N^iZKvh#dm?s4zzHb{iHoU0rMv!1H?4+ugZG5`Po delta 600 zcmaE+_=u&xGr-TCmrII^fq{Y7)59eQNV5Pj4+k5NbX_DP%)r3dlIiRm;OXqFP*9Yg zmYI{vz@Ra)cA~AvVF#I`@xk7%TC#5xjw(8rZtCvp2wv+XsMQj+FqD0=_x=T*-jg0Z z(%2y;^Cx1B)eei-uO4V|G|4Nh)AQ@n3wrc_l2d)R1b^S}kMHh1ekZH2WtETdZ=r@| z(Qax}MT&oh8vf{FSj3SmRyT9zS4&T?!^Jgs4Lb%nKYm^F`uJU$Q zG*?tzUR8Wgy>G*&HA3@+`=v`9AGxp7*4tmGXQ}hyOvl8tXN285jt22-+nzbq=4Rt6 z6Kp#7Q|p}5^;*w$&qZxLX!ZSxK9A^^sj2HO%Q$j%M>Mera!IXNz{On{RT|`zl41Yy zVZT*fXAIX)t%N5L4!lw+$NB%U@850OJy|#}NQ09lF6Vc$2**37x65+t*0MTavfC3y=na zpU%7MffQ$fM`SSr1K)lSX0%`pRsjmKmw5WRvOi~)5>%J3`f>gkP)M@GHKN2hKQ}iu zuY|#Qa;<>4zm=zpV+hCfbP0l+XkKtz7NO diff --git a/graphics/enemy/eel_head.png b/graphics/enemy/eel_head.png index 7bfef97fb0a552ffe431a36eff29cd4e50bee4ff..107b7d8e7beed3c84099d785a6bf2e792ecc0da2 100644 GIT binary patch literal 4423 zcmeHLeNYo;8ec2Lih^3Ig0<}$+ltlA?k1bBZK6UFNR(KFh;a4_o81lUNwWD^NZ=|6 zMX5Jdiq6eYMLsOhv!}G4YHoY>;z8Q1I*5)}*^z;px5Yj~PldbDk{!_bt4< z=OBLL-oIadt32|Hr_-Ab1Q&-??p{@PHrw&|j=yfH(#G9UR$rezHP%v>+amwc9KT)r za{04II?%n?;ZIKn_V&EWpT0Mz^oznsb6kF2qd^{0u`-c4SJY~1UB6N9%6MUYb`O3a z*?0LjuRm+w;Jsiw@!XFe)V$(;{yu!=`jLnJmeEl1#?_?M5__|*p*o@2IM=eq8pE`C zZd)L_tMr}E9)W+f_TChbJMHe9PxKY{>z8bte0FW#gY(vD=@2w&GiNj=S&hb_%t5|Y z8!HT!Pgl%u%}8mM%`TfW%X=be&(f0F-u-K1;x;EOd9NeWccbh~{Q|4k``C-qA_|wL zKJj8zZmwr`$R{&quA95aJa=(dk+sgef6DQ`V4&066EU-cZA|~Qcf~oEa!=x`UtRiL zRM0#lbk<)&9EwBR(yc4&zQ5N}R{l<4P4z$SU#fXCqiy~4TU$T#IxE#(WLI~i%k#~m zh(kN}KUx!6zFUaBlF+o|$)jF*%hFq)zx#&u^sKV2t&Yc+xISOm7_T?aU!&S{d-ML| z&$T0`e)Yl0T|HOP>HoZY?U|-?^J5>KmR1@vE9~tHE27nV-|MJPvz#m3`%2M;yQ{7y zpJ<*Gzdhex8=KenUD2%%*Z*RlFJd`y1k54ux52frs)L;Xrm!~4Cz zC$T%$f&&fa?VE~S-(6{GSp3^#*CMcP=0xKUD+_nU)j>yU&T6i0I)j{fzvJ%tOUG|a ze!Z?KS##`@1z2kR56uysH(j0o`c~QYpb&caCEw+{Ia{kiiv~H+ifOh)lIC4g-;i33k9-D2L-t8Y$0qB7SDG!RvG1TQkM?c{g%z1!h zFrc4(!fyvN8ck;Xe6EjX&3UX_SU8#@!D>qyW)M@#;#?jnDIne$XAC`z^W^$+Bn(5N zY!2%Jq<#<|J_avv&JnT3#3qhN>5L8pxEtmlgC5FV0t1xIMw)m!S9EGM8DwI-B*W7j zLrRw{L#qj;lRz*9gCT^I!Vs-i#UcuglE&4n6IVD@qo}NIzd*TZR-^*tat`ol7#)UD zDkZ`a1cMN)14DES;Xo7&i)mN~Lpv1eQ4}xuIM9_;&giH_Dh5#La0=7nIE`osT!Rn_ z%z@|#MulkAYAvp#6fA*hBr35EWNebvAXCV(5ld1IB{+GX%OFeS+_}M#0XyenQv^yB z4OeS5gj%V_mAFQO6N(W~D(mxuh7&n)Os*uP5r!t?0V4$(hjUR`Eb4J*Ndsb8NRSK= zmJ<6EFiUoj3u*MRl)(G!JfCBbiLt^WjR&b0|!Np_IfoxVR4-gE&)W}Z-LkAN^#WiCnV?Fv4P4p6A z)FK0(8?b@J3#^6c@M1WqnYiryf}g=!{DK|;^@Njg={q6Ugk0lNU|isd?wXKmTndZ} zJkeeMH@U(_UZ+?$*aZc^%Tjy&mW$v;E7Y+n!36b--`bDf+6gREJ(hGo_~YQHcudkh zobognMP7{p0OWc)1(q@rm-~cCN!{TOfU2()*0IIc` zV(l@f=}b5hyRx&l(AKwnTid?eNHY?t4i7Du*B{{V~Dui00RR@zx zzo1D=lH%ehxE37zSgbm@IP2=*DhPrfAg(S>iY`*(|B^y~ix>}%`|0def?N-Y1T*vaAxH6OS8oLE=ZQD=xorE;%gl%!rZA%o9h5#ZnI|JEVw$ zeu-QPxhi1fSU?RLWXBKw2fw>Di<1*>QYZ-oUTphg6bSAD?WS#iAKP~O1n@rtS9;f9 zYXLK#q&K@-><9>N0~gm_P1yr3cYxuix@^dfeSad^gZEa<4 zbO1w>dk`0Yrb$FWR4C75WIzS~k=Tq3SOBu%|L@n-;T%q_n^-k6p(}qJv&V(c00000NkvXXu0mjf6Amcb diff --git a/graphics/enemy/eel_tail.png b/graphics/enemy/eel_tail.png index 949f03f00b608eac48917a62a70e9648ceba6dc2..dd08a768c9c83966cddccef9d779cd8f7b8c3625 100644 GIT binary patch literal 4327 zcmeHKeQ?v}85dUwB>{&NLSO?^nqjJHT(Yb!X?FUg zTk(AhGnOrA?+x5%oDGZrbR-quj$Xh1{uQd>(2TRZeccWAUj5QaM=p}ldai3p-y@c1 z>(B3<)_y;Ez2)MSYnkuuC8gN2Nx8!DI(+Y_80r54R>g<%F_mA!@&9CmLZhZODAF%TK7W3b`5oFSK!EP^f+3iEM z!-{u(|EIQscUH|m{dCb0ed>-mDdCR7-OIP7hFiatp1Zv;^YG2B@{Ju``yO|N!?U*} z>8h4*Sg>VRG#W~sd@_0F#H zeE(A)dpeFx%B!#NHs_Q-xLn=$*5=n|?!5idwrS1(Jsn<=S9`+H^_unEonK$2)*_#i zq5W@u_A*2K+f{jRzq7ukR=nJEY=6f0PF&LwxA~3(pRTTI$ZbL1ZhFsrt)>g>dh=%g zUoM`x@yJhF+C1hHCm$y^?ECbHuJ@l}??3)Zo_$z_O!=;SrN6AM5jJUDfX!I!Uc+#b zXkdBC2MlpB1iKVLvRB4KELRE?)CU4W(5CNw>$n~jc$mYZ;g?4U#_sFXob?{mK=I*>MIEh(KY{xL6j9Fman+<7MEzYR2`b22o0F`eJt>YL{eyQU=OEV9vNu zZqlzvM6+ey&v+bpgB0+|rY}*H5QF2fSj-S34U!zdjaI7_Crr4>gh2!rsR$};91BJk zsT2bo4iMpFA*2XW5LG!@pA=PWdOh@`L-~mzw|kgA7#UOn>Ve1E5NLNi z1fJ1ujed~D(nf$$780HS#bT^4D+@EzX5b?!nj?+eC@NPlqOd^@s8o>LAV40A*+c;& zYsIoyj>jmDdzG@1c9iejBCz^-J=MrWl`@sP@A1!mUl_hS}78X=XH z#;iUXV19xlEVRXM;jC7TN*xC#r_g27n+(K=rLc@u{E{r%^lOA*G(O_+3L+>{SXDG5 zZ81|cNz1hfIj5!i4lr;#v_l;+_%CJ!>QuyF*D4FEh83}_B@SQuCg6qZ%{ z6f$deSPNs90jo%|SCYzXdNo&6r5tv<;dJ6zg>|qBfYAsO$q+PSGI@T!Ik)h?Wt*nrfVaZF%}&w0qXET!7zfxz9<+zSTL@x8ABCk<6qDuTLX+*WZ-)P zHn@1fwGba(3L3H;WrE&h6&5 z&i$+=WoL73{V~Dui00RR@zx zzo1D=lH%ehxE37zSgbm@IP2=*DhPrfAg(S>iY`*(|B^y~ix>}%`|0def?N-Y1T*vaAxH6OS8oLE=ZQD=xorE;%gl%!rZA%o9h5#ZnI|JEVw$ zeu-QPxhi1fSU?RLWXBKw2fw>Di<1*>QYZ-oUTphg6bSAD?WS#iAKP~O1n@rtS9;f9 zYXLK#q&K@-><9>N0~gm_P1yr3cYxuix@^dfeSad^gZEa<4 zbO1w>eGnI2NJ&INR2b7^V4yi*WME+Uk3|f@`F>6PKLY~;gJlFn{KBOhDDo`mMjGg8 zz}Xir-T0580K void: - hitbox.remove_child(first_segment) + var first_segment: PathFollow2D = $Segment + var first_segment_shape: CollisionShape2D = $"%SegmentShape" + + _segments = [] + _segments.resize(segments) for i in segments: var new_segment = first_segment.duplicate() - new_segment.position.x = segment_start.position.x + SEGMENT_LENGTH * float(i) - hitbox.add_child(new_segment) - $Path2D/PathFollow2D/Hitbox/TailShape.position.x = segment_start.position.x + SEGMENT_LENGTH * segments - _wave_segments() + add_child(new_segment) + _segments[i] = new_segment + var new_segment_shape = first_segment_shape.duplicate() + $Hitbox.add_child(new_segment_shape) + var new_shape_transform = new_segment.get_node("ShapeTransform") + new_shape_transform.remote_path = new_shape_transform.get_path_to(new_segment_shape) + + first_segment.queue_free() + first_segment_shape.queue_free() func _physics_process(delta: float) -> void: - # move -# global_position.x += speed * delta * sign(scale.x) - path_follow.set_offset(path_follow.get_offset() + speed * delta) - # make segments wibble - _wave_segments() - # check for wrapping - var sector_rect = Rect2(sector * Game.resolution - Vector2(8.0, 0.0), Game.resolution + Vector2(16.0, 0.0)) - var total_length = BASE_LENGTH + (SEGMENT_LENGTH * float(segments)) - var eel_rect = Rect2(global_position + Vector2(-2.0, 4.0), Vector2(total_length, 0.0)) - if sign(scale.x) == 1.0: - eel_rect.position.x -= total_length - if not sector_rect.intersects(eel_rect): - global_position.x -= (sector_rect.size.x + total_length) * sign(scale.x) + head.offset += speed * delta + _offset_segments() +# _wave_segments() + +func _offset_segments() -> void: + tail.offset = head.offset - SEGMENT_LENGTH * float(segments + 1) + for i in _segments.size(): + _segments[i].offset = head.offset - SEGMENT_LENGTH * float(i + 1) func _wave_segments() -> void: - for segment in hitbox.get_children(): - if segment is Node2D: - segment.position.y = sin(segment.global_position.x / wave_length) * wave_amplitude + for segment in get_children(): + if segment is PathFollow2D: + segment.v_offset = sin(segment.offset / wave_length) * wave_amplitude func die() -> void: - for segment in hitbox.get_children(): + for segment in _segments: if segment is Node2D: var death_particles = DeathParticles.instance() death_particles.global_position = segment.global_position diff --git a/objects/enemy/eel.tscn b/objects/enemy/eel.tscn index b3b89be..5363ec9 100644 --- a/objects/enemy/eel.tscn +++ b/objects/enemy/eel.tscn @@ -1,90 +1,95 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://objects/enemy/eel.gd" type="Script" id=1] [ext_resource path="res://graphics/enemy/eel_head.png" type="Texture" id=2] [ext_resource path="res://graphics/enemy/eel_body.png" type="Texture" id=3] [ext_resource path="res://graphics/enemy/eel_tail.png" type="Texture" id=4] -[ext_resource path="res://graphics/enemy/eel_inner_border.png" type="Texture" id=5] +[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=6] -[sub_resource type="Curve2D" id=4] -_data = { -"points": PoolVector2Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, -24, 0, 0, 0, 0, -8, -48, 0, 0, 0, 0, 24, -72, 0, 0, 0, 0, -8, -96, 0, 0, 0, 0, -8, -96, 0, 0, 0, 0, 24, -72, 0, 0, 0, 0, -8, -48, 0, 0, 0, 0, 24, -24, 0, 0, 0, 0, 0, 0 ) -} - -[sub_resource type="RectangleShape2D" id=3] +[sub_resource type="RectangleShape2D" id=8] extents = Vector2( 2, 2 ) -[sub_resource type="RectangleShape2D" id=2] +[sub_resource type="RectangleShape2D" id=7] +extents = Vector2( 4.5, 2 ) + +[sub_resource type="RectangleShape2D" id=9] extents = Vector2( 2, 2 ) -[node name="Eel" type="Node2D" groups=["enemy"]] +[sub_resource type="ShaderMaterial" id=6] +shader = ExtResource( 6 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = false + +[node name="Eel" type="Path2D" groups=["enemy"]] +curve = null script = ExtResource( 1 ) segments = 2 -wave_amplitude = 6.0 -[node name="Path2D" type="Path2D" parent="."] -curve = SubResource( 4 ) +[node name="Hitbox" type="Area2D" parent="." groups=["enemy_hitbox"]] +position = Vector2( 4, 0 ) +z_index = 1 -[node name="PathFollow2D" type="PathFollow2D" parent="Path2D"] -position = Vector2( 8, 0 ) - -[node name="Hitbox" type="Area2D" parent="Path2D/PathFollow2D" groups=["enemy_hitbox"]] -position = Vector2( 7.99424, 0.405511 ) -rotation = 3.14159 -scale = Vector2( 1, -1 ) - -[node name="SegmentStart" type="Position2D" parent="Path2D/PathFollow2D/Hitbox"] -unique_name_in_owner = true -position = Vector2( 12, 0 ) -__meta__ = { -"_gizmo_extents_": 5.0 -} - -[node name="HeadShape" type="CollisionPolygon2D" parent="Path2D/PathFollow2D/Hitbox"] -position = Vector2( 8, 0 ) -polygon = PoolVector2Array( -7, -2, 2, -2, 2, 2, -7, 2 ) - -[node name="HeadSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/HeadShape"] -show_behind_parent = true +[node name="TailShape" type="CollisionShape2D" parent="Hitbox"] position = Vector2( -4, 0 ) +shape = SubResource( 8 ) + +[node name="HeadShape" type="CollisionShape2D" parent="Hitbox"] +position = Vector2( -1.5, 0 ) +shape = SubResource( 7 ) + +[node name="SegmentShape" type="CollisionShape2D" parent="Hitbox"] +unique_name_in_owner = true +position = Vector2( -4, 0 ) +shape = SubResource( 9 ) + +[node name="Head" type="PathFollow2D" parent="." groups=["eel_segment"]] +offset = 8.0 +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Head"] +position = Vector2( 4, 0 ) texture = ExtResource( 2 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/HeadShape"] -position = Vector2( 3, 0 ) +[node name="Border" type="Sprite" parent="Head/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 2 ) -[node name="TailShape" type="CollisionShape2D" parent="Path2D/PathFollow2D/Hitbox"] -position = Vector2( 16, 0 ) -shape = SubResource( 3 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Head"] +position = Vector2( 2.5, 0 ) +remote_path = NodePath("../../Hitbox/HeadShape") -[node name="TailSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/TailShape"] -show_behind_parent = true -position = Vector2( 2, 0 ) +[node name="Tail" type="PathFollow2D" parent="."] +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Tail"] +position = Vector2( -2, 0 ) texture = ExtResource( 4 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/TailShape"] -position = Vector2( -2, 0 ) +[node name="Border" type="Sprite" parent="Tail/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 4 ) -[node name="Segment" type="CollisionShape2D" parent="Path2D/PathFollow2D/Hitbox"] -unique_name_in_owner = true -position = Vector2( 12, 0 ) -shape = SubResource( 2 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Tail"] +remote_path = NodePath("../../Hitbox/TailShape") -[node name="SegmentSprite" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -show_behind_parent = true +[node name="Segment" type="PathFollow2D" parent="."] +offset = 4.0 +cubic_interp = false +lookahead = 0.001 + +[node name="Sprite" type="Sprite" parent="Segment"] texture = ExtResource( 3 ) -[node name="InnerBorder" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -position = Vector2( -2, 0 ) +[node name="Border" type="Sprite" parent="Segment/Sprite"] +material = SubResource( 6 ) z_index = -1 -texture = ExtResource( 5 ) +texture = ExtResource( 3 ) -[node name="InnerBorder2" type="Sprite" parent="Path2D/PathFollow2D/Hitbox/Segment"] -position = Vector2( 3, 0 ) -z_index = -1 -texture = ExtResource( 5 ) +[node name="ShapeTransform" type="RemoteTransform2D" parent="Segment"] +remote_path = NodePath("../../Hitbox/SegmentShape") -[connection signal="area_entered" from="Path2D/PathFollow2D/Hitbox" to="." method="_on_Hitbox_area_entered"] +[connection signal="area_entered" from="Hitbox" to="." method="_on_Hitbox_area_entered"]