Я новичок в изучении Godot Engine.
Помните древнюю игру Микромашинс, где маленькие машинки едут по трассе? При наезде на кляксу масла машинка меняет свою траекторию, её заносит, у неё меняется направление движения, скорость уменьшается.
Как такое реализовать в Godot?
Какие типы объектов выбрать для машинки и для кляксы?
Чтобы изменить траекторию - берешь и меняешь. Силой, импульсом, или скоростью.
Как конкретно - зависит от того, как ты реализовал всё остальное: 2D / 3D, тайлы/полигоны, rigid/kinematic/vehicle и т.д.
Постарайся задать конкретный вопрос, а не так чтобы это звучало "сделайте мне игру".
На Kids Can Code помнится был туториал 3D топ-даун машинки.
У каждого физ. объекта есть linear velocity и есть его поглотитель (трение). Вот когда машинка попадает в oil, ты просто включаешь другую силу трения (льда) от поверхности машины (по чему едет). Песок, гравий, асфальт и т.д.
Не знаком так глубоко с Godot, поэтому только алгоритм.
2D.
В Area2D объекте как определить угол вхождения другого объекта чтобы отклонить движение?
dimajak
> 2D.
Чего 2D? Машина как сделана? Rigid/Kinematic, или вообще без тел?
> В Area2D объекте как определить угол вхождения другого объекта чтобы отклонить движение?
Зачем тебе угол "вхождения"? Под каким углом машина въезжает в лужу совершенно неважно.
Занос происходит из-за разницы направлений скорости (инерция) и направления толкающих колёс.
Der FlugSimulator, Машина сделана KinematicBody2D. Клякса - Area2D. Толкающих колёс нет, это просто спрайт.
dimajak
> Толкающих колёс нет, это просто спрайт.
Спрайт тоже чем-то толкают. Как ты это делаешь, я не знаю.
Я ведь вроде попросил объяснить, что у тебя есть. Мне что тебя, допытывать?
Не буду.
Хотя вот погуглил за тебя.
https://github.com/gururise/Vehicle-Controller-2D
На GDQuest есть еще.
https://www.youtube.com/watch?v=mJ1ZfGDTMCY
Как будут конкретные вопросы, спрашивай.
Der FlugSimulator, Движение машинки реализовал изначально по урокам отсюда (Вращение + перемещение).
Пока не понимаю как при наезде на "кляксу" сделать "занос" (сдвинуть объект влево или вправо (рандомно) относительно текущего движения и повернуть объект на небольшой угол относительно текущего движения).
Я не знаю как ещё объяснить. (((
Я правильно выбрал типы объектов?
Почему это лучше, тут есть простой код без посредников. Всё в одном месте.
Есть инерция и есть торможение (трение).
Также есть сила двигателя и вращение колёс (которое и в 3д) задаёт скорость перемещения, а направление соответственно задаётся колёсами.
Напишите на выходных, если дальше не разберётесь по вашему вопросу.
dimajak
> Я правильно выбрал типы объектов?
Откуда мне знать. Ты ведь не можешь объяснить, что хочешь. Для скроллера PhysicsBody не нужен, и наоборот.
Ты даже не можешь объяснить, чем не подошли 3 наводки которые я тебе дал, вот Salamandr даже видео с Kids Can Code вставил.
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()