Cleaned up the Code; reworked the Block Physics
This commit is contained in:
parent
ed9f671256
commit
9f6750b08a
48 changed files with 1237 additions and 1116 deletions
238
scenes/NewBlocks/block.gd
Normal file
238
scenes/NewBlocks/block.gd
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
extends CharacterBody2D
|
||||
|
||||
@onready var partPoints = $PartPoints
|
||||
@onready var partsContainer = $PartsContainer
|
||||
@onready var coyoteTimer = $CoyoteTimer
|
||||
|
||||
|
||||
var part = "res://scenes/NewBlocks/part.tscn"
|
||||
var block1x1 = "res://scenes/NewBlocks/1x1/1x1.tscn"
|
||||
|
||||
|
||||
var coyoteTime = 0.5
|
||||
|
||||
var type = GLOBAL.BLOCKTYPES.LIGHT
|
||||
var expand = false
|
||||
|
||||
@export var id = 0
|
||||
|
||||
var expanding = false
|
||||
|
||||
var stopped = false
|
||||
|
||||
@export var offset = false
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if isCurrent() and not GLOBAL.blockStopped and not stopped:
|
||||
if isBottomColliding():
|
||||
if coyoteTimer.is_stopped():
|
||||
coyoteTimer.start(coyoteTime)
|
||||
if Input.is_action_just_pressed("rotate_left"):
|
||||
rotateBlock(1)
|
||||
elif Input.is_action_just_pressed("rotate_right"):
|
||||
rotateBlock(2)
|
||||
if Input.is_action_just_pressed("left"):
|
||||
|
||||
if not isLeftColliding():
|
||||
global_position.x -= GLOBAL.GRID
|
||||
elif Input.is_action_just_pressed("right"):
|
||||
if not isRightColliding():
|
||||
global_position.x += GLOBAL.GRID
|
||||
if Input.is_action_pressed("down"):
|
||||
velocity = get_gravity() * delta * GLOBAL.SPEED.MAX
|
||||
else:
|
||||
velocity = get_gravity() * delta * GLOBAL.currentSpeed
|
||||
|
||||
|
||||
if is_on_floor():
|
||||
position = position.snapped(Vector2(32,32))
|
||||
|
||||
if isCurrent() and not expanding and not GLOBAL.blockStopped:
|
||||
move_and_slide()
|
||||
else:
|
||||
velocity = Vector2.ZERO
|
||||
|
||||
func expandBlocks():
|
||||
expanding = true
|
||||
scale = Vector2(2,2)
|
||||
position -= Vector2(32,32)
|
||||
snapPosition()
|
||||
for i in range(0,5):
|
||||
if isCollidingBorder():
|
||||
if isCollidingBorder():
|
||||
position.x += GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x += GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x -= GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x -= GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x -= GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x -= GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x += GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.x += GLOBAL.GRID
|
||||
if isCollidingBorder():
|
||||
position.y -= GLOBAL.GRID
|
||||
|
||||
for i in partsContainer.get_children():
|
||||
if i != null:
|
||||
i.removeOverlapp()
|
||||
#splitParts()
|
||||
|
||||
func addParts():
|
||||
for i in partPoints.get_children():
|
||||
var newPart = load(part).instantiate()
|
||||
partsContainer.add_child(newPart)
|
||||
var look = 0
|
||||
if not expand and type == GLOBAL.BLOCKTYPES.HEAVY:
|
||||
look = 1
|
||||
elif expand and not type == GLOBAL.BLOCKTYPES.HEAVY:
|
||||
look = 2
|
||||
elif expand and type == GLOBAL.BLOCKTYPES.HEAVY:
|
||||
look = 3
|
||||
newPart.init(i.position,look)
|
||||
|
||||
func splitParts():
|
||||
for i in $PartsContainer.get_children():
|
||||
var newBlock = load(block1x1).instantiate()
|
||||
get_parent().add_child(newBlock)
|
||||
newBlock.init(i.global_position, expand)
|
||||
newBlock.setColor(modulate)
|
||||
queue_free()
|
||||
|
||||
func setColor(color):
|
||||
modulate = color
|
||||
|
||||
func init(pos, scaler=null):
|
||||
|
||||
if scaler != null:
|
||||
if scaler:
|
||||
expand = scaler
|
||||
#$AnimationPlayer.play("Expand")
|
||||
scale = Vector2(2,2)
|
||||
addParts()
|
||||
id = GLOBAL.getNewID()
|
||||
GLOBAL.currentID = id
|
||||
snapPosition()
|
||||
global_position = pos
|
||||
if offset:
|
||||
snapPosition()
|
||||
|
||||
func setNewID():
|
||||
id = GLOBAL.getNewID()
|
||||
|
||||
func isCurrent():
|
||||
return GLOBAL.currentID == id
|
||||
|
||||
func snapPosition(): #x :bool, y: bool
|
||||
position = position.snapped(Vector2(64,64))
|
||||
|
||||
func rotateBlock(direction):
|
||||
match direction:
|
||||
1:
|
||||
rotation_degrees -= 90
|
||||
for i in partsContainer.get_children():
|
||||
i.rotation_degrees += 90
|
||||
for j in range(0,3):
|
||||
if isColliding():
|
||||
global_position.x -= GLOBAL.GRID
|
||||
if isColliding():
|
||||
global_position.x += GLOBAL.GRID*2
|
||||
if isColliding():
|
||||
global_position.x -= GLOBAL.GRID
|
||||
for s in range(0,3):
|
||||
rotation_degrees -= 90
|
||||
for i in partsContainer.get_children():
|
||||
i.rotation_degrees += 90
|
||||
else:
|
||||
break
|
||||
else:
|
||||
break
|
||||
else:
|
||||
break
|
||||
2:
|
||||
rotation_degrees += 90
|
||||
for i in partsContainer.get_children():
|
||||
i.rotation_degrees -= 90
|
||||
for j in range(0,3):
|
||||
if isColliding():
|
||||
global_position.x -= GLOBAL.GRID
|
||||
if isColliding():
|
||||
global_position.x += GLOBAL.GRID*2
|
||||
if isColliding():
|
||||
global_position.x -= GLOBAL.GRID
|
||||
for s in range(0,3):
|
||||
rotation_degrees += 90
|
||||
for i in partsContainer.get_children():
|
||||
i.rotation_degrees -= 90
|
||||
else:
|
||||
break
|
||||
else:
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
func isLeftColliding():
|
||||
var colliding = false
|
||||
for i in partsContainer.get_children():
|
||||
if i.isLeftColliding():
|
||||
colliding = true
|
||||
return colliding
|
||||
|
||||
func isRightColliding():
|
||||
var colliding = false
|
||||
for i in partsContainer.get_children():
|
||||
if i.isRightColliding():
|
||||
colliding = true
|
||||
return colliding
|
||||
|
||||
func isBottomColliding():
|
||||
var colliding = false
|
||||
for i in partsContainer.get_children():
|
||||
if i.isBottomColliding():
|
||||
colliding = true
|
||||
return colliding
|
||||
|
||||
func isColliding() -> bool:
|
||||
var collided = false
|
||||
for i in get_children():
|
||||
if is_instance_of(i,RayCast2D):
|
||||
i.force_raycast_update()
|
||||
var collider = i.get_collider()
|
||||
if collider != null:
|
||||
if collider.is_in_group("Block"):
|
||||
if collider.id != GLOBAL.currentID:
|
||||
collided = true
|
||||
elif collider.is_in_group("Border"):
|
||||
collided = true
|
||||
return collided
|
||||
|
||||
|
||||
func isCollidingBorder() -> bool:
|
||||
var collided = false
|
||||
for i in get_children():
|
||||
if is_instance_of(i,RayCast2D):
|
||||
i.force_raycast_update()
|
||||
var collider = i.get_collider()
|
||||
if collider != null:
|
||||
if collider.is_in_group("Border"):
|
||||
collided = true
|
||||
return collided
|
||||
|
||||
func _on_animation_player_animation_finished(anim_name: StringName) -> void:
|
||||
if anim_name == "Expand":
|
||||
snapPosition()
|
||||
#position -= Vector2(32,32)
|
||||
splitParts()
|
||||
|
||||
|
||||
func _on_coyote_timer_timeout() -> void:
|
||||
if isBottomColliding():
|
||||
stopped = true
|
||||
GLOBAL.blockStopped = true
|
||||
if expand:
|
||||
expandBlocks()
|
||||
Loading…
Add table
Add a link
Reference in a new issue