MohanDev
MohanDev

Reputation: 25

Why i am not able to make a projectile weapon using GDScript in Godot

I want to make a projectile weapon with GDScript but I am getting the error:

the function " _physics _process " already exists in this class (at line 35)

I cannot delete the line of code which has the error as if I do so I will not be able to make my FPS controller character move

here is the the code:

extends KinematicBody

var speed = 9
const ACCEL_DEFAULT = 7
const ACCEL_AIR = 1
onready var accel = ACCEL_DEFAULT
var gravity = 9.8
var jump = 4
var damage = 100

var cam_accel = 40
var mouse_sense = 0.1
var snap

var direction = Vector3()
var velocity = Vector3()
var gravity_vec = Vector3()
var movement = Vector3()

onready var head = $Head
onready var camera = $Head/Camera
onready var bullet = preload("res://player/world/bullet/bullet.tscn")
onready var muzzle = $Head/Gun/Muzzle
func _ready():
    #hides the cursor
    Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _input(event):
    
    if event is InputEventMouseMotion:
        rotate_y(deg2rad(-event.relative.x * mouse_sensitivity)) 
        head.rotate_x(deg2rad(-event.relative.y * mouse_sensitivity)) 
        head.rotation.x = clamp(head.rotation.x, deg2rad(-90), deg2rad(90))

func _physics_process(delta):
    
    direction = Vector3()
    
    if Input.is_action_just_pressed("fire"):
        if aimcast.is_colliding():
            var b = bullet.instance()
            muzzle.add_child(b)
            b.look_at(aimcast.get_collision_point(), Vector3.UP)
            b.shoot = true
    

func _process(delta):
    #camera physics interpolation to reduce physics jitter on high refresh-rate monitors
    if Engine.get_frames_per_second() > Engine.iterations_per_second:
        camera.set_as_toplevel(true)
        camera.global_transform.origin = camera.global_transform.origin.linear_interpolate(head.global_transform.origin, cam_accel * delta)
        camera.rotation.y = rotation.y
        camera.rotation.x = head.rotation.x
    else:
        camera.set_as_toplevel(false)
        camera.global_transform = head.global_transform
    
    # this is the line of code which is causing the error
(
func _physics_process(delta):
    #get keyboard input
    direction = Vector3.ZERO
    var h_rot = global_transform.basis.get_euler().y
    var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
    var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
    direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
    
    #jumping and gravity
    if is_on_floor():
        snap = -get_floor_normal()
        accel = ACCEL_DEFAULT
        gravity_vec = Vector3.ZERO
    else:
        snap = Vector3.DOWN
        accel = ACCEL_AIR
        gravity_vec += Vector3.DOWN * gravity * delta
        
    if Input.is_action_just_pressed("jump") and is_on_floor():
        snap = Vector3.ZERO
        gravity_vec = Vector3.UP * jump
    
    #make it move
    velocity = velocity.linear_interpolate(direction * speed, accel * delta)
    movement = velocity + gravity_vec
    
    move_and_slide_with_snap(movement, snap, Vector3.UP)  )

Upvotes: 1

Views: 272

Answers (1)

Theraot
Theraot

Reputation: 40285

The error:

"_physics_process" already exists in this class

Is telling you that you have _physics_process twice in your script. You can only have one.

This is the first one:

func _physics_process(delta):
   
   direction = Vector3()
   
   if Input.is_action_just_pressed("fire"):
       if aimcast.is_colliding():
           var b = bullet.instance()
           muzzle.add_child(b)
           b.look_at(aimcast.get_collision_point(), Vector3.UP)
           b.shoot = true

This is the second one:

func _physics_process(delta):
   #get keyboard input
   direction = Vector3.ZERO
   var h_rot = global_transform.basis.get_euler().y
   var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
   var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
   direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
   
   #jumping and gravity
   if is_on_floor():
       snap = -get_floor_normal()
       accel = ACCEL_DEFAULT
       gravity_vec = Vector3.ZERO
   else:
       snap = Vector3.DOWN
       accel = ACCEL_AIR
       gravity_vec += Vector3.DOWN * gravity * delta
       
   if Input.is_action_just_pressed("jump") and is_on_floor():
       snap = Vector3.ZERO
       gravity_vec = Vector3.UP * jump
   
   #make it move
   velocity = velocity.linear_interpolate(direction * speed, accel * delta)
   movement = velocity + gravity_vec
   
   move_and_slide_with_snap(movement, snap, Vector3.UP)

I'm guessing you want both. So merge them into a single one with the code from both:

func _physics_process(delta):
   
   direction = Vector3()
   
   if Input.is_action_just_pressed("fire"):
       if aimcast.is_colliding():
           var b = bullet.instance()
           muzzle.add_child(b)
           b.look_at(aimcast.get_collision_point(), Vector3.UP)
           b.shoot = true

   #get keyboard input
   direction = Vector3.ZERO
   var h_rot = global_transform.basis.get_euler().y
   var f_input = Input.get_action_strength("move_backwards") - Input.get_action_strength("move_forward")
   var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
   direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
   
   #jumping and gravity
   if is_on_floor():
       snap = -get_floor_normal()
       accel = ACCEL_DEFAULT
       gravity_vec = Vector3.ZERO
   else:
       snap = Vector3.DOWN
       accel = ACCEL_AIR
       gravity_vec += Vector3.DOWN * gravity * delta
       
   if Input.is_action_just_pressed("jump") and is_on_floor():
       snap = Vector3.ZERO
       gravity_vec = Vector3.UP * jump
   
   #make it move
   velocity = velocity.linear_interpolate(direction * speed, accel * delta)
   movement = velocity + gravity_vec
   
   move_and_slide_with_snap(movement, snap, Vector3.UP)

That should solve the error at hand. I haven't look deeper into the code for any other possible problems.

Upvotes: 1

Related Questions