Help on making a score board for my multiplayer fighting game

Godot Version

4.3

Question

Hey There! I am trying to make a fighting game like Smash bro’s and Brawlhalla. I am now currently stuck on making a score board which would display the damage percentage of the player and also their Username. I may provide additional context if you guys want. Thanks!

As I know, SilentWolf can do this, I personally haven’t tried it but others on the forum have recommended it.

Just checked it out. It looked really cool. I wonder if it works for “Localhost” kinda multiplayer game tho.

I am going for something like this (Screenshot from Brawlhalla)
image

What part about making a scoreboard are you stuck on? It seems like you have a design in mind. Cound you share your code if that gives you trouble?

This is the character script:

var mousepos: Vector2
var speed = 0.6
var g_hit = 0
var opface: Vector3
var pause = 0
var damage = 0
var facing: Vector3
var movespeed = 0.4
var fast = 0
var you = preload("res://you.tres")
var op = preload("res://opponent.tres")
var hit = false
@onready var mesh = $MeshInstance3D
@onready var spark1 = $hit_spark/GPUParticles3D
@onready var spark2 = $hit_spark/GPUParticles3D2
@onready var board = $"../CanvasLayer/board"

func _ready():
	if not is_multiplayer_authority(): return
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _enter_tree():
	set_multiplayer_authority(str(name).to_int())

func _input(event):
	if not is_multiplayer_authority(): return
	
	#character movement:
	if event is InputEventMouseMotion and pause != 0:
		#just some if statements to limit the speed.
		if event.relative.x >= 200:
			event.relative.x = 199
		elif event.relative.x <= -200:
			event.relative.x = -199
		elif event.relative.y <= -200:
			event.relative.y = -199
		elif event.relative.y >= 200:
			event.relative.y = 199
		if pause > 0:
			event.relative.y = 0
			event.relative.x = 0
			pause -= 1
		velocity.x += event.relative.x*movespeed
		velocity.z += event.relative.y*movespeed
	else:
		pause -= 1
	fast = (abs(velocity.x) + abs(velocity.z))/2
	facing = -transform.basis.z  # Get the forward direction
	move_and_slide()
	rotation.y = lerp_angle(rotation.y, atan2(-velocity.x, -velocity.z), speed)
	velocity *= 0
	#for the collision
	for i in get_slide_collision_count():
		var collision = get_slide_collision(i)
		var push_player = collision.get_collider()
		if fast >= 20 and pause != 0 and not collision.get_collider().is_in_group("level"):
			push_player.recieve_damage.rpc_id(push_player.get_multiplayer_authority(), facing, fast) #fast is the speed of the character. Facing is the direction the player is facing.
			pause = 10 #This would pause the movement of the character after hitting the opponent.

#particle thingy
@rpc ("call_local")
func spark():
	spark1.restart()
	spark1.emitting = true
	spark2.restart()
	spark2.emitting = true
	hit = false


@rpc("any_peer")
func recieve_damage(attacker_facing: Vector3, attacker_speed):
	if attacker_speed > fast:
		damage += 1
		g_hit = 7
		opface = attacker_facing #Makes the opponent store which way you were facing when you hit them.
		hit = true		
	elif attacker_speed < fast:
		g_hit = 3
		opface = attacker_facing

func _physics_process(delta):
	
	if not is_multiplayer_authority():
		mesh.set_surface_override_material(0, op) #Changes your character's color that's all
		return
	else:
		mesh.set_surface_override_material(0,you)
	if not is_on_floor(): #Gravity
		velocity.y -= 1
		move_and_slide()
	if g_hit > 0: #This will be executed if you are hit by the opponent.
		velocity = opface * g_hit * damage
		g_hit -= 1
		move_and_slide()
	if position.y < -10: #Respawn thing
		position.x = 0
		position.y = 0
		position.z = 0
		damage = 0
	if hit == true: #This would execute the particle
		spark.rpc()

The character is completely controlled by the mouse. The speed is based on the DPI.

This is the script I am using for the connections:


@onready var main_menu = $"CanvasLayer/Main Menu"
@onready var address_entry = $"CanvasLayer/Main Menu/MarginContainer/VBoxContainer/address"
@onready var usrname = $"CanvasLayer/Main Menu/MarginContainer/VBoxContainer/usrname"
@onready var board = $CanvasLayer/board

const Player = preload("res://player.tscn")
const PORT = 29737
var enet_peer = ENetMultiplayerPeer.new()

func _on_host_pressed():
	main_menu.hide()
	
	enet_peer.create_server(PORT)
	multiplayer.multiplayer_peer = enet_peer
	multiplayer.peer_connected.connect(add_player)
	multiplayer.peer_disconnected.connect(remove_player)
	add_player(multiplayer.get_unique_id())

func remove_player(peer_id):
	var player = get_node_or_null(str(peer_id))
	if player:
		player.queue_free()
func _on_join_pressed():
	main_menu.hide()
	var base_data = {"Name": usrname.text, "Damage": 0}
	board.data.append(base_data)
	enet_peer.create_client(address_entry.text, PORT)
	multiplayer.multiplayer_peer = enet_peer


func add_player(peer_id):
	var player = Player.instantiate()
	var base_data = {"Name": usrname.text, "Damage": player.damage}
	player.name = str(peer_id)
	board.data.append(base_data)
	add_child(player)
	

I have this attached on the node 3D node.

I haven’t done anything about it yet. I did try some myself but they didn’t work at all.

update:
image
I now have the player list to add a row of name and damage. All I have to do now is to update the values of the UI with name and damage.

script:


@onready var main_menu = $"CanvasLayer/Main Menu"
@onready var address_entry = $"CanvasLayer/Main Menu/MarginContainer/VBoxContainer/address"
@onready var usrname = $"CanvasLayer/Main Menu/MarginContainer/VBoxContainer/usrname"
@onready var board = $CanvasLayer/board

const Player = preload("res://player.tscn")
const Stats = preload("res://status.tscn")
const PORT = 29737
var enet_peer = ENetMultiplayerPeer.new()

func _on_host_pressed():
	main_menu.hide()
	
	enet_peer.create_server(PORT)
	multiplayer.multiplayer_peer = enet_peer
	multiplayer.peer_connected.connect(add_player)
	multiplayer.peer_disconnected.connect(remove_player)
	add_player(multiplayer.get_unique_id())

func remove_player(peer_id):
	var player = get_node_or_null(str(peer_id))
	if player:
		player.queue_free()

func _on_join_pressed():
	main_menu.hide()
	var status = Stats.instantiate()
	board.add_child(status)
	enet_peer.create_client(address_entry.text, PORT)
	multiplayer.multiplayer_peer = enet_peer


func add_player(peer_id):
	var player = Player.instantiate()
	var status = Stats.instantiate()
	var base_data = {"Name": usrname.text, "Damage": player.damage}
	player.name = str(peer_id)
	status.name = str(peer_id)
	board.add_child(status)
	add_child(player)