Сейчас 23:17:43 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Инициализация структуры
ZonneryДата: Четверг, 20 Июня 2013, 01:36:34 | Сообщение # 1
3 уровень
Группа: Проверенные
Сообщений: 42
Награды: 0
Репутация: 95
Блокировки:
Внутри скопа объявляю приватный массив структур.
Код
scope RC089{
     private Test array tst[]   
      
     void Add(player p){
     tst[0].p=p
     }

     struct Test{
          player p=null
      }

}

Функцией Add устанавливаю значение переменной p в структуру с индексом 0, ВНЕЗАПНО это значение устанавливается всем переменным p во всём массиве структур. Что не так?

p.s. Темку переместите, а то промахнулся чуток)


Мир, как зеркало, отражает ваше отношение к нему. Когда боретесь с миром, он борется с вами. Когда прекращаете свою битву, мир идет навстречу.(В.Зеланд)
vk.com/zonnery


Сообщение отредактировал Zonnery - Четверг, 20 Июня 2013, 01:38:11
 

SirNikolasДата: Четверг, 20 Июня 2013, 06:21:01 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Если больше у тебя структура Test нигде не используется (или используется только подобным образом), ее можно описать как наследующую массив:
Код
struct Test extends array {
    player p;
}

void Add(player p) {
    Test[0].p = p;
}
Если тебе это не подходит, то решение проблемы простое: ты забыл создать структуры (tst[i] = Test.create()).


 

lawsonДата: Четверг, 20 Июня 2013, 10:33:05 | Сообщение # 3
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Zonnery, зачем именно нужна структура наследующий массив? раз так то почему бы не сделать переменную p статической? или расписать метод create уже внутри структуры с переменной p и создавать ее через allocate?

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Четверг, 20 Июня 2013, 10:37:31
 

SirNikolasДата: Четверг, 20 Июня 2013, 12:07:46 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
lawson, здесь все зависит от того, что конкретно надо.

 

Ty3uKДата: Четверг, 20 Июня 2013, 17:41:44 | Сообщение # 5
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas,


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек


Сообщение отредактировал SirNikolas - Четверг, 20 Июня 2013, 19:06:29
 

ZonneryДата: Пятница, 21 Июня 2013, 00:04:37 | Сообщение # 6
3 уровень
Группа: Проверенные
Сообщений: 42
Награды: 0
Репутация: 95
Блокировки:
В общем, нужен был способ реализации одной фишки. А именно простой системки движения, основанной на самоочищающихся триггерах(вместо ресурсоёмкого picked unit, для каждого объекта создаётся триггер, который после разрушения объекта уничтожается на столько, на сколько это возможно, где-то около 16кб от объекта всё-таки утекает). Реализовал эту систему на массивах я просто. Создал библиотеку, в ней парочку функций. Одна создавала объект на основе физического тела, пихала его и его параметры в свободную ячейку парных массивов, запускала таймер-обработчик, проверял максимальный не пустой индекс в массиве для того, чтобы в таймере-обработчике цикл лишний раз не бегал(кстати, минус той системы был в том, что максимальный размер массива в варкрафте 8192, т.е. это лимит на кол-во объектов, его можно обойти при желании, но тем не менее). Вторая функция, как раз выполняла действия в таймере, т.е. двигала юнит, отключала таймер, если тело уничтожалось, или находилось в состоянии покоя. Всё работало перфекто и начинало подлагивать, лишь если одновременно обрабатывалось свыше 1к объектов.


Код этот я где-то полгода назад писал, много лишнего, т.к. он уже был интегрирован в карту, и мне кое-что пришлось туда добавить) В игре всё работает нормально, но сам по себе код выглядит не ахти.
Первое что стоит сделать, это заменить эти парные массивы на массив структур. Кроме того, можно сдвигать весь массив при уничтожении одного из элементов, дабы не существовало "дыр". Что ещё можно улучшить? Кстати говоря, хэш вообще не предлагать)


Мир, как зеркало, отражает ваше отношение к нему. Когда боретесь с миром, он борется с вами. Когда прекращаете свою битву, мир идет навстречу.(В.Зеланд)
vk.com/zonnery


Сообщение отредактировал Zonnery - Пятница, 21 Июня 2013, 00:07:19
 

SirNikolasДата: Пятница, 21 Июня 2013, 07:34:49 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (Zonnery)
Код
private real Abs(real r)  {
    if r > 0. {return r}
    else {return -r}
}
А чем RAbsBJ не угодила?)
Цитата (Zonnery)
Что ещё можно улучшить?
Использовать одну точку на весь код карты:
Код
library_once L { constant location L = Location(.0, .0); }

library SystemOfMoving requires L {
    //...
    MoveLocation(L, GetWidgetX(u), GetWidgetY(u));
    real u1z = GetLocationZ(L);
    //...
}
Я, кстати, использую еще и library_once G { constant group G = CreateGroup(); }
Цитата (Zonnery)
if (maxArraySearch==true)
static if maxArraySearch
Цитата (Zonnery)
effect e = AddSpecialEffect("Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl",GetUnitX(uLaser[i]),GetUnitY(uLaser[i]))
DestroyEffect(e)
e=null
DestroyEffect(AddSpecialEffect(EFFECT /* В константы */, GetUnitX(uLaser[i]), GetUnitY(uLaser[i])));
И AdicHelper последней версии сам обнуляет локальные переменные.
Цитата (Zonnery)
Код
int i = 0
while (tr[i]!=GetTriggeringTrigger()){
    i++
}
Код
int i = 0;
handle h = GetTriggeringTrigger();
whilenot h == tr[i] { i++; }
Цитата (Zonnery)
SetUnitX(uLaser[i],GetUnitX(uLaser[i])+Cos(bj_DEGTORAD*(GetUnitFacing(uLaser[i])+uRevers[i]))*speed)
SetUnitY(uLaser[i],GetUnitY(uLaser[i])+Sin(bj_DEGTORAD*(GetUnitFacing(uLaser[i])+uRevers[i]))*speed)
Поскольку этот код выполняется каждые .02 секунды, неплохо было бы (Cos|Sin)(bj_DEGTORAD*(GetUnitFacing(uLaser[i])+uRevers[i]))*speed просчитать во время запуска.

А это чтобы каждый раз не вычислять границы карты:
Код
library SafeMove {
    private real minX, minY, maxX, maxY;
   
    void SafeMove(unit u, real x, real y) {
        if x > minX && x < maxX { SetUnitX(u, x); }
        if y > minY && y < maxY { SetUnitY(u, y); }
    }
   
    bool IsInMap(widget w) {
        real x = GetWidgetX(w), y = GetWidgetY(w);
        return x > minX && x < maxX && y > minY && y < maxY;
    }
   
    callback onInit() {
        minX = GetRectMinX(bj_mapInitialPlayableArea);
        minY = GetRectMinY(bj_mapInitialPlayableArea);
        maxX = GetRectMaxX(bj_mapInitialPlayableArea);
        maxY = GetRectMaxY(bj_mapInitialPlayableArea);
    }
}


 

Ty3uKДата: Пятница, 21 Июня 2013, 09:44:27 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Цитата (SirNikolas)
И AdicHelper последней версии сам обнуляет локальные переменные.

Ну и чему ты учишь людей? >(


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Пятница, 21 Июня 2013, 14:14:35 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ty3uK, человек знает, что нужно обнулять переменные и зачем это нужно. Автообнуление - это просто удобство, ведь больше ни в каких языках (я сейчас имею в виду известные) в сборщике мусора нет таких багов.

Добавлено (21 Июня 2013, 14:14:35)
---------------------------------------------
Можно явно указывать flush locals.


 

Ty3uKДата: Пятница, 21 Июня 2013, 14:15:35 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, и он не обнулит player.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DiabfallДата: Пятница, 21 Июня 2013, 19:37:26 | Сообщение # 11
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата (Ty3uK)
SirNikolas, и он не обнулит player

Кто-нибудь нормально аргументированно объяснит, почему надо player обнулять? желательно без тупых коротких объяснений типа: player от handle
 

Ty3uKДата: Пятница, 21 Июня 2013, 19:58:02 | Сообщение # 12
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Как ни странно - player от handle.
Тогда ответь мне на вопрос, почему надо обнулять юнита?


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DiabfallДата: Пятница, 21 Июня 2013, 20:11:17 | Сообщение # 13
Группа: Проверенные
Сообщений: 1231
Награды: 0
Блокировки:
Цитата (Ty3uK)
Как ни странно - player от handle.

т.е. Адольф и Скорп, которые всем трындят, что обнулять его нет смысла, неправы?

Цитата (ScorpioT1000)
Производные типы от handle
Все остальные типы, которые являются производными от handle (unit, item, player, code и др. См. common.j) – точно такие же ссылки. Но логически поделены на подтипы, у каждого из которых своя область применения.
Стоит упомянуть, что некоторые вобще не содержат никаких таблиц хендлов, например, тип player. В Starcraft 2 этот тип заменили на int.


Сообщение отредактировал Diabfall - Пятница, 21 Июня 2013, 20:16:30
 

Ty3uKДата: Пятница, 21 Июня 2013, 21:32:06 | Сообщение # 14
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Diabfall, я не говорю, что они не правы. Но вот на Хайве, кажется, видел не раз.
Возможно, я и не прав, но мне не вломится написать p = null


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz