Added ski-invasion
This commit is contained in:
123
src/player/player.gd
Normal file
123
src/player/player.gd
Normal file
@@ -0,0 +1,123 @@
|
||||
class_name Player
|
||||
extends CharacterBody2D
|
||||
|
||||
var angle : float = 0
|
||||
var breaking : bool = false
|
||||
@export var energy = 0
|
||||
@export var mass = 50
|
||||
|
||||
var score = 0
|
||||
var coin = 0
|
||||
|
||||
var multiplier = 0;
|
||||
|
||||
|
||||
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
|
||||
var carve_angle : float = PI/1.8
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func reset():
|
||||
energy = 0
|
||||
score = 0
|
||||
coin = 0
|
||||
mass = 50
|
||||
angle = 0
|
||||
carve_angle = PI/1.8
|
||||
|
||||
func _physics_process(delta):
|
||||
var direction = get_global_mouse_position()-position
|
||||
var new_angle : float = direction.angle()-PI/2
|
||||
if(new_angle >= PI):
|
||||
new_angle -= 2*PI
|
||||
if(new_angle <= -PI):
|
||||
new_angle += 2*PI
|
||||
|
||||
if(abs(new_angle-angle)>PI/8):
|
||||
new_angle = lerp(angle, new_angle, 0.05)
|
||||
angle = new_angle
|
||||
rotation = angle
|
||||
|
||||
var delta_height = sin(atan(Global.slope)) * sin(angle+PI/2) * delta
|
||||
energy += mass * gravity * delta_height * Global.TILE_SCALE
|
||||
if(energy <= 0): energy = 0
|
||||
|
||||
var speed = sqrt(2*energy/mass)
|
||||
var friction = 0.5* (speed**2) * delta
|
||||
breaking = Input.is_key_pressed(KEY_SPACE)
|
||||
if(Input.is_key_pressed(KEY_SPACE)):
|
||||
friction += max(10* (speed**2) * delta,1.2*1e3)
|
||||
if(angle > 0):
|
||||
rotation -= PI/2
|
||||
else:
|
||||
rotation += PI/2
|
||||
|
||||
energy -= 0.5 * friction**2 / mass
|
||||
if(energy <= 0):
|
||||
energy = 0
|
||||
var f_speed = sqrt(2*energy/mass)
|
||||
var kmh_speed = f_speed*1000 / 3600
|
||||
|
||||
$skin.scale.x = -1 if(angle > 0) else 1
|
||||
$speed.visible = !breaking && kmh_speed > 50
|
||||
$speed.play()
|
||||
$break.visible = breaking && kmh_speed > 15
|
||||
$break.play()
|
||||
$break.position.x = -10 if angle>0 else +10
|
||||
$break.scale.x = -1 if angle>0 else +1
|
||||
|
||||
var new_vy = f_speed * sin(angle+PI/2)
|
||||
var new_vx = f_speed * cos(angle+PI/2)
|
||||
|
||||
velocity.y = new_vy
|
||||
velocity.x = new_vx
|
||||
|
||||
$Control/BotRight/PlayerSpeed.text = "Player: "+ str(int(kmh_speed))+"km/h"
|
||||
$Control/TopLeft/Slope.text = "Slope: "+ str(int(Global.slope*100))+"%"
|
||||
$Control/TopLeft/AvalancheSpeed.text = "Avalanche: "+ str(int(Global.avalanche.kmh_speed))+"km/h"
|
||||
$Control/TopRight/Score.text = "Score: "+str(int(score))
|
||||
$Control/TopRight/Coin.text = "Gold: "+str(int(coin))
|
||||
|
||||
move_and_slide()
|
||||
for i in range(get_slide_collision_count()):
|
||||
var curcol = get_slide_collision(i)
|
||||
if(curcol.get_collider().is_in_group("Enemy")):
|
||||
pass
|
||||
else:
|
||||
var wall_friction = max(2* (speed**2) * delta,1e3)
|
||||
energy -= 0.5 * wall_friction**2 / mass
|
||||
if(energy<0):
|
||||
energy = 0
|
||||
|
||||
func ski_col_side(col_angle):
|
||||
var ski_angle_col = rotation-col_angle-PI/2
|
||||
if(ski_angle_col<0): ski_angle_col += 2*PI
|
||||
|
||||
if(ski_angle_col>(PI/2-carve_angle/2) and ski_angle_col<(PI/2+carve_angle/2)):
|
||||
score += 10
|
||||
multiplier = 2.0;
|
||||
pass
|
||||
elif(ski_angle_col>(3*PI/2-carve_angle/2) and ski_angle_col<(3*PI/2+carve_angle/2)):
|
||||
score += 10
|
||||
multiplier = 2.0
|
||||
pass
|
||||
else:
|
||||
var enemy_hit_friction = 1e4
|
||||
multiplier = 0
|
||||
score += 1
|
||||
energy -= 0.5 * enemy_hit_friction**2 / mass
|
||||
if(energy<0):
|
||||
energy = 0
|
||||
|
||||
func _on_entered(body):
|
||||
if(body.is_in_group("Enemy")):
|
||||
ski_col_side(position.angle_to_point(body.position))
|
||||
coin += 1
|
||||
body.queue_free()
|
||||
|
||||
|
||||
|
||||
func _on_area_entered(area):
|
||||
if(area.is_in_group("Avalanche")):
|
||||
Global.reset()
|
40
src/player/player.tres
Normal file
40
src/player/player.tres
Normal file
@@ -0,0 +1,40 @@
|
||||
[gd_resource type="SpriteFrames" load_steps=6 format=3 uid="uid://buvd4q0n2gvrl"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://dym8shekf5iwk" path="res://res/Tiles/tile_0059.png" id="1_76fyl"]
|
||||
[ext_resource type="Texture2D" uid="uid://ddw26yfxeee8r" path="res://res/Tiles/tile_0070.png" id="1_nltak"]
|
||||
[ext_resource type="Texture2D" uid="uid://dy8y52aq3bp6w" path="res://res/Tiles/tile_0059_b.png" id="1_xhbww"]
|
||||
[ext_resource type="Texture2D" uid="uid://dnpuc4bbohvwp" path="res://res/Tiles/tile_0059_b_f.png" id="2_hcewj"]
|
||||
[ext_resource type="Texture2D" uid="uid://dktejghq82u8d" path="res://res/Tiles/tile_0059_f.png" id="2_yta5k"]
|
||||
|
||||
[resource]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 0.5,
|
||||
"texture": ExtResource("1_xhbww")
|
||||
}, {
|
||||
"duration": 0.5,
|
||||
"texture": ExtResource("2_hcewj")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"break",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 0.5,
|
||||
"texture": ExtResource("1_76fyl")
|
||||
}, {
|
||||
"duration": 0.5,
|
||||
"texture": ExtResource("2_yta5k")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"fast",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": ExtResource("1_nltak")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"player",
|
||||
"speed": 5.0
|
||||
}]
|
98
src/player/player.tscn
Normal file
98
src/player/player.tscn
Normal file
@@ -0,0 +1,98 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://uswmt78bbe3f"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/player/player.gd" id="1_5ri3q"]
|
||||
[ext_resource type="SpriteFrames" uid="uid://buvd4q0n2gvrl" path="res://src/player/player.tres" id="1_h8qmi"]
|
||||
[ext_resource type="LabelSettings" uid="uid://dxx71wu5tfouc" path="res://src/other/label_settings.tres" id="3_8tpu5"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_v1cfh"]
|
||||
size = Vector2(8, 13)
|
||||
|
||||
[node name="Player" type="CharacterBody2D" groups=["Player"]]
|
||||
z_index = 3
|
||||
collision_layer = 2
|
||||
collision_mask = 3
|
||||
wall_min_slide_angle = 1.34565
|
||||
script = ExtResource("1_5ri3q")
|
||||
mass = 60
|
||||
|
||||
[node name="speed" type="AnimatedSprite2D" parent="."]
|
||||
position = Vector2(0, -12)
|
||||
sprite_frames = ExtResource("1_h8qmi")
|
||||
animation = &"fast"
|
||||
|
||||
[node name="break" type="AnimatedSprite2D" parent="."]
|
||||
position = Vector2(10, 0)
|
||||
sprite_frames = ExtResource("1_h8qmi")
|
||||
animation = &"break"
|
||||
|
||||
[node name="skin" type="AnimatedSprite2D" parent="."]
|
||||
sprite_frames = ExtResource("1_h8qmi")
|
||||
animation = &"player"
|
||||
|
||||
[node name="Camera2D" type="Camera2D" parent="."]
|
||||
zoom = Vector2(2, 2)
|
||||
|
||||
[node name="SoftCollider" type="Area2D" parent="." groups=["Player"]]
|
||||
collision_layer = 0
|
||||
collision_mask = 12
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape2D" parent="SoftCollider" groups=["Player"]]
|
||||
position = Vector2(0, 1.5)
|
||||
shape = SubResource("RectangleShape2D_v1cfh")
|
||||
|
||||
[node name="WorldCollisionShape" type="CollisionShape2D" parent="." groups=["Player"]]
|
||||
position = Vector2(0, 1.5)
|
||||
shape = SubResource("RectangleShape2D_v1cfh")
|
||||
|
||||
[node name="Control" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="TopLeft" type="VBoxContainer" parent="Control"]
|
||||
offset_right = 40.0
|
||||
offset_bottom = 40.0
|
||||
|
||||
[node name="Slope" type="Label" parent="Control/TopLeft"]
|
||||
layout_mode = 2
|
||||
text = "10%"
|
||||
label_settings = ExtResource("3_8tpu5")
|
||||
|
||||
[node name="AvalancheSpeed" type="Label" parent="Control/TopLeft"]
|
||||
layout_mode = 2
|
||||
text = "0 km/h"
|
||||
label_settings = ExtResource("3_8tpu5")
|
||||
|
||||
[node name="BotRight" type="VBoxContainer" parent="Control"]
|
||||
anchors_preset = 3
|
||||
anchor_left = 1.0
|
||||
anchor_top = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -55.0
|
||||
offset_top = -40.0
|
||||
grow_horizontal = 0
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="PlayerSpeed" type="Label" parent="Control/BotRight"]
|
||||
layout_mode = 2
|
||||
text = "0 km/h"
|
||||
label_settings = ExtResource("3_8tpu5")
|
||||
|
||||
[node name="TopRight" type="VBoxContainer" parent="Control"]
|
||||
anchors_preset = 1
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
offset_left = -70.0
|
||||
offset_bottom = 40.0
|
||||
grow_horizontal = 0
|
||||
|
||||
[node name="Score" type="Label" parent="Control/TopRight"]
|
||||
layout_mode = 2
|
||||
text = "Score: 0"
|
||||
label_settings = ExtResource("3_8tpu5")
|
||||
|
||||
[node name="Coin" type="Label" parent="Control/TopRight"]
|
||||
layout_mode = 2
|
||||
text = "Coin: 0"
|
||||
label_settings = ExtResource("3_8tpu5")
|
||||
|
||||
[connection signal="area_entered" from="SoftCollider" to="." method="_on_area_entered"]
|
||||
[connection signal="body_entered" from="SoftCollider" to="." method="_on_entered"]
|
Reference in New Issue
Block a user