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

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

Да я как-то тоже столкнулся с такой проблемой и вот так решил, за основу взял не свою созданную способность. В карте всё наглядно показано, вот только на ГУИ.
Загруженные файлы

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
6 лет назад
Отредактирован Maniac_91
0
Sergey105, 100 - это расстояние от центра героя, это же полярные координаты. Если поставить разные значения, то оно будет неправильным. Проверь, поставив 100 в обоих случаях.
0
7
6 лет назад
0
Maniac_91, ну а мне надо чтобы работало как в стандартном смещение снаряда атаки
0
30
6 лет назад
0
Сейчас допишу правильное решение, терпение.
Sergey105, ты же знаком со структурами?
0
7
6 лет назад
0
Clamp, да
сними только работаю
1
18
6 лет назад
Отредактирован Maniac_91
1
Sergey105, так там координаты же берутся относительно угла поворота юнита.
Красная стрелка - угол поворота юнита.
На рисунке слева координаты в прямоугольной системе: х = 0 и у = -100.
В полярных координатах это то же самое, что угол -90 и расстояние 100.
Загруженные файлы
0
30
6 лет назад
Отредактирован 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
6 лет назад
0
Clamp, проверил не работает юнит создается где-то верху карты и потом летит в цель
0
30
6 лет назад
Отредактирован Clamp
0
Sergey105, хотя бы идея понятна?

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

Вроде исправил
0
7
6 лет назад
0
Clamp, Maniac_91, Maniac_91:
Sergey105, так там координаты же берутся относительно угла поворота юнита.
Красная стрелка - угол поворота юнита.
На рисунке слева координаты в прямоугольной системе: х = 0 и у = -100.
В полярных координатах это то же самое, что угол -90 и расстояние 100.
тут чел понял примерно что я хочу
и да мне бы желательно вне зависимости от таргета
а именно от радиуса поворота героя
0
29
6 лет назад
Отредактирован 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
6 лет назад
Отредактирован 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;
}
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.