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!
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)