Parcourir la source

adding ECS to enemies

galo il y a 2 ans
Parent
commit
cb7885207d
7 fichiers modifiés avec 108 ajouts et 82 suppressions
  1. 0 24
      Client.gd
  2. 3 18
      Server.gd
  3. 1 0
      enemie/monster.tscn
  4. 15 15
      enemiessprite.gd
  5. 18 16
      main.tscn
  6. 4 2
      playerphysics.gd
  7. 67 7
      spawner.gd

+ 0 - 24
Client.gd

@@ -93,16 +93,6 @@ func reconstruct_int16(bytetest):
 var argbuffer
 var posbuffer
 
-#remote func enemies_position(arg):
-#	if not has_node('enemies'): return
-#	for i in $enemies.get_children():
-#		i.hide()
-#	for id in arg.keys().size():
-#		var node = $enemies.get_child(id)
-#		node.global_position = arg[arg.keys()[id]][0]
-#		node.animation = arg[arg.keys()[id]][1]
-#		node.show()
-
 remote func enemies_position_2(arg):
 	if not has_node('enemies'): return
 	for i in $enemies.get_children():
@@ -119,22 +109,8 @@ remote func enemies_position_2(arg):
 
 remote func attack_anim(arg, id):
 	if not has_node("players"): return
-#	for i in $players.get_children():
-#		print(i.name)
 	$players.get_node(str(id)).get_node('weapon/AnimationPlayer').play(arg)
 
 remote func atr_update(arg):
-#	var arg1 = 'player1'
-#	player_atributes[arg1] = arg
-#	print(arg)
 	if has_node('Hud/HBoxContainer/'+arg.keys()[0]):
 		get_node('Hud/HBoxContainer/'+arg.keys()[0])._update(arg.values()[0])
-	
-
-#onready var player_atributes = {'player1':default_atributes.duplicate()}
-#var default_atributes = {
-#	'xp':0,
-#	'hp':0,
-#	'name':'player1',
-#	'k':0,
-#}

+ 3 - 18
Server.gd

@@ -38,7 +38,6 @@ func makedummmy():
 
 remote func send_clients():
 	rpc_id(api.get_rpc_sender_id(), 'client_data', custom_multiplayer.get_network_connected_peers())
-
 # extra
 
 func disc(arg):
@@ -51,7 +50,6 @@ remote func input_handler(arg):
 	var id = api.get_rpc_sender_id()
 	if $players.has_node(str(id)):
 		$players.get_node(str(id)).input = arg
-#	rpc_id(id, 'returnping', arg)
 
 var tick = 0
 export var tickrate = 3
@@ -67,26 +65,13 @@ func _physics_process(delta):
 		animation_datachunk[i.name] = i.animation
 	rpc_id(0, 'player_animation', animation_datachunk)
 	
-#	var enemies_datachunk = {}
-#	for i in $enemies.get_children():
-#		enemies_datachunk[i.name] = [i.global_position, i.type]
-#	rpc_id(0, 'enemies_position', enemies_datachunk)
 	tick += 1
 	if fmod(tick,tickrate) == 0:
 		var enemies_datachunk = PoolByteArray()
-		for i in $enemies.get_children():
-			enemies_datachunk.append_array( return_int16(i.global_position.x) )
-			enemies_datachunk.append_array( return_int16(i.global_position.y) )
+		for i in $enemies.dict.arraypos:
+			enemies_datachunk.append_array( return_int16(i.x) )
+			enemies_datachunk.append_array( return_int16(i.y) )
 		rpc_unreliable_id(0, 'enemies_position_2', enemies_datachunk)
-#		for i in $players.get_children():
-#			if not i.is_in_group('dummy'):
-#				rpc_unreliable_id(int(i.name), 'enemies_position_2', enemies_datachunk)
-#		if not couch:
-#		rpc_unreliable_id(0, 'enemies_position_2', enemies_datachunk)
-#		else:
-#			for i in get_tree().get_nodes_in_group('client'):
-#				funcref(i,'enemies_position_2').call_funcv([enemies_datachunk])
-#export var couch = false
 
 func return_int16(number):
 	var int16 = number + 32768

+ 1 - 0
enemie/monster.tscn

@@ -1,3 +1,4 @@
 [gd_scene format=2]
 
 [node name="monster" type="Sprite"]
+visible = false

+ 15 - 15
enemiessprite.gd

@@ -1,23 +1,23 @@
 extends Node
 
-
-# Declare member variables here. Examples:
-# var a = 2
-# var b = "text"
 var sprite = preload('res://enemie/monster.tscn')
 
-# Called when the node enters the scene tree for the first time.
 func _ready():
-	for i in 4096:
+	for i in 2048:
 		var add= sprite.instance()
-#		add.texture = get_node('../../Textures').dict['Goblin1']
-		var array = ['Goblin1','Goblin2','Goblin3','Goblin4']
-		array.shuffle()
-		add.texture = get_node('../../Textures').dict[array[0]]
+		add.texture = get_node('../../Textures').dict['Goblin1']
+		add.z_index = 1
+		add_child(add)
+		add= sprite.instance()
+		add.texture = get_node('../../Textures').dict['Goblin2']
+		add.z_index = 2
+		add_child(add)
+		add= sprite.instance()
+		add.texture = get_node('../../Textures').dict['Goblin3']
+		add.z_index = 3
+		add_child(add)
+		add= sprite.instance()
+		add.texture = get_node('../../Textures').dict['Goblin4']
+		add.z_index = 4
 		add_child(add)
 	pass # Replace with function body.
-
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-#func _process(delta):
-#	pass

+ 18 - 16
main.tscn

@@ -12,31 +12,31 @@
 [ext_resource path="res://art/Untitledcxz.png" type="Texture" id=10]
 [ext_resource path="res://Textures.gd" type="Script" id=11]
 
-[sub_resource type="AtlasTexture" id=2]
+[sub_resource type="AtlasTexture" id=1]
 atlas = ExtResource( 10 )
 region = Rect2( 0, 0, 112, 113 )
 
-[sub_resource type="AtlasTexture" id=3]
+[sub_resource type="AtlasTexture" id=2]
 atlas = ExtResource( 10 )
 region = Rect2( 112, 0, 112, 113 )
 
-[sub_resource type="AtlasTexture" id=4]
+[sub_resource type="AtlasTexture" id=3]
 atlas = ExtResource( 10 )
 region = Rect2( 224, 0, 112, 113 )
 
-[sub_resource type="AtlasTexture" id=5]
+[sub_resource type="AtlasTexture" id=4]
 atlas = ExtResource( 10 )
 region = Rect2( 336, 0, 112, 113 )
 
-[sub_resource type="SpriteFrames" id=6]
+[sub_resource type="SpriteFrames" id=5]
 animations = [ {
-"frames": [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ) ],
+"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ) ],
 "loop": true,
 "name": "default",
 "speed": 5.0
 } ]
 
-[sub_resource type="GDScript" id=1]
+[sub_resource type="GDScript" id=6]
 script/source = "extends Node
 
 var enabled = false
@@ -67,8 +67,8 @@ transparent_bg = true
 render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin1"]
-frames = SubResource( 6 )
-frame = 3
+frames = SubResource( 5 )
+frame = 1
 playing = true
 offset = Vector2( 32, 32 )
 
@@ -79,8 +79,8 @@ transparent_bg = true
 render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin2"]
-frames = SubResource( 6 )
-frame = 2
+frames = SubResource( 5 )
+frame = 1
 speed_scale = 0.8
 playing = true
 offset = Vector2( 32, 32 )
@@ -92,8 +92,8 @@ transparent_bg = true
 render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin3"]
-frames = SubResource( 6 )
-frame = 2
+frames = SubResource( 5 )
+frame = 3
 speed_scale = 1.2
 playing = true
 offset = Vector2( 32, 32 )
@@ -105,7 +105,8 @@ transparent_bg = true
 render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin4"]
-frames = SubResource( 6 )
+frames = SubResource( 5 )
+frame = 3
 speed_scale = 0.9
 playing = true
 offset = Vector2( 32, 32 )
@@ -119,8 +120,9 @@ tickrate = 4
 
 [node name="enemies" type="Node" parent="Server"]
 script = ExtResource( 6 )
-wave_num = 64
+wave_num = 256
 spawn_speed = 1
+limit = 3072
 
 [node name="dmgbox" type="Node" parent="Server"]
 
@@ -167,7 +169,7 @@ __meta__ = {
 script = ExtResource( 1 )
 
 [node name="Input" type="Node" parent="Client2"]
-script = SubResource( 1 )
+script = SubResource( 6 )
 
 [node name="Database" type="Node" parent="."]
 script = ExtResource( 3 )

+ 4 - 2
playerphysics.gd

@@ -16,8 +16,9 @@ var vida = 10000
 
 func damage(arg, id):
 	vida += arg
-	get_node('../..').hp_update(vida, name)
-	if vida <= 0: queue_free()
+	if vida <= 0: 
+		get_node('../..').hp_update(vida, name)
+		queue_free()
 
 var sidebuffer = true
 
@@ -31,6 +32,7 @@ func melee():
 		get_node('../..').player_anim('melee',name)
 
 func _physics_process(delta):
+	get_node('../..').hp_update(vida, name)
 	if motion.x != 0: sidebuffer = motion.x > 0
 	for i in attacks:
 		funcref(self,i).call_func()

+ 67 - 7
spawner.gd

@@ -5,20 +5,80 @@ export var wave_num = 10
 export var spawn_speed = 10
 export var limit = 1024
 
+var dict = {
+	"arraypos":[],
+	"arrayvida":[],
+	"arraytype":[],
+	"arraytarget":[],
+	"arraymotion":[],
+	"arraydirtime":[],
+}
+
 func _ready():
 	yield(get_tree().create_timer(1.0),"timeout")
 	while true:
-		if get_child_count() < limit:
-			for x in clamp(limit-get_child_count(),0,wave_num):
-				var instance = enemy.instance()
+		if dict.arraypos.size() < limit:
+			for x in clamp(limit-dict.arraypos.size(),0,wave_num):
 				var rot = rand_range(-PI,PI)
-				instance.global_position = Vector2(sin(rot), cos(rot)) * 640
-				add_child(instance)
-		print('there is a total of: ' + str(get_child_count()) +' enemmies')
+				var pos = Vector2(sin(rot), cos(rot)) * 640
+				var vida = 100
+				var array = get_node('../players').get_children()
+				array.shuffle()
+				if array.size() > 0:
+					dict.arraytarget.append(array[0])
+				
+				dict.arraypos.append(pos)
+				dict.arrayvida.append(vida)
+				dict.arraytype.append('goblin')
+				
+				dict.arraymotion.append(Vector2.ZERO)
+				dict.arraydirtime.append(int(rand_range(60,120)))
+				
+		print('there is a total of: ' + str(dict.arraypos.size()) +' enemmies')
 		yield(get_tree().create_timer(spawn_speed),"timeout")
 
-var counter = 0
+var motion = Vector2()
+var speed = 2.3
+var tick = 0
+export var tickrate = 4
+
+func _physics_process(delta):
+
+#setting tickrate, to reduce executions per second
+	tick += 1
+	if fmod(tick,tickrate) == 0:
+
+#dict of aprox positions of players
+		var blockmap = {}
+		if get_node('../players').get_child_count() == 0: return
+		for z in get_node('../players').get_children():
+			var x = int(z.global_position.x/20)
+			var y = int(z.global_position.y/20)
+			blockmap[Vector2(x,y)] = z
 
+#yes this abomination controls the enemies, ECS code looks ugly as fuck in this engine
+		for i in dict.arraypos.size():
+
+#picking new targets if the last one is invalid
+			if dict.arraytarget[i] == null:
+				if get_node('../players').get_child_count() == 0: return
+				var array = get_node('../players').get_children()
+				array.shuffle()
+				if array.size() > 0:
+					dict.arraytarget[i] = array[0]
+
+#exclusive movmenet code
+			if fmod(tick, dict.arraydirtime[i]) == 0:
+				dict.arraymotion[i] = (dict.arraytarget[i].global_position - dict.arraypos[i]).normalized() * speed
+			dict.arraypos[i] += dict.arraymotion[i]
+
+# enemy attak on players
+			var x = int(dict.arraypos[i].x/20)
+			var y = int(dict.arraypos[i].y/20)
+			if blockmap.has(Vector2(x,y)):
+				blockmap[Vector2(x,y)].damage( -0.5, '')
+
+var counter = 0
 var score = {}
 
 func death_count(id):