Войти
GodotФорумВопросы

Изменение траектории движения объекта при наезде на статичный объект

#0
(Правка: 22:16) 22:15, 3 янв 2023

Я новичок в изучении Godot Engine.
Помните древнюю игру Микромашинс, где маленькие машинки едут по трассе? При наезде на кляксу  масла машинка меняет свою траекторию, её заносит, у неё меняется направление движения, скорость уменьшается.
Как такое реализовать в Godot?
Какие типы объектов выбрать для машинки и для кляксы?

#1
1:57, 4 янв 2023

Чтобы изменить траекторию - берешь и меняешь. Силой, импульсом, или скоростью.
Как конкретно - зависит от того, как ты реализовал всё остальное: 2D / 3D, тайлы/полигоны, rigid/kinematic/vehicle и т.д.

Постарайся задать конкретный вопрос, а не так чтобы это звучало "сделайте мне игру".
На Kids Can Code помнится был туториал 3D топ-даун машинки.

#2
(Правка: 2:06) 2:06, 4 янв 2023

У каждого физ. объекта есть linear velocity и есть его поглотитель (трение). Вот когда машинка попадает в oil, ты просто включаешь другую силу трения (льда) от поверхности машины (по чему едет). Песок, гравий, асфальт и т.д.
Не знаком так глубоко с Godot, поэтому только алгоритм.

#3
4:28, 4 янв 2023

2D.
В Area2D объекте как определить угол вхождения другого объекта чтобы отклонить движение?

#4
6:53, 4 янв 2023

https://habr.com/ru/post/131931/

#5
10:58, 4 янв 2023

dimajak
> 2D.
Чего 2D? Машина как сделана?  Rigid/Kinematic, или вообще без тел?

> В Area2D объекте как определить угол вхождения другого объекта чтобы отклонить движение?

Зачем тебе угол "вхождения"? Под каким углом машина въезжает в лужу совершенно неважно.
Занос происходит из-за разницы направлений скорости (инерция) и направления толкающих колёс.

#6
(Правка: 11:21) 11:06, 4 янв 2023

Der FlugSimulator, Машина сделана KinematicBody2D. Клякса - Area2D. Толкающих колёс нет, это просто спрайт.
Изображение

#7
14:05, 4 янв 2023

dimajak
> Толкающих колёс нет, это просто спрайт.

Спрайт тоже чем-то толкают. Как ты это делаешь, я не знаю.
Я ведь вроде попросил объяснить, что у тебя есть. Мне что тебя, допытывать?
Не буду.

Хотя вот погуглил за тебя.

https://github.com/gururise/Vehicle-Controller-2D

На GDQuest  есть еще.
https://www.youtube.com/watch?v=mJ1ZfGDTMCY

Как будут конкретные вопросы, спрашивай.

#8
22:48, 10 янв 2023

Der FlugSimulator, Движение машинки реализовал изначально по урокам отсюда (Вращение + перемещение).
Пока не понимаю как при наезде на "кляксу" сделать "занос" (сдвинуть объект влево или вправо (рандомно) относительно текущего движения и повернуть объект на небольшой угол относительно текущего движения).
Я не знаю как ещё объяснить. (((
Я правильно выбрал типы объектов?

#9
(Правка: 10:41) 10:38, 11 янв 2023

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Почему это лучше, тут есть простой код без посредников. Всё в одном месте.
Есть инерция и есть торможение (трение).
Также есть сила двигателя и вращение колёс (которое и в 3д) задаёт скорость перемещения, а направление соответственно задаётся колёсами.

Напишите на выходных, если дальше не разберётесь по вашему вопросу.

#10
17:28, 11 янв 2023

dimajak
> Я правильно выбрал типы объектов?

Откуда мне знать. Ты ведь не можешь объяснить, что хочешь. Для скроллера PhysicsBody не нужен, и наоборот.
Ты даже не можешь объяснить, чем не подошли 3 наводки которые я тебе дал, вот Salamandr даже видео с Kids Can Code вставил.

#11
11:16, 14 янв 2023

Salamandr, я реализовал движение, повороты намного проще.

extends KinematicBody2D

export (int) var max_speed = 500
export (int) var speed = 0
export (float) var rot_speed = 1.5

var velocity = Vector2()
var rot_dir = 0
var screen_size # Size of the game window.

func get_input():
  rot_dir = 0
  velocity = Vector2()
  if Input.is_action_pressed('ui_right'):
    rot_dir += 1
  if Input.is_action_pressed('ui_left'):
    rot_dir -= 1
#  if Input.is_action_pressed('down'):
#    velocity = Vector2(-speed, 0).rotated(rotation)
  if Input.is_action_pressed('ui_up'):
    if speed < max_speed:
      speed += 5
      if speed > max_speed:
        speed = max_speed
  else:
    if speed > 0:
      speed -= 10
      if speed < 0:
        speed = 0
    
  velocity = Vector2(speed, 0).rotated(rotation)
  

func check_for_position():
  if position.y > screen_size.y:
    position = Vector2(position.x, 50)
  if position.y < 0:
    position.y = screen_size.y
  if position.x > screen_size.x:
    position.x = 0
  if position.x < 0:
    position.x = screen_size.x

func _physics_process(delta):
  get_input()
  rotation += rot_dir * rot_speed * delta
  var col = move_and_slide(velocity)

func start(pos):
  position = pos
  show()
  $CollisionShape2D.disabled = false


# Called when the node enters the scene tree for the first time.
func _ready():
  screen_size = get_viewport_rect().size
  hide()
GodotФорумВопросы