Возникла проблема с xy некогда ранее не сталкивался с ней и не нуждался в ней. Короче делаю атаку создается dummy под тип снаряда и летит в цель но появилась нужда немного изменять координаты появления dummy в зависимости от угла поворота героя атакующего цель и нужно так чтобы dummy появлялся допустим с X=X-100.Y координатами. Изначально X = GetUnitX(Герой) и я смещаю ещё на 100 ед но с учетом куда повернут герой . Мне трудновато объяснить письменно постарался изобразить на paint

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

Да я как-то тоже столкнулся с такой проблемой и вот так решил, за основу взял не свою созданную способность. В карте всё наглядно показано, вот только на ГУИ.
Загруженные файлы
0
32
7 лет назад
0
X = X + dist * cos( rad )
Y = Y + dist * sin( rad )
Dist - расстояние на которое вы хотите сместить даммика, rad - угол в радианах. Чтобы сместить дамика влево или вправо от героя, добавьте к его углу поворота 90 градусов, ну или вычтите их. Как перевести градусы в радианы думаю вы знаете.
0
18
7 лет назад
Отредактирован Maniac_91
0
Как-то так:
call CreateUnit(GetOwningPlayer(U), 'unit',  X+100*CosBJ(GetUnitFacing(U)-1.57079632679), Y+100*SinBJ(GetUnitFacing(U)-1.57079632679), GetUnitFacing(U))
Где U - юнит-герой, X и Y - его координаты, а 1.57079632679 - это число Пи пополам (90 градусов).
Хотя с градусами и радианами мог перепутать.
0
7
7 лет назад
0
Maniac_91, Вполне работает но есть косяк .
x допустим я смещаю на 100 , а y на 1
и при определенных градусах все работает но при некоторых атакует с неверной стороны
x = GetUnitX(sa.at1);
y = GetUnitY(sa.at1);
a = GetUnitFacing(sa.at1)
x = x + 100 * CosBJ(a - 1.57079632679)
y = y + 1 * SinBJ(a - 1.57079632679)
0
18
7 лет назад
Отредактирован Maniac_91
0
Sergey105, хм, тогда конвертируй градусы в радианы.
x = x + 100 * CosBJ(a - Deg2Rad(90))
y = y + 100 * SinBJ(a - Deg2Rad(90))
Зачем смещать y на 1?
0
30
7 лет назад
0
Sergey105, направление определяется способностью типа "цель-точка"?
0
7
7 лет назад
0
Clamp, цель боевая единица
Maniac_91, я делаю примерно как в стандартном редакторе
Загруженные файлы
0
18
7 лет назад
Отредактирован Maniac_91
0
Sergey105, 100 - это расстояние от центра героя, это же полярные координаты. Если поставить разные значения, то оно будет неправильным. Проверь, поставив 100 в обоих случаях.
0
7
7 лет назад
0
Maniac_91, ну а мне надо чтобы работало как в стандартном смещение снаряда атаки
0
30
7 лет назад
0
Сейчас допишу правильное решение, терпение.
Sergey105, ты же знаком со структурами?
0
7
7 лет назад
0
Clamp, да
сними только работаю
1
18
7 лет назад
Отредактирован Maniac_91
1
Sergey105, так там координаты же берутся относительно угла поворота юнита.
Красная стрелка - угол поворота юнита.
На рисунке слева координаты в прямоугольной системе: х = 0 и у = -100.
В полярных координатах это то же самое, что угол -90 и расстояние 100.
Загруженные файлы
0
30
7 лет назад
Отредактирован Clamp
0
Для начала замечу, что привычка использовать для обсчёта движения тригонометрические функции - верный путь к длительному, глубокому и жёсткому отсосу в будущем. Курите линал, он совершенно не сложный.

Писал прямо в сообщение, мог что-нибудь напутать, но вроде как не напутал.
код
вектор
struct vec2 {
	public float x, y;

	public static vec2 create(float x, float y) {
		return vec2.allocate().set(x, y);
	}
	public static vec2 createByUnit(unit u) {
		return vec2.create(GetUnitX(u), GetUnitY(u));
	}

	public vec2 plus(vec2 v) {
		return .set(x + v.x, y + v.y);
	}
	public vec2 minus(vec2 v) {
		return .set(x - v.x, y - v.y);
	}
	public vec2 mult(float num) {
		return .set(x*num, y*num);
	}
	public vec2 div(float num) {
		return .mult(1/num);
	}
	public vec2 normalize() {
		return this.div(SquareRoot(x*x + y*y));
	}
	private vec2 set(float x, float y) {
		this.x = x;
		this.y = y;
		return this;
	}
}
создание снаряда
Только создание, остальное сам
#define DUMMY_ID = 'u001'
#define SPAWN_DISTANCE = 100.0

unit createParticle(unit source, unit target) {
	vec2 va = vec2.createByUnit(source);
	vec2 vb = vec2.createByUnit(target).minus(va).normalize().mult(SPAWN_DISTANCE).plus(va);
	unit result = CreateUnit(GetOwningPlayer(source), DUMMY_ID, vb.x, vb.y, 0);
	va.destroy();
	vb.destroy();
	return result;
}

Само движение снаряда реализовать через вектора ни на йоту не сложнее.
0
7
7 лет назад
0
Clamp, проверил не работает юнит создается где-то верху карты и потом летит в цель
0
30
7 лет назад
Отредактирован Clamp
0
Sergey105, хотя бы идея понятна?

А, вижу косяк, сейчас исправлю

Вроде исправил
0
7
7 лет назад
0
Clamp, Maniac_91, Maniac_91:
Sergey105, так там координаты же берутся относительно угла поворота юнита.
Красная стрелка - угол поворота юнита.
На рисунке слева координаты в прямоугольной системе: х = 0 и у = -100.
В полярных координатах это то же самое, что угол -90 и расстояние 100.
тут чел понял примерно что я хочу
и да мне бы желательно вне зависимости от таргета
а именно от радиуса поворота героя
0
29
7 лет назад
Отредактирован Doc
0
unit createParticle(unit source, unit target) {
	vec2 va = vec2.createByUnit(source);
	vec2 direction = vec2.createByUnit(target).minus(va).normalize();
	vec2 direction_rotated = vec2.create(-direction.y, direction.x);
	vec2 spawn_point = direction_rotated.mult(SPAWN_DISTANCE).plus(va);
	
	unit result = CreateUnit(GetOwningPlayer(source), DUMMY_ID, spawn_point.x, spawn_point.y, 0);
	direction.destroy();
	spawn_point.destroy();
	return result;
}
0
30
7 лет назад
Отредактирован Clamp
0
код
вектор (обновлено)
struct vec2 {
    public float x, y;

    public static vec2 create(float x, float y) {
        return vec2.allocate().set(x, y);
    }
    public static vec2 createByUnit(unit u) {
        return vec2.create(GetUnitX(u), GetUnitY(u));
    }
    public static vec2 createByAngle(float angle) {
        return vec2.create(CosBJ(angle), SinBJ(angle));
    }

    public vec2 set(float x, float y) {
        .x = x;
        .y = y;
        return this;
    }

    public vec2 plus(vec2 v) {
        return .set(x + v.x, y + v.y);
    }

    public vec2 minus(vec2 v) {
        return .set(x - v.x, y - v.y);
    }
    public vec2 mult(float num) {
        return .set(x*num, y*num);
    }
    public vec2 div(float num) {
        return .mult(1/num);
    }
    public vec2 normalize() {
        return .mult(1/SquareRoot(x*x + y*y));
    }
    public vec2 rotate(float angle) {
        return .rotateHelper(CosBJ(angle), SinBJ(angle));    
    }
    public float dot(vec2 v) {
        return x*v.x + y*v.y;
    }
    public float radius() {
        return SquareRoot(x*x + y*y);
    }
    public float radiusSqr() {
        return x*x + y*y;
    }

    private vec2 rotateHelper(float aCos, float aSin) {
        return .set(x*aCos - y*aSin, y*aCos + x*aSin);
    }
}
создание снаряда
#define DUMMY_ID = 'u001';
#define DEG2RAD = 0.017453292;

unit CreateSpellParticleUnit(unit source, float offsetAngle, float offsetRadius) {
    float spawnAngle = (offsetAngle + GetUnitFacing(source))*DEG2RAD;
    vec2 pivot = vec2.createByUnit(source);
    vec2 spawn = vec2.createByAngle(spawnAngle).mult(offsetRadius).plus(pivot);

    unit particle = CreateUnit(GetOwningPlayer(source), DUMMY_ID, spawn.x, spawn.y, 0);
    pivot.destroy();
    spawn.destroy();
    return particle;
}
0
15
6 лет назад
0
Да я как-то тоже столкнулся с такой проблемой и вот так решил, за основу взял не свою созданную способность. В карте всё наглядно показано, вот только на ГУИ.
Загруженные файлы
Принятый ответ
0
7
6 лет назад
0
bifurcated, все понял полностью спасибо помог наработкой
x = GetUnitX(sa.at1);
y = GetUnitY(sa.at1);
angle_x = GetUnitFacing(sa.at1) + 90
angle_y = GetUnitFacing(sa.at1) + 180

x = x + DB.x_model * Cos(angle_x * bj_DEGTORAD);
y = y + DB.x_model * Sin(angle_x * bj_DEGTORAD);
sa.dummy = NewDummy('hhes', x, y);

x = GetUnitX(sa.dummy) + DB.y_model * Cos(angle_y * bj_DEGTORAD);
y = GetUnitY(sa.dummy) + DB.y_model * Sin(angle_y * bj_DEGTORAD);
SetUnitX(sa.dummy,x)
SetUnitY(sa.dummy,y)
могу изменять и по X и по Y
0
30
6 лет назад
0
Sergey105, вот по сути операции над векторами, но зачем-то разобранными. Скинул же структуру, с которой код с вычислениями в пару строк укладываться будет без дублирования.
0
7
6 лет назад
0
Clamp, я векторы изучу и переделаю потом
в данный момент я в них но особо разобрался
Clamp, если я пока не понимаю то и делать на этом не смогу
Clamp, и да спасибо за помощь и потраченное время на меня
0
30
6 лет назад
0
Sergey105, вектор - это объект с парой координат, символизирующий собой направление. Линал очень простой, весьма советую погуглить краткие онлайн-курсы с разъяснениям основн
Чтобы оставить комментарий, пожалуйста, войдите на сайт.