В Godot 3.0 у меня настроен платформер.Я понял, что с лагом есть проблема, поэтому я спроектировал его так, чтобы куски были уничтожены после того, как они ушли с экрана слева.По большей части враги будут функционировать.Кроме последнего, который будет стрелять снарядами до тех пор, пока он не появится на экране, тогда он будет совершенно неподвижен.Игрок может толкнуть их и тому подобное, но он ничего не сделаетУ всех врагов, блоков и т. Д. Есть метод queue_free (), когда они падают слишком далеко влево или вниз (игра движется вправо).
Извините, я не могу получить видео опроблема в том, что мой компьютер не может запустить одновременно программное обеспечение для записи экрана и игру, если игра не слишком медленная для использования.
Если противник перемещается ближе к центру, чтобы начать, и поэтомусталкивался ранее, работает.Я пытался заставить предметы удалять себя после того, как они упали влево или под экран, это решило ту же проблему на уровне 1, но не на уровне 2.
#Here is my code for my enemies, all pound signs for comments are replaced with // so that stack overflow wouldn't bold them:
extends KinematicBody2D
var playerpos = Vector2(0, 0)
var left = true
var baton = load("res://Items/Baton/Baton.tscn")
var BatPick = load("res://Items/Baton/BatonPickup.tscn")
var shoot_timer = 0.0
var walk_speed = 425
var CollidingWithPlayer = false
var velocity = Vector2(0, 100)
var HP = 10
func _ready():
//Flip player checking raycast back and forth
get_node("Raycast").add_exception(get_node("Area"))
set_physics_process(true)
set_process(true)
pass
//Raycast both sides
func _process(delta):
//die if HP is less than zero and drop the baton
get_node("Raycast").rotate(180)
if HP <= 0:
var pickup = BatPick.instance()
get_tree().get_root().add_child(pickup)
pickup.global_position = global_position
queue_free()
pass
//Check for player in raycast, throw if possible. Move towards it if wouldn't fall
func _physics_process(delta):
shoot_timer = shoot_timer + delta
//Check for player, throw baton if player is in range and 5 seconds or more has passed since it was thrown last
if get_node("Raycast").is_colliding():
var obj = get_node("Raycast").get_collider()
if obj != null and obj.get_name() == "Area":
obj = obj.get_parent()
if obj != null and obj.get_name() == "Player":
CollidingWithPlayer = true
playerpos = obj.global_position
//Throw baton and walk in player's direction if I wouldn't fall
if playerpos.x < global_position.x and shoot_timer >= 1:
left = true
throw_baton()
shoot_timer = 0
get_node("AnimatedSprite").play("WalkingL")
if not (left == true and (not get_node("CheckLeft").is_colliding())) or (left == false and (not get_node("CheckRight").is_colliding())):
velocity.x = -300
move_and_slide(velocity, Vector2(0, -50))
elif playerpos.x > global_position.x and shoot_timer >= 1:
left = false
throw_baton()
shoot_timer = 0
get_node("AnimatedSprite").play("WalkingR")
if not(left == true and (not get_node("CheckLeft").is_colliding())) or (left == false and (not get_node("CheckRight").is_colliding())):
velocity.x = 300
move_and_slide(velocity, Vector2(0, -50))
else:
CollidingWithPlayer = false
get_node("AnimatedSprite").stop()
get_node("AnimatedSprite").frame = 0
else:
CollidingWithPlayer = false
get_node("AnimatedSprite").stop()
get_node("AnimatedSprite").frame = 0
get_node("CheckLeft").force_raycast_update()
get_node("CheckRight").force_raycast_update()
if (left == true and (not get_node("CheckLeft").is_colliding())) or (left == false and (not get_node("CheckRight").is_colliding())):
velocity.x = 0
//delete if fallen
if global_position.y >= 650:
queue_free()
move_and_slide(velocity, Vector2(0, -500))
pass
//Throw baton
func throw_baton():
var projectile = baton.instance()
get_tree().get_root().add_child(projectile)
if left == true:
projectile.global_position = global_position + Vector2(-60, 0)
projectile.velocity = Vector2(-500, 0)
get_tree().get_root().get_node("Baton").rotation_degrees = 180
if left == false:
projectile.global_position = global_position + Vector2(60, 0)
projectile.velocity = Vector2(500, 0)
pass
func take_damage(damage):
HP -= damage
pass
#Here is my code for the parent node that slides the blocks, items, enemies, etc across the board (the camera doesn't move and the player stays within the same "box" as everything moves towards the player):
extends Node2D
const endpos = 99999
var speed = -2.5
func _ready():
get_node("True_Player").endpos = endpos
pass
func _process(delta):
get_node("ALL THE STUFF").move_and_collide(Vector2(speed, 0))
//set if statement to close and execute corresponding file when endpos is reached
pass
#The following code is in everything except the player and enemies so that they are deleted when they fall too far left, the disappear to avoid lag:
if global_position.x < -50:
queue_free()
Враг должен двигаться к игроку, если игрокдостаточно близко и пересекает raycast, и они не упадут.Затем они должны бросить свой снаряд.
В конечном итоге, они бросают снаряд, когда игрок пересекает лучевую передачу, но только до тех пор, пока враг не появится на экране.Это относится только к врагам, с которыми игрок сталкивается примерно на минуту ниже уровня, после чего враги будут функционировать, как и ожидалось.