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

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

Закрытая тема
 
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Советы об MUIинизации скила
Помогите, мне с советом.
Есть скил, Цепь, которая притягивает цель к себе.
Так вот, сделан он на глобальных переменных, CePb_Unit. CePb_Unit[1] - кастер CePb_Unit[2] - цель
Так вот, как сделать так, чтобы он был возможным на MUI, а то полно багов с ним когда, несколько его используют...
Я знаю лишь, 1 вариант: Сделать так: CePb_Unit[1-12] - Это будут кастеры, CePb_Unit[13-25]- цели.
Но это ограничевается, только тем, что у каждого игрока по 1 этому мобу...
Так вот скажите мне пожалуйста о других способах.
Да, конечно вы скажете об Hastable, но что скажу о ней: Я её ваще непонял, сколько не перечитывал статью, и можно ли вообще без неё?
PS, код выкладывать смысла нету, тк, все поняли... надеюсь. (Скил ограничивается двумя триггерами, 1 триггер устанавливает в глобалки юнитов, другой каждую 0.04 сек, двигает юнита)
Старый 08.09.2012, 19:33
Doc

offline
Опыт: 63,163
Активность:
Я её ваще непонял, сколько не перечитывал статью, и можно ли вообще без неё?
Еще перечитывай.
По-другому можно. Только если ты не понял хеш, нет смысла даже упоминать эти способы.
Старый 08.09.2012, 19:35
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Но ведь почему?
Если я выучил Jass за 1 ночь есть другие способы, то ведь они отличаются от хештаблицы, и не имеют к ней отношения!?
Старый 08.09.2012, 19:39
Doc

offline
Опыт: 63,163
Активность:
Xipxop, окей. Параллельные массивы. Говорит о чем-нибудь?
Старый 08.09.2012, 19:41
ScorpioT1000
Работаем
online
Опыт: отключен
Старый 08.09.2012, 19:50
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Давай догадаюсь:
1) Это глобальные перемменые имеющие свойство локальных?
2) Это глобальные переменные, для котторых создаются несколько массивов, но которые имею один недостаток, тот что приходится заново создавать весь массив?
3) Глобальные переменные, которые, для которых нужна еще одна глобалка, для которой и совмещаются массивы Ваще бред тут написал =)?

Всеравно, раз нету такой статьи об парралейных массивах, и то что я не знаю Русский язык hastable, еще ни о чем не геворит!
Старый 08.09.2012, 19:53
ScorpioT1000
Работаем
online
Опыт: отключен
Xipxop, я тебе только что дал ссылку на статью о массивах для муи)
Старый 08.09.2012, 19:55
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Я просто написал, это доку, и я писал тогда когда еще невидел того, что ты написал :P
Старый 08.09.2012, 19:56
ScorpioT1000
Работаем
online
Опыт: отключен
Параллельные массивы - несколько массивов, у которых индекс ячейки одного массива связан с такими же ячейками других массивов тем, что этот индекс представляет "объект", т.е. набор различных переменных для чего-либо, например, спелла
Старый 08.09.2012, 19:56
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Ладно тему закрыть!
Пойду изучу vjass и cjass хоть и не вижу разницы между ними =)
Старый 08.09.2012, 20:29
asesmo
Я I Jag Ich Jeg Ja Minä!
offline
Опыт: 8,073
Активность:
Xipxop:
я выучил Jass за 1 ночь
Xipxop:
вы скажете об Hastable, но что скажу о ней: Я её ваще непонял
Xipxop:
Скил ограничивается двумя триггерами
Выучил джасс за 1 ночь, но делаешь скиллы на движение в 2+ триггера т.к. не умеешь юзать хт - какая-то нестыковка?
А по теме:
без хеш таблицы муторно будет, ведь именно хендлы восновном и делают спеллы муи.
asesmo добавил:
Xipxop:
Сделать так: CePb_Unit[1-12] - Это будут кастеры, CePb_Unit[13-25]- цели
Оптимально, что я могу предложить для человека, выучившего джасс за ночь:
((код jass
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local unit c = GetSpellAbilityUnit()
local unit u = GetSpellTargetUnit()
...
call SaveUnitHandle(udg_blabla,h,1,c)
call SaveUnitHandle(udg_blabla,h,2,u)
...
call TimerStart(t,.04,true, function CepbDvizhenije)
...
))
Старый 08.09.2012, 21:34
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Xipxop, ну раз не нравится хештаблица, есть структуры vjass, а так же системы хранения данных, типа Timer Utils, XAT и тд....
Для их использования не обходими знания jass выше среднего и наличие мозга, не того не другого я что то не вижу
Старый 09.09.2012, 05:59
SiT3D

offline
Опыт: 1,514
Активность:
Для их использования не обходими знания jass выше среднего и наличие мозга, не того не другого я что то не вижу
Обосрал парнишку((( Хипхоп, советую хенделы понять, там ничего сложного нет.
Старый 09.09.2012, 11:08
adic3x

offline
Опыт: 108,439
Активность:
наличие мозга, не того не другого я что то не вижу
Кто бы говорил...
Старый 09.09.2012, 14:42
YellowStar
poon
offline
Опыт: 15,144
Активность:
Код:
globals
    integer count
    integer array data
endglobals

function GetIndex takes nothing returns thistype
    set count = count + 1
    return data[count]
endfunction

function GetLastIndex takes nothing returns thistype
    return count
endfunction

function FlushIndex takes integer i returns nothing
    set data[i] = data[count]
    set data[count] = 0
    set count = count - 1
endfunction


Юзай в духе индианы джонса, считай это универсальным инициализатором структур.

Код:
call SetUnitUserData(currentUnit,GetIndex())


Но конечно же, идеальный вариант использования будет такой.

Код:
struct Hook
    unit user
    unit cast
    unit targ
    player owner
endstruct

function SetupUnit takes unit cast,unit targ returns nothing
    local Hook this = Hook.create()
   set this.cast = cast
   set this.targ = targ
   set this.owner = GetOwningPlayer(this.cast)
   set this.user = тут создание если нужен даммик
   call SetUnitUserData(this.user,this)
  // так как у тебя ВОЗМОЖНО уже используется юзер дата на юнитах, то к кастеру и цели, вообще не стоит этого крепить, но ведь можно сделать грамотно через хештаблицу.
  call SaveInteger(MyHashtable,this,GetHandleId(this.cast),this)
  
  // Тут всякие таймеры запускай переодические, к ним тоже аттач данные если конечно нужно, хотя грамотнее сделать статичный таймер, и перебирать имеющиеся ячейки, но без этого мозголомства, можно итак атачить к таймерам кучи всего. мне норм. игрокам норм
endfunction
Старый 09.09.2012, 15:21
Doc

offline
Опыт: 63,163
Активность:
У меня так.
Сам "модуль"
#define private <implement List> = {
        static thistype list[]
        static int listCount = 0
        
        readonly bool onDestroy = false
        
        void setOnDestroy(bool b){
            onDestroy = b
        }
        
        bool isOnDestroy(){
            return onDestroy
        }
        
        void listAdd(){
            thistype.list[thistype.listCount] = this
            thistype.listCount++
        }
        
        void listRemove(int number){
            thistype.listCount--
            thistype.list[number] = thistype.list[thistype.listCount]
        }
        
        static void updateAll(){
            int i = 0
            whilenot(i == thistype.listCount){
                if (thistype.list[i].onDestroy){
                    thistype.list[i].destroy()
                    thistype.list[i].listRemove(i)
                    i--
                } else {
                    thistype.list[i].update()
                }
                i++
            }
        }
    }
Пример кода с ним
// Структура простейшего снаряда, который летит в указанную сторону и умирает при прохождении 1000 единиц расстояния
struct Missile{
	implement List
	
	unit main
	float x, y, vx, vy, d

	static Missile create(float x, float y, float vx, float vy){
		// Присвоение переменных, аллокация, создание юнита
		Missile this = Missile.allocate()
		this.x = x
		this.y = y
		this.vx = vx
		this.vy = vy
		this.d = 0.
		this.main = CreateUnit(Player(0), 'hfoo', x, y, Atan2(vy, vx) * 57.3)
		
		// Добавляем в список
		this.addToList()
		
		return this
	}

	void update(){
		// Меняем координаты, устанавливаем позицию
		this.x += this.vx
		this.y += this.vy
		SetUnitX(this.main, this.x)
		SetUnitY(this.main, this.y)
		
		// Прибавляем скорость к пройденному расстоянию
		this.d += SquareRoot(this.vx * this.vx + this.vy * this.vy)
		
		// Если прошли больше 1000 - ставим в очередь на уничтожение
		if (this.d > 1000.){
			this.setOnDestroy(true)
		}
	}
	
	// Этот метод может быть как дефолтным, так и переписанным
	void destroy(){
		KillUnit(this.main)
		this.deallocate()
	}
}

// Запускаем таймер для автоапдейта
callback onInit(){
	TimerStart(CreateTimer(), 0.025, true, lambda void(){
		Missile.updateAll()
        })
}
Старый 09.09.2012, 16:37
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
да вы кобылу тему уже подбили=)

Ладно вывод такой спасибо вам выучу, hastable, а затем c++ начну применять в практике полученные знания об vJass и cJass.
Старый 09.09.2012, 16:50
Закрытая тема

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

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

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

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



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