Хотел попробовать в тригерах сделать способность Галла из Героев шторма. В оригенале способность должна работать как снаряды, вылетающие из кастера по лучу от него и в ту сторону, куда указывает курсор мыши. Снаряд уже готов, а вот задать направление ему не знаю как. Можно ли как-то преобразовать координаты в которые указывает курсор как точку, но так, что бы в процессе способности курсор можно было водить и снаряды меняли направление за ним?

Принятый ответ

Положение курсора можно получить только в триггере его события, либо клик мыши, или перемещение мыши
Например лучше использовать маус мув, у примера выше тоже оно.. ну и результат занести в клобалку, можно ещё событие клика (левой/правой/средней)... результатом будут
BlzGetTriggerPlayerMouseX() и
BlzGetTriggerPlayerMouseY()
Вот их нужно занести в глобальную переменную в массив, а дальше выдёргивать массив в любом нужно месте, где интедкс массива = ID игрока, всё можно сделать на гуи, но извините, вот вам на луа, максимально кратко
GetPlayerMouseX={} -- пустой глобальный массив/таблица
GetPlayerMouseY={} -- пожно заполнить нулями 0,0,0 дабы избежать багов в начале игры, если иполузуется GetPlayerMouseX[id] раньше, чем игрок первый раз двинет мышкой
function InitMouseMoveTrigger() -- вызываем в инициализации 
	local MouseMoveTrigger = CreateTrigger()
	for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
		local player = Player(i)-- для всех игроков сразу, для 24, пофиг столько будет
		TriggerRegisterPlayerEvent(MouseMoveTrigger, player, EVENT_PLAYER_MOUSE_MOVE) -- триггер движения мыши
	end
	TriggerAddAction(MouseMoveTrigger, function()
		local id=GetPlayerId(GetTriggerPlayer())
		GetPlayerMouseX[id]=BlzGetTriggerPlayerMouseX() -- нам нужные значения курсора
		GetPlayerMouseY[id]=BlzGetTriggerPlayerMouseY() -- которые мы выдерним в любом месте
	end)
end
Все, теперь мы в любой момент времени выдергиваем положения курсора, стоит помнить что курсор на интерфейсе возвращает 0,0
Далее чтобы узнать угол относительно курсора и чего либо надо просто использовать 1 строчку
angle = AngleBetweenXY(x, y, GetPlayerMouseX[id], GetPlayerMouseY[id]) / bj_DEGTORAD
Где х и у, например координаты нашего юнита, а GetPlayerMouseX[id] курсор игрока id

Ну и чуть не забыл, сама функция
function AngleBetweenXY(xa, ya, xb, yb)
	return math.atan(yb - ya, xb - xa)
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
Добавь компьютерного игрока на нужный слот

1
7
4 года назад
Отредактирован Ельнур
1
да глянь эту наработку автошахматы там способность перемещение фигуры фигура двигается за мышью сам делал если конечно разбираешься в джасс, а так сейчас обьяснить не могу ибо я снйчас не играю и готовлюсь к дипломной

это отлов позиции мышки но нужно глобальная переменная ибо локальную в другой триггер не утащишь
globals
real MouseX0 = 0
real MouseY0 = 0
real MouseX1 = 0
real MouseY1 = 0
real MouseX2 = 0
real MouseY2 = 0
real MouseX3 = 0
real MouseY3 = 0
real MouseX4 = 0
real MouseY4 = 0
real MouseX5 = 0
real MouseY5 = 0
real MouseX6 = 0
real MouseY6= 0
real MouseX7 = 0
real MouseY7 = 0
real MouseX8 = 0
real MouseY8 = 0
endglobals
//===========================================================================
// Trigger: MickeyMouse
//===========================================================================
function Trig_MickeyMouse_Actions takes nothing returns nothing
local player p= GetTriggerPlayer()
local player p0= Player(0)
local player p1= Player(1)
local player p2= Player(2)
local player p3= Player(3)
local player p4= Player(4)
local player p5= Player(5)
local player p6= Player(6)
local player p7= Player(7)
local player p8= Player(8)
if p == p0 then
set MouseX0=BlzGetTriggerPlayerMouseX()
set MouseY0=BlzGetTriggerPlayerMouseY()
endif
if p == p1 then
set MouseX1=BlzGetTriggerPlayerMouseX()
set MouseY1=BlzGetTriggerPlayerMouseY()
endif
if p == p2 then
set MouseX2=BlzGetTriggerPlayerMouseX()
set MouseY2=BlzGetTriggerPlayerMouseY()
endif
if p == p3 then
set MouseX3=BlzGetTriggerPlayerMouseX()
set MouseY3=BlzGetTriggerPlayerMouseY()
endif
if p == p4 then
set MouseX4=BlzGetTriggerPlayerMouseX()
set MouseY4=BlzGetTriggerPlayerMouseY()
endif
if p == p5 then
set MouseX5=BlzGetTriggerPlayerMouseX()
set MouseY5=BlzGetTriggerPlayerMouseY()
endif
if p == p6 then
set MouseX6=BlzGetTriggerPlayerMouseX()
set MouseY6=BlzGetTriggerPlayerMouseY()
endif
if p == p7 then
set MouseX7=BlzGetTriggerPlayerMouseX()
set MouseY7=BlzGetTriggerPlayerMouseY()
endif
if p == p8 then
set MouseX8=BlzGetTriggerPlayerMouseX()
set MouseY8=BlzGetTriggerPlayerMouseY()
endif
set p0=null
set p1=null
set p2=null
set p3=null
set p4=null
set p5=null
set p6=null
set p7=null
set p8=null
set p=null
endfunction

//===========================================================================
function InitTrig_MickeyMouse takes nothing returns nothing
    local trigger t= CreateTrigger()
local code cot= function Trig_MickeyMouse_Actions
local integer index= 0
local player p = null
local playerevent evenk = null
loop
set p=Player(index)
set evenk=EVENT_PLAYER_MOUSE_MOVE
call TriggerRegisterPlayerEvent(t, p, evenk)
set p=null
set evenk=null
set index=index + 1
exitwhen index == 9
endloop
    call TriggerAddAction(t, cot)
set cot=null
set t=null
endfunction

только не забывай инициализировать все пустынные переменные это был мой косяк в то время)
Загруженные файлы
1
32
4 года назад
1
Положение курсора можно получить только в триггере его события, либо клик мыши, или перемещение мыши
Например лучше использовать маус мув, у примера выше тоже оно.. ну и результат занести в клобалку, можно ещё событие клика (левой/правой/средней)... результатом будут
BlzGetTriggerPlayerMouseX() и
BlzGetTriggerPlayerMouseY()
Вот их нужно занести в глобальную переменную в массив, а дальше выдёргивать массив в любом нужно месте, где интедкс массива = ID игрока, всё можно сделать на гуи, но извините, вот вам на луа, максимально кратко
GetPlayerMouseX={} -- пустой глобальный массив/таблица
GetPlayerMouseY={} -- пожно заполнить нулями 0,0,0 дабы избежать багов в начале игры, если иполузуется GetPlayerMouseX[id] раньше, чем игрок первый раз двинет мышкой
function InitMouseMoveTrigger() -- вызываем в инициализации 
	local MouseMoveTrigger = CreateTrigger()
	for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
		local player = Player(i)-- для всех игроков сразу, для 24, пофиг столько будет
		TriggerRegisterPlayerEvent(MouseMoveTrigger, player, EVENT_PLAYER_MOUSE_MOVE) -- триггер движения мыши
	end
	TriggerAddAction(MouseMoveTrigger, function()
		local id=GetPlayerId(GetTriggerPlayer())
		GetPlayerMouseX[id]=BlzGetTriggerPlayerMouseX() -- нам нужные значения курсора
		GetPlayerMouseY[id]=BlzGetTriggerPlayerMouseY() -- которые мы выдерним в любом месте
	end)
end
Все, теперь мы в любой момент времени выдергиваем положения курсора, стоит помнить что курсор на интерфейсе возвращает 0,0
Далее чтобы узнать угол относительно курсора и чего либо надо просто использовать 1 строчку
angle = AngleBetweenXY(x, y, GetPlayerMouseX[id], GetPlayerMouseY[id]) / bj_DEGTORAD
Где х и у, например координаты нашего юнита, а GetPlayerMouseX[id] курсор игрока id

Ну и чуть не забыл, сама функция
function AngleBetweenXY(xa, ya, xb, yb)
	return math.atan(yb - ya, xb - xa)
end
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.