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

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

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Цикл, возможные ограничения.
Доброго времени суток всем.
Столкнулся с странной проблемой.
В коде:
» code
globals
private real X
private real Y
endglobals

    {int h = 0
    int c = 0
    real a = 0.00
    real x = GetRectCenterX(r)
    real y = GetRectCenterY(r)
    real x1 = 0.00
    real y1 = 0.00
    int i = 0
    loop
    exitwhen a >= 4.71
        h=0
        c=1
        loop
        exitwhen h > leight-1
            x1=x+128.00*h*Cos(a+1.57)
            y1=y+128.00*h*Sin(a+1.57)
            c=1
            loop
            exitwhen c > leight-h
                i=0
                X = x1+128.00*c*Cos(a)
                Y = y1+128.00*c*Sin(a)
                loop
                exitwhen i>400
                i=i+1
                endloop
                DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",X,Y))​
            c=c+1
            endloop
        h=h+1
        endloop
    a+=1.57
    endloop}
Создается прямой ромб перемещением полярно от центра ромба.
Если строки:
loop
exitwhen i>400
i=i+1
endloop
Из когда исключить, то код работает правильно при любом размере сторон ромба.
Если же их оставить то ромб "не до делается". То-есть лишний цикл помешает.
Прошу объяснить почему.
Старый 08.08.2010, 11:52
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
AlexKARASb, т.к.
Код:
loop
            exitwhen c > leight-h
                i=0 // <========

И, хоть и маловероятно, но лучше в любом случае
Код:
globals
private real X = .0
private real Y = .0
endglobals
Старый 08.08.2010, 12:00
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
loop
    exitwhen a >= 4.71 //замыкание ромба
        h=0 //подготовка перенной к циклу
        c=1 //подготовка перенной к циклу
        loop
        exitwhen h > leight-1 //если длинна хорды больше чем длинна половины диагонали - 1
            x1=x+128.00*h*Cos(a+1.57) //от центра ромба на расстояние длинная хорды*на длинну клетки в ромбе по направлению a+90градусов
            y1=y+128.00*h*Sin(a+1.57)
            c=1 //подготовка переменной к циклу, для верности 2 раз
            loop
            exitwhen c > leight-h //длинна пока не станет больше длинна половины диагонали - высота внутренней хорды
                i=0 //подготовка к циклу, мне заведомо в след цикле нужна эта перенная
                X = x1+128.00*c*Cos(a) //построение хорды опираясь на координаты полученные ранее
                Y = y1+128.00*c*Sin(a)
                loop
                exitwhen i>400 //цикл нужный мне для проверок в карте
                i=i+1
                endloop
                DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",X,Y))​&#8203; //визуальный проверочный эффект
            c=c+1 
            endloop
        h=h+1
        endloop
    a+=1.57
    endloop
AlexKARASb добавил:
В общем создается так:
. . . . -
. . . - - - -
. . - - - - - - - - -
1)X . . .2)X - - - 3)X - - - 4)X - - - 5)X - - -
X - центр ромба
. - пустое место
  • эффект созданный
После этого разворот на 90 градусов и повторная процедура :)
Старый 08.08.2010, 12:10
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Код:
i = 0
...
whilenot (i > 400) {BJDebugMsg(I2S(i)); i++}

Какое число выйдет последним?
Старый 08.08.2010, 12:12
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
379 ._. Почему?
Блин жаль, форматирование мешает увидеть =\ принцип. Ну лан пох
Старый 08.08.2010, 12:15
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
AlexKARASb, пейнт+имейджхост рулят :) . А если так:
Код:
i = 400
...
whilenot (i < 0) {BJDebugMsg(I2S(i)); i--}

?
Старый 08.08.2010, 12:19
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
пейнт
и я о нем подумал :)
вот, затем просто поворот на 90гр и так 4 раза в сумме
код пойду проверю
21 ._. мне не дано понять всех тонкостей циклов :D
и длинна на нее не влияет О.О, хоть ромб с диагоналями на всю карту в виду 21 так и будет, хоть 1введу также 21 будет
AlexKARASb добавил:
Подумал, мб просто циклы больше 2ух работают параллельно
Сделал вариант вместо перебора внутри функции создания циклом, вариант с отправкой данных в структуру
» code
scope Create

globals
private real X
private real Y
endglobals

private struct Data
static int c = 0
static Data array d
static timer t = CreateTimer()
real x
real y

static void Looping() {
    int k = 0
    int i = 0
    whilenot (k >= .c) {
    i=0
    whilenot (i > 400) {BJDebugMsg(I2S(i)); i++}
    DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",.d[k]​.x,.d[k].y))
    .d[k].destroy()
    .c--    
    .d[k]=.d[.c]
    k-- //забыл это :), снизило чуток лаги, но фпс не больше 5ти не торт ._.
    if .c <= 0 then
        PauseTimer(.t)
    endif
    k++ }}

static void Check_XY (real x,real y) {
Data D = Data.create()
D.x=x
D.y=y
if .c <= 0 then
    TimerStart(.t,0.1,true,function Data.Looping)
endif
.d[.c]=D
.c++ }

endstruct
    
void Range_Create(rect r,int leight,int red,int gre,int blu) {
    int h = 0
    int c = 0
    real a = 0.00
    real x = GetRectCenterX(r)
    real y = GetRectCenterY(r)
    real x1 = 0.00
    real y1 = 0.00
    if red == 0 then
        BoolMove = true
    else
        BoolMove = false
    endif
    loop
    exitwhen a >= 4.71
        h=0
        c=1
        loop
        exitwhen h > leight-1
            x1=x+128.00*h*Cos(a+1.57)
            y1=y+128.00*h*Sin(a+1.57)
            c=1
            loop
            exitwhen c > leight-h
                X = x1+128.00*c*Cos(a)
                Y = y1+128.00*c*Sin(a)
                Data.Check_XY(X,Y)
            c=c+1
            endloop
        h=h+1
        endloop
    a+=1.57
    endloop }

endscope
Код полностью работает, но. Лаги ужасные. Как делать простой перебор переменных в таймере с условиями я знаю, но как задействовать правильно для одноразовых целей не шарю.
Помогите пожалуйста оптимизировать. Вернее, поясните чего лишнего я наделал в коде. Сам догадываюсь что таймер.. Но как сделать по другому?
AlexKARASb добавил:
Фпс был мал из-за де баг месседжа, не знал я, что из-за сообщения бывают лаги
FREEZE_ball, Спасибо большое за помощь что натолкнул на мысль
Тему можно закрыть.

Отредактировано AlexKARASb, 08.08.2010 в 12:30.
Старый 08.08.2010, 14:21
Закрытая тема

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

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

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

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



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