Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot в онлайн играх _ реализовать движение персонажа до объекта

Автор: farlike 25.11.2023, 12:46

Нужно реализовать движение персонажа до объекта. Движение происходит за счет зажатия клавиши (wsad)

Идея такая, что с помощью findcolor нахожу координаты куда бежать персонажу, а потом зажать клавижу до тех пор пока он до нее не дойдет, но идею как это реализовать не пойму.

Автор: DarkMaster 28.11.2023, 16:19

скорее findimage чем findcolor. А в чем вообще принципиальная проблема? Зажали, ждем появления точки/изображения, отжали. Код покажите любой кривости - подскажу по месту. Так очень сложно гадать в чем у вас проблема.

Автор: farlike 30.11.2023, 22:54

Извиняюсь, очень сумбурно написал.
findcolor'a достаточно, цели имеют уникальный цвет, с их поиском проблем не возникло.

Камера привязана к персонажу(он всегда в этих координатах).

Код


--lua
log (1202, 573, 110, 100)

local heroX = 478
local heroY = 298


Есть функция по поиску нужного объекта, с ней все ок
Код

function getTargetPosition()

local x1, y1 = 478, 298
local x2, y2 = 478, 298
local count = 0

while true do
    local cottonPos = findcolor (x1, y1, x2, y2, 1, 1, [[('3232848')]], '%arr', 2, 10, 2)
    if  cottonPos then
        log(arr[1][1], arr[1][2])
        return arr[1][1], arr[1][2]
    else
       -- log('expand search')
        if  count < 400 then
            x1 = x1-1
            y1 = y1-1
            x2 = x2+1
            y2 = y2+1
            count = count +1
        else
            log('waiting spawn')
            wait(5000)
            x1,y1,x2,y2,count = 478,298,478,298,0
            end
           -- log(count)
        end
    end
end



Вот тут что-то не так (пока не берем во внимамние, что по оси Y движение не дописал. давайте рассмотрим хотябы что не так с движением по оси X)

Т.к. персонаж всегда в центре, то получается, что как бы не он сам движется, а мир вокруг него и хотелось, чтобы когда найдена цель - зажимались кнопки до тех пор, пока эта цель не окажется рядом с персонажем, но движения получаются прерывистыми и персонаж не останавливается, а бежит дальше

Код

function moveToTarget()
targetX, targetY = 0,0
while math.abs(heroX - targetX) > 50 or math.abs(heroX - targetY) > 50  do
    targetX, targetY = getTargetPosition()
    if  heroX < targetX then
        log('right')
        kleft_down(rightX, rightY)
    elseif heroX > targetX then
        log('left')
        kleft_down(leftX, leftY) -- т.к. send_down не работает, а send217_down некорректно  работает, то зажимаю на джойстик движения мышкой
    end

log('up')
kleft_up(leftX, leftY) -- отпускаю мышь
end

end


Если персонаж рядом с объектом, на экране появляется кнопка на которую нужно нажать, тут вроде тоже без проблем все
Код

while true do
    if color(755, 240) == 38358  then

        kleft(752, 253)
        wait(3000)
    else
       moveToTarget()
    end
end
Прикрепленное изображение

Автор: DarkMaster 1.12.2023, 14:52

Код
        if  count < 400 then
            x1 = x1-1
            y1 = y1-1
            x2 = x2+1
            y2 = y2+1
            count = count +1

Это очень жесткий метод поиска ближайшего итема. Столько финдов даст дикую нагрузку. Проще сделать один поиск в большой области и потом по теормеме пифагора вычислить дистанцию. Т.е. разница x и y координат по модулю у нас будут катетами треугольника, считаем гипотенузу - дистанция готова.


heroX - targetY
может вы не доделали Y координату, но так точно не должно быть в условии. Уберите лишнее. Визуально очень похоже, что проблема именно в этом.

Автор: nykep 2.12.2023, 6:42

если одинаковых цветов не очень много, то сделать как Darkmaster написал, а если много, то можно попробовать вот здесь

Код
        if  count < 400 then
            x1 = x1-1
            y1 = y1-1
            x2 = x2+1
            y2 = y2+1
            count = count +1

поменять на +-10, 20, вобщем найти оптимальный вариант при котором будет максимальная скорость и делать будет то что надо.
По перемещению мне кажется самый простой вариант сделать так :
- Поиск ближайшего
- Если объект выше, нажать вверх
Если ниже, нажать вниз и т. д. Это если одного нажатия достаточно для перемещения персонажа и по диагонали ходить не будет конечно. А если за одно нажатие персонаж почти не смещается, тогда пробовать sendex_down и всё равно надо заново проводить поиск после каждого небольшого смещения
- Повторять до тех пор пока на экране не появится кнопка(findcolor или findimage)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)