Compare commits

..

2 Commits

Author SHA1 Message Date
140a97a15a Update README.md 2022-12-06 14:03:36 +01:00
6bc2b07ab6 Start Hitscan & add Crosshair shader 2022-12-06 14:02:22 +01:00
8 changed files with 125 additions and 30 deletions

View File

@@ -1,4 +1,6 @@
# SCOOM (name may be changed) # SCOOM (name may be changed)
Developing a 3D game inspired by Doom64 on Godot 4 engine. Developing a 3D game inspired by Doom64 on Godot 4 engine.
Using:
[Simple-Q3-Controller](https://github.com/fossegutten/Simple-Q3-Controller) by fossegutten [Simple-Q3-Controller](https://github.com/fossegutten/Simple-Q3-Controller) by fossegutten
[CrosshairShader](https://github.com/0xspig/CrosshairShader) by 0xspig

View File

@@ -25,6 +25,5 @@ meshes/lightmap_texel_size=0.2
skins/use_named_skins=true skins/use_named_skins=true
animation/import=true animation/import=true
animation/fps=30 animation/fps=30
animation/trimming=false
import_script/path="" import_script/path=""
_subresources={} _subresources={}

View File

@@ -25,7 +25,6 @@ meshes/lightmap_texel_size=0.2
skins/use_named_skins=true skins/use_named_skins=true
animation/import=true animation/import=true
animation/fps=30 animation/fps=30
animation/trimming=false
import_script/path="" import_script/path=""
_subresources={ _subresources={
"materials": { "materials": {

View File

@@ -0,0 +1,42 @@
shader_type canvas_item;
uniform bool center_enabled = true;
uniform bool legs_enabled = true;
uniform bool inverted = false;
uniform int color_id = 0;
uniform vec4 color_0 = vec4(0., 1, 0., 1.);
uniform vec4 color_1 = vec4(1., 0., 0., 1.);
uniform vec4 color_2 = vec4(0., 0., 1., 1.);
uniform float center_radius = .001;
uniform float width = .001;
uniform float len = .005;
uniform float spacing = .008;
uniform float spread = 1.;
void fragment(){
float a = SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y;
vec2 UVa = vec2(UV.x / a, UV.y);
vec2 center = vec2(.5 / a, .5);
float point = step(distance(UVa, center), center_radius);
float h = step(center.x - len - spacing*spread, UVa.x) - step(center.x - spacing*spread, UVa.x);
h += step(center.x + spacing*spread, UVa.x) - step(center.x + len + spacing*spread, UVa.x);
h *= step(center.y - width, UVa.y) - step(center.y + width, UVa.y);
float v = step(center.y - len - spacing*spread, UVa.y) - step(center.y - spacing*spread, UVa.y);
v += step(center.y + spacing*spread, UVa.y) - step(center.y + len + spacing*spread, UVa.y);
v *= step(center.x - width, UVa.x) - step(center.x + width, UVa.x);
float crosshair;
crosshair = (h+v) * float(legs_enabled) + point * float(center_enabled);
if(!inverted){
COLOR = (color_0 * float(color_id == 0) + color_1 * float(color_id == 1) + color_2 * float(color_id == 2)) * crosshair;
}else{
COLOR = vec4((cos(textureLod(SCREEN_TEXTURE, SCREEN_UV, 0.0).rgb * 3.1415926534) + 1.)/2., 1.) * crosshair;
}
}

View File

@@ -97,6 +97,11 @@ wheel_down={
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"pressed":false,"double_click":false,"script":null) "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"pressed":false,"double_click":false,"script":null)
] ]
} }
reload={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"unicode":0,"echo":false,"script":null)
]
}
[physics] [physics]

View File

@@ -1,10 +1,26 @@
[gd_scene load_steps=4 format=3 uid="uid://bl7jynld7s25o"] [gd_scene load_steps=6 format=3 uid="uid://bl7jynld7s25o"]
[ext_resource type="Script" path="res://scripts/player/PlayerQ3.gd" id="1"] [ext_resource type="Script" path="res://scripts/player/PlayerQ3.gd" id="1"]
[ext_resource type="Script" path="res://scripts/player/Weapons.gd" id="2_dl1i1"] [ext_resource type="Script" path="res://scripts/player/Weapons.gd" id="2_dl1i1"]
[ext_resource type="Shader" path="res://assets/shader/crosshair.gdshader" id="3_3vnqi"]
[sub_resource type="CylinderShape3D" id="1"] [sub_resource type="CylinderShape3D" id="1"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_mqdp4"]
shader = ExtResource("3_3vnqi")
shader_parameter/center_enabled = null
shader_parameter/center_radius = null
shader_parameter/color_0 = null
shader_parameter/color_1 = null
shader_parameter/color_2 = null
shader_parameter/color_id = null
shader_parameter/inverted = null
shader_parameter/legs_enabled = null
shader_parameter/len = null
shader_parameter/spacing = null
shader_parameter/spread = null
shader_parameter/width = null
[node name="PlayerQ3" type="CharacterBody3D"] [node name="PlayerQ3" type="CharacterBody3D"]
script = ExtResource("1") script = ExtResource("1")
@@ -19,8 +35,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0)
[node name="Hand" type="Node3D" parent="Body/Head"] [node name="Hand" type="Node3D" parent="Body/Head"]
script = ExtResource("2_dl1i1") script = ExtResource("2_dl1i1")
sway_left = Vector3(0, 0.1, 0)
sway_right = Vector3(0, -0.1, 0) [node name="ColorRect" type="ColorRect" parent="Body/Head/Hand"]
material = SubResource("ShaderMaterial_mqdp4")
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Camera3D" type="Camera3D" parent="Body/Head"] [node name="Camera3D" type="Camera3D" parent="Body/Head"]
current = true current = true
[node name="AimCast" type="RayCast3D" parent="Body/Head/Camera3D"]
target_position = Vector3(0, 0, -1)

View File

@@ -8,8 +8,6 @@ const RELOAD = 3
const DRAW_TIME = 0.35 const DRAW_TIME = 0.35
#TODO: Load gun config from file
var MAX_CLIP : int var MAX_CLIP : int
var DAMAGE : float var DAMAGE : float
var MOMENTUM : Vector2 var MOMENTUM : Vector2
@@ -20,10 +18,12 @@ var DRAW_POS : Vector3
var DRAW_ROT : Vector3 var DRAW_ROT : Vector3
var MODEL : Node3D var MODEL : Node3D
var FIREMODE : int var FIREMODE : int
var HITSCAN : bool
var RAY_LEN : float = 1000
var SHOOTING_SPEED: float var SHOOTING_SPEED: float
var can_shoot : bool var can_shoot : bool
var clip = 444444 var clip : int
var state = DEFAULT var state = DEFAULT
func init(): func init():
@@ -51,7 +51,7 @@ func InitialPos():
func Shoot(): func Shoot():
if clip > 0 && state == INITIAL && can_shoot: if CanShoot():
if !FIREMODE: if !FIREMODE:
can_shoot = false can_shoot = false
clip -= 1 clip -= 1
@@ -68,6 +68,9 @@ func Shoot():
return true return true
return false return false
func CanShoot():
return clip > 0 && state == INITIAL && can_shoot
func Release(): func Release():
if !FIREMODE: if !FIREMODE:
can_shoot = true can_shoot = true
@@ -75,7 +78,7 @@ func Release():
func Reload(): func Reload():
if(clip < MAX_CLIP && state == INITIAL): if(clip < MAX_CLIP && state == INITIAL):
state = RELOAD #state = RELOAD
clip = MAX_CLIP
return true return true
return false return false

View File

@@ -9,6 +9,7 @@ const BOB = 1
var state = 0 var state = 0
@onready var player_root = get_node("../../../../PlayerQ3") as CharacterBody3D @onready var player_root = get_node("../../../../PlayerQ3") as CharacterBody3D
@onready var raycast = get_node("../Camera3D/AimCast") as RayCast3D
var weapons = [] var weapons = []
@@ -27,19 +28,14 @@ var file_data = {
"RECOIL_COOLDOWN": 0.35, "RECOIL_COOLDOWN": 0.35,
"RPM": 120, "RPM": 120,
"DRAW_POS": Vector3(0,-0.5,-0.3), "DRAW_POS": Vector3(0,-0.5,-0.3),
"DRAW_ROT": Vector3(1.3, 0, 0) "DRAW_ROT": Vector3(1.3, 0, 0),
"HITSCAN": true
} }
} }
var mouse_mov : Vector3 var mouse_mov : Vector3
var sway_threshold = 5
var sway_lerp = 5 var sway_lerp = 5
@export var sway_left : Vector3
@export var sway_right : Vector3
@export var sway_normal : Vector3
func _ready(): func _ready():
save_data(file_data) save_data(file_data)
load_data() load_data()
@@ -50,12 +46,17 @@ func _ready():
var resource = "res://scenes/weapons/" + file_data[i].MODEL + ".tscn" var resource = "res://scenes/weapons/" + file_data[i].MODEL + ".tscn"
var weapon_model_resource = load(resource) var weapon_model_resource = load(resource)
var weapon_model = weapon_model_resource.instantiate() var weapon_model = weapon_model_resource.instantiate()
#Set Weapon nodes
root.add_child(weapon_model) root.add_child(weapon_model)
root.position = file_data[i].HAND_POS root.position = file_data[i].HAND_POS
root.rotation = file_data[i].HAND_ROT root.rotation = file_data[i].HAND_ROT
root.hide() root.hide()
add_child(root) add_child(root)
#Set Weapon Data
root.MAX_CLIP = file_data[i].MAX_CLIP root.MAX_CLIP = file_data[i].MAX_CLIP
root.clip = root.MAX_CLIP
root.DAMAGE = file_data[i].DAMAGE root.DAMAGE = file_data[i].DAMAGE
root.MOMENTUM = file_data[i].MOMENTUM root.MOMENTUM = file_data[i].MOMENTUM
root.ANGULAR_MOMENTUM = file_data[i].ANGULAR_MOMENTUM root.ANGULAR_MOMENTUM = file_data[i].ANGULAR_MOMENTUM
@@ -64,8 +65,14 @@ func _ready():
root.MODEL = root.get_node(file_data[i].MODEL) root.MODEL = root.get_node(file_data[i].MODEL)
root.DRAW_POS = file_data[i].DRAW_POS root.DRAW_POS = file_data[i].DRAW_POS
root.DRAW_ROT = file_data[i].DRAW_ROT root.DRAW_ROT = file_data[i].DRAW_ROT
root.HITSCAN = file_data[i].HITSCAN
if(not root.HITSCAN):
print("Projectile stats")
weapons.append(root) weapons.append(root)
weapons[current_weapon].init() weapons[current_weapon].init()
raycast.target_position.z = -weapons[current_weapon].RAY_LEN
func _input(event): func _input(event):
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
@@ -75,21 +82,31 @@ func _input(event):
func _unhandled_input(_event): func _unhandled_input(_event):
if weapons.size() > 1 && Input.is_action_just_released("wheel_up"): if weapons.size() > 1 && Input.is_action_just_released("wheel_up"):
weapons[current_weapon].hide() ChangeWeapon((current_weapon + 1) % weapons.size())
current_weapon = (current_weapon + 1) % weapons.size()
weapons[current_weapon].init()
if weapons.size() > 1 && Input.is_action_just_released("wheel_down"): if weapons.size() > 1 && Input.is_action_just_released("wheel_down"):
weapons[current_weapon].hide() ChangeWeapon((current_weapon - 1) % weapons.size())
current_weapon = (current_weapon - 1) % weapons.size()
weapons[current_weapon].init()
if Input.is_action_just_pressed("reload"):
weapons[current_weapon].Reload()
func ChangeWeapon(i):
weapons[current_weapon].hide()
current_weapon = (i)
weapons[current_weapon].init()
raycast.target_position.z = -weapons[current_weapon].RAY_LEN
var time = 0 var time = 0
func _process(delta): func _process(delta):
if Input.is_action_pressed("shoot"): if Input.is_action_pressed("shoot") && weapons[current_weapon].Shoot():
weapons[current_weapon].Shoot() if(weapons[current_weapon].HITSCAN):
HitScan()
else:
Projectile()
if Input.is_action_just_released("shoot"): if Input.is_action_just_released("shoot"):
weapons[current_weapon].Release() weapons[current_weapon].Release()
#SWAY #SWAY
if mouse_mov != null && mouse_mov.length() > 0: if mouse_mov != null && mouse_mov.length() > 0:
weapons[current_weapon].MODEL.rotation = weapons[current_weapon].MODEL.rotation.lerp(mouse_mov, sway_lerp * delta) weapons[current_weapon].MODEL.rotation = weapons[current_weapon].MODEL.rotation.lerp(mouse_mov, sway_lerp * delta)
@@ -104,12 +121,15 @@ func _process(delta):
position.y = bobOscillate position.y = bobOscillate
bobOscillate = sin(time * 4 * (PI) + PI/4) * 0.015 bobOscillate = sin(time * 4 * (PI) + PI/4) * 0.015
position.x = bobOscillate position.x = bobOscillate
#else:
#position = lerp(position, Vector3.ZERO, )
func HitScan():
if(raycast.is_colliding()):
var target = raycast.get_collider()
print("Hit target ", target.name)
func Projectile():
pass
func save_data(data): func save_data(data):
var file = FileAccess.open(CONFIG_PATH, FileAccess.WRITE) var file = FileAccess.open(CONFIG_PATH, FileAccess.WRITE)