XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Поиск и замена тайлов в области
Ничего похожего не нашел, поэтому-напишите кто нибудь скрипт по поиску определенного тайла, например, трава-деревня, в определенной области (окружность) радиусом Н и замена на другой тайл, например земля-деревня. Заранее благодарен!
Старый 10.12.2008, 12:01
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Поиск осуществляется перебором ячеек в радиусе и сравнения с нужным типом тайлов с помощью функции
Код:
native GetTerrainType takes real x, real y returns integer
Замену вроде бы никак провести нельзя, только разве что создать blight.
Старый 10.12.2008, 12:40
Toadcop

offline
Опыт: 53,013
Активность:
Van Damm lol ?
Код:
native SetTerrainType               takes real x, real y, integer terrainType, integer variation, integer area, integer shape returns nothing
Старый 10.12.2008, 14:37
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Ну бывает-бывает, это мозги дымятся.
Старый 10.12.2008, 14:45
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Да да Ван Дамм ты б поспал немного.. Даже в гуи есть замена-но там заполняется вся указанная область одним тайлом:(
мм, ну с заменой это несложно-проблема в поиске.. Вот например спел точечный - координаты удара определить можно-радиус дан ( =Н ), и как мне дальше построить скрипт-цикл по поиску каждого кусочка травы в моей области?
Старый 10.12.2008, 23:04
ScorpioT1000
Работаем
offline
Опыт: отключен
перебором всех квадратов в радиусе и при соответствии - заменить
Старый 11.12.2008, 02:50
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Да это то все понятно :-D но как будет выглядеть сам текст кода? А главное как определять эти самые квадратики??
Старый 11.12.2008, 09:15
user_jasser

offline
Опыт: 232
Активность:
Elemental
циклом по кругу перебирай через PolarProjection ятп..
Старый 11.12.2008, 14:00
ScorpioT1000
Работаем
offline
Опыт: отключен
нет не поляром.
http://ru.wikipedia.org/wiki/Квадратура_круга
т.е. сторона квадрата a = r*SquareRoot(pi)
где r - заданный радиус, pi - пи(3,141592653..)
я так понял надо умножать на радиус раз там r = 1 в примере
т.е. потом ты проходишься циклом по квадрату ща напишу

ScorpioT1000 добавил:
Код:
globals
    real pi = 3,141592653
endglobals

function ReplaceTerrainInRange takes real x, real y, real radius, integer terrainOld, integer terrainNew, integer variation, integer area returns nothing
    local real a = radius*SquareRoot(pi)    //square side
    local real step = 128.0                 //1 tile = 128 points
    local real updnum = a/step              //num of steps for side
    local real i = 0.
    local real j
    local real ax = x-a/2
    local real ay = y-a/2
    local integer terrain
    if step>=radius then
        return
    endif
    
    loop
        exitwhen i >= updnum
        set j = 0.
        loop
            exitwhen j >= updnum
            set terrain = GetTerrainType(ax+i,ay+j)
            if terrain == terrainOld then
                SetTerrainType(ax+i,ay+j,terrainNew,variation,area,1)
            endif
            set j=j+step
        endloop
        set i = i+step
    endloop
endfunction

попробуй

x ,y - точка где проверять
radius - радиус по которому проверять
terrainOld - что зменять
terrainNew - чем заменять
а с area и variation сам разбирайся, я просто перевел все геты в эту ф-цию =) т.е. там в SetTerrainType это есть, хз что это

ScorpioT1000 добавил:
только тут фича что это для квадрата =) ну если хочешь - попроси Джона, он для круга сделает ^_^

Отредактировано ScorpioT1000, 11.12.2008 в 16:35.
Старый 11.12.2008, 16:25
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Спасибо:) но мне именно для круга надо..
Джон, если ты слышишь:) переделай пожалуйста код с квадрата на окружность

Отредактировано ShadoW DaemoN, 30.12.2008 в 19:13.
Старый 12.12.2008, 11:30
J
expert
offline
Опыт: 48,747
Активность:
круг большой или маленький?
если маленький то просто берем квадрат со стороной radius*2 описаный вокруг этой окружности и цыклом проходим по этому квадрату с шагом в 128, соответствено проверяя не больше ли квадрат растоянии от центра до точки чем радиус^2
если большой то так тоже можно, но лучше конешно другой алгоритм, если надо распишу
Старый 12.12.2008, 14:32
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Да, распиши пожалуйста, мне и для радиуса 300 и возможно для более чем в 2000 понадобиться:)

Elemental добавил:
Да, распиши пожалуйста, мне и для радиуса 300 и возможно для более чем в 2000 понадобиться:)
Старый 12.12.2008, 21:26
J
expert
offline
Опыт: 48,747
Активность:
еще вопрос, у тебя радиус обсалютно произвольный? или конечное количество? типо будет выйрыш если сделать предрасчеты для всех растояний или нет....
Старый 13.12.2008, 12:22
ScorpioT1000
Работаем
offline
Опыт: отключен
Jon, я не понял, что-то ты тормозишь) там вроде все не так сложно, я просто формулу забыл =)
Старый 13.12.2008, 16:30
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Так напиши для радиуса Н и все.. Так и так ведь формулу универсальную писать будешь.. (?)
Старый 13.12.2008, 17:02
J
expert
offline
Опыт: 48,747
Активность:
непомню чтобы я говорил что это сложно
Код:
function Action takes real X, real Y returns nothing
    //....
endfunction

function Circle takes real CenterX, real CenterY, real Radius, real Step returns nothing
    local real a = R2I(Radius/Step)*Step
    local real Side
    local real b
    loop
        exitwhen a < -Radius
        set Side = R2I(SquareRoot(Radius*Radius-a*a)/Step)*Step
        set b = Side
        loop
            exitwhen b < -Side
            call Action(CenterX+b, CenterY+a)
            set b = b - Step
        endloop
        set a = a - Step
    endloop
endfunction

Отредактировано Jon, 13.12.2008 в 17:25.
Старый 13.12.2008, 17:19
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Джон, Большое спасибо :)
но Непонимаю зачем все переменные реального типа? Ту же А ты объявляешь реальной а значение даешь целое-зачем? Аналогично и Б и Степ..
Проще не будет если только радиус переводить в целое а эти объявлять целыми?

Elemental добавил:
Все я понял зачем реальный тип! :)))
А в функцию Экшн я так понимаю нужно вставить нечто типа ГетТеррайн-СетТеррайн где координатами будут переменные Х и У?:)
Старый 14.12.2008, 09:58
J
expert
offline
Опыт: 48,747
Активность:
да

Jon добавил:
чет я прогнал, попробуй сделать так...
Код:
function Action takes real X, real Y returns nothing
    //....
endfunction

function Circle takes real CenterX, real CenterY, real Radius, real Step returns nothing
    local real a = Radius
    local real Side
    local real b
    loop
        exitwhen a < 0
        set Side = SquareRoot(Radius*Radius-a*a)
        set b = Side
        loop
            exitwhen b < 0
            call Action(CenterX+b, CenterY+a)
            call Action(CenterX+b, CenterY-a)
            call Action(CenterX-b, CenterY+a)
            call Action(CenterX-b, CenterY-a)
            set b = b - Step
        endloop
        set a = a - Step
    endloop
endfunction
Старый 14.12.2008, 13:33
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Написал код из сообщения 15 - при радиусе 256 получается ромб.. Явно что то в формуле не так..
Старый 14.12.2008, 14:35
J
expert
offline
Опыт: 48,747
Активность:
256? дык это мало очень

Jon добавил:
ну короче вот
» code
Код:
function Action takes real X, real Y returns nothing
    call CreateUnit(Player(0), 'hfoo', X, Y, bj_UNIT_FACING)
endfunction

function Circle1 takes real CenterX, real CenterY, real Radius, real Step returns nothing
    local real a = Step*R2I((Radius*2.0/Step))/2.0
    local real Side
    local real b
    loop
        exitwhen a < -Radius
        set Side = Step*R2I((SquareRoot(Radius*Radius-a*a)*2.0/Step))/2.0
        set b = Side
        loop
            exitwhen b < -Side
            call Action(CenterX+b, CenterY+a)
            set b = b - Step
        endloop
        set a = a - Step
    endloop
endfunction

function Circle2 takes real CenterX, real CenterY, real Radius, real Step returns nothing
    local real a = Step*R2I((Radius*2.0/Step))/2.0
    local real Side
    local real b
    loop
        exitwhen a < 0
        set Side = Step*R2I((SquareRoot(Radius*Radius-a*a)*2.0/Step))/2.0
        set b = Side
        loop
            exitwhen b < 0
            call Action(CenterX+b, CenterY+a)
            call Action(CenterX+b, CenterY-a)
            call Action(CenterX-b, CenterY+a)
            call Action(CenterX-b, CenterY-a)
            set b = b - Step
        endloop
        set a = a - Step
    endloop
endfunction
в первом все точно, но второй присзодительнее в четыре раза, однако на соприкосновении четвертей круга могут присходить 2 действия над одной и тойже точкой
Старый 14.12.2008, 14:59
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:50.