[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум Panda3D - по русски » Общий форум » Проекты » ForwardOnly: стратегический рогалик с отрытым кодом
ForwardOnly: стратегический рогалик с отрытым кодом
serg-kkzДата: Пятница, 27.05.2022, 23:26 | Сообщение # 16
Генерал-лейтенант
Группа: Модераторы
Сообщений: 777
Награды: 3
Репутация: 18
Статус: Offline
Приятно видеть как двигается в перед твоя игра, глядя на папку с ресурсами, видно что было произведено большое количество интересного контента. Однако проблема с фризами при скролле уровня ни куда не делась, если уж переходит к коммерции, то думаю с этим нужно явно разобраться. Возможно даже проблема кроется в частицах дыма локомотива, думаю стоит попробовать в следующем релизе сделать это опционально. А если даже дело в не этом, то нужно искать и еще раз искать.

ООП  -  
 
gurovilya9Дата: Суббота, 28.05.2022, 09:37 | Сообщение # 17
Рядовой
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 4
Статус: Offline
serg-kkz, большое спасибо!

Я думаю, там не фризы, а момент переключения между двумя MotionPath. Мир состоит из блоков, каждый блок длится где-то 4.2 сек (если на максимальной скорости ехать). И на каждом блоке свой MotionPath. Да, я всё ещё думаю, что с этим делать. Вероятно, укоротить их надо, потому что сейчас они один-в-один. Получается, при переключении блоков паровоз на одной точке (конец первого path и начало следующего) задерживается на два кадра. На следующий релиз попробую.

На поворотах MotionPath ещё и неравномерные - поезд ускоряться начинает. Тоже пока нерешённая проблема.

Да ну-у-у-у, коммерция  smile  Я удивляюсь, что вообще кто-то подписывается. Игра-то простенькая, совсем кустарная.
 
serg-kkzДата: Суббота, 28.05.2022, 16:30 | Сообщение # 18
Генерал-лейтенант
Группа: Модераторы
Сообщений: 777
Награды: 3
Репутация: 18
Статус: Offline
Я давно заметил что весь модуль direct написан на скорую руку и с кучей всякого родя сюрпризов. Возможно MotionPath использует формулу для получения времени на каждый сегмент пути поэтому время прохождения меняется. Я думаю для собственных задач лучше писать свои решения, так как весь путь строится из массива векторов, то не сложно реализовать что то вроде этого.

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import Vec3

class MyApp(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)

        # Просто визуализация точек.
        self.p0 = base.loader.load_model("models/smiley")
        self.p0.set_pos(Vec3(0, -10, 0))
        self.p0.reparent_to(render)

        self.p1 = base.loader.load_model("models/smiley")
        self.p1.set_pos(Vec3(10, 0, 0))
        self.p1.reparent_to(render)
        
        self.p2 = base.loader.load_model("models/smiley")
        self.p2.set_pos(Vec3(0, 50, 0))
        self.p2.reparent_to(render)

        # Тумблер переключения, нужен для однократной смены точки.
        self.lever = False

        # Путь описывается точками по которым движется объект в виде векторов.
        self.path = [Vec3(0, -10, 0), Vec3(10, 0, 0), Vec3(0, 50, 0)]

        # Скорость движения.
        self.speed = 15

        # Собственно сам объект.
        self.obj = base.loader.load_model("models/smiley")
        self.obj.set_pos(0, 50, 0)
        self.obj.reparent_to(render)

        # Установим изначальный вектор направления.
        self.current_vector = self.path[0] - self.obj.get_pos()

        base.taskMgr.add(self.move, "move")

        # Счетчик секвенции.
        self.step = 0

    def move(self, task):
        # Время прошедшее за кадр.
        dt = base.clock.dt
        # Текущая позиция объекта.
        obj_pos = self.obj.get_pos()
        # Проверяем на котором растоянии находится объект.
        if (obj_pos - self.path[self.step]).length() <= 0.15:
            # Управление тумблером.
            if self.lever == False:
                # Простая секвенция на три позиции.
                if self.step <= 1:
                    self.step += 1
                else:
                    self.step = 0
                # Меняем вектор направления.
                self.current_vector =  self.path[self.step] - obj_pos
                # Переключаем тумблер.
                self.lever = True
        else:
            # Сброс тумблера в исходное состояние.
            self.lever = False

        vec = self.current_vector
        vec.normalize()

        # Перемещаем объект.
        self.obj.set_pos(self.obj, vec*self.speed*dt)

        return task.cont

app = MyApp()
app.run()


Здесь используется обратная формула, конечно это вызывает проблемы проскока мимо точек при высокой скорости, однако если поколдовать думаю можно это обойти дополнительными проверками. Сейчас в примере используется нормализация вектора, это дает равномерную скорость. Чтоб получить обратную проблему, нужно закомментировать строку:

Код
vec.normalize()

и установить скорость.

Код
self.speed = 0.2


ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 28.05.2022, 17:11
 
serg-kkzДата: Суббота, 28.05.2022, 17:23 | Сообщение # 19
Генерал-лейтенант
Группа: Модераторы
Сообщений: 777
Награды: 3
Репутация: 18
Статус: Offline
Так же можно фактически вместо Vec3 использовать Point3, так как сам вектор мы получаем после вычитания позиции объекта и точки.

ООП  -  
 
gurovilya9Дата: Воскресенье, 29.05.2022, 09:41 | Сообщение # 20
Рядовой
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 4
Статус: Offline
serg-kkz, хм-м, надо посмотреть

Я ранее пробовал сгенерировать MotionPath программно. Но что-то с формулой у меня не сложилось, на повороте получилось ускорение большое в конце, видимо, из-за синусов (поворот на 90 градусов я попытался через синусы сделать, по формуле окружности)

Я опробую такой подход, большое спасибо!


Сообщение отредактировал gurovilya9 - Воскресенье, 29.05.2022, 09:43
 
Форум Panda3D - по русски » Общий форум » Проекты » ForwardOnly: стратегический рогалик с отрытым кодом
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: