forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Нужна функция для работы с массивами. (http://forum.boolean.name/showthread.php?t=13836)

SergSS 05.12.2010 20:20

Нужна функция для работы с массивами.
 
Добрый день! Столкнулся со следующей проблемой:
Мне нужна функция которая делает некоторые операции с массивом и затем записывает изменения в исходный массив, т.е. делаю так:
Код:

IshodnyjMassiv[10]

While Not KeyHit(1)
  for i=1 to 10
    IshodnyjMassiv[i]=RefreshMassiv(IshodnyjMassiv[i],i)
  next
Wend
End

;---------------------------------

Function RefreshMassiv(localMassiv[10],num)
  ...
Return localMassiv[num]
End Function

Код очень приближенный, но думаю логика понятна.
На сколько знаю, функция не способна возвращать массив, а значит приходится перебирать все элементы массива вне ее...
Задача в том, что для функции должно быть не важно под каким именем в нее пихают массив заранее оговоренного размера, но вся проблема в том, что не хотелось бы в теле цикла перебирать все массивы, которым придется обращаться к этой функции. Можно ли как-нибудь сделать так, чтобы функция автоматически записывала все изменения в исходный массив?
Не уверен на сколько понятно удалось изложить мысль, но буду благодарен любой помощи! Спасибо!

Crayzi 05.12.2010 22:09

Ответ: Нужна функция для работы с массивами.
 
Цитата:

Сообщение от SergSS (Сообщение 171029)
На сколько знаю, функция не способна возвращать массив, а значит приходится перебирать все элементы массива вне ее...

Возможно ошибаюсь но те надо ковать функцию: "CreateBank ([size])".
Цитата:

Сообщение от SergSS (Сообщение 171029)
Задача в том, что для функции должно быть не важно под каким именем в нее пихают массив заранее оговоренного размера, но вся проблема в том, что не хотелось бы в теле цикла перебирать все массивы, которым придется обращаться к этой функции. Можно ли как-нибудь сделать так, чтобы функция автоматически записывала все изменения в исходный массив?

Если честно никак не могу понять вопроса, может эт я уже отупел, по возможности перевразируй или объясни по другому... ...Как массивы могут обращатся к функции?...

.......................
Некоторое время спустя...
Код:

Global IshodnyjMassiv[9]
While Not KeyHit(1)
        Cls
        For i=0 To 9
                IshodnyjMassiv[i] = RefreshMassiv(i)
                PrintMsg(IshodnyjMassiv[i],i)
        Next
Wend
End
Function RefreshMassiv%(num%)
        localMassiv%=num%+1
        Return localMassiv%
End Function
;////////////////////////////////////////
Function PrintMsg(PrintText%,M_ID%)
        Text 10,20+M_ID%*20,PrintText%
End Function

Случаем не это мел введу?

SergSS 05.12.2010 23:02

Ответ: Нужна функция для работы с массивами.
 
Спасибо за ответ не совсем понял пока чем банки отличаются от массивов, мозг наверн щас уже не варит, но почитаю!
а задачу перефразирую так - есть функция отрисовки массива и изменения значения в некоторых его элементах, т.е. каждому числу соответствует картинка+ часть элементов в функции меняется. Мне нужно чтобы запихивая в нее разные массивы по ходу программы функция изменяла только тот массив который в нее пихнули. можно ли как нить функции передать имя массива и работать с ним в функции или ссылку на этот массив...
т.е. я передаю массив некоторой функции, например RefreshMassiv(IshodnyjMassiv) и она должна изменить значения в этом массиве и перезаписать его, потом я передаю в нее другой массив RefreshMassiv(EweMassiv) и изменения должны записаться уже в EweMassiv.

Crayzi 05.12.2010 23:33

Ответ: Нужна функция для работы с массивами.
 
Короче я понял, у тебя есть массив, он заполнен изображениями, таких массивов несколько, тебе надо функция для обработки какого либо из массивов?
Допустим
Код:

Test[10]
test2[10]

?
Но я всеравно не пойму для чего функция обновления массивов? Что именно ты собираешся с ними делать? какие данные там будут кроме картинок?
Можно какойнить пример с тем как ты собираешся обновлять картинки...

SergSS 05.12.2010 23:58

Ответ: Нужна функция для работы с массивами.
 
Смотри, самый простой пример это реализация сумок и окон торговли во всяких рпг. Т.е. есть один массив - сумка1, есть другой - сумка2. я передал эти два массива по очереди в функцию отрисовки и перетаскивания мышкой из одной в другую. Допустим есть десяток сумок или окон торговли я хочу сделать универсальную функцию, которая бы брала массив-сумку и отрисовывала. Затем я беру и выкидываю(зануляю) мышкой один из элементов массива, теперь мне нужно чтобы исходный массив-сумка занулил или изменил соответствующий элемент(обновился/перезаписался).
К сожалению, нет примера, чтобы норм показать, то что пишу очень путано, т.к. споткнулся на том, что изменения происходят у меня лишь внутри функции, но не записываются в массив который к ней обратился.

Crayzi 06.12.2010 00:49

Ответ: Нужна функция для работы с массивами.
 
Ну тут тебе надо сделать просто функцию в которой будут заложены определенные действия в зависимости от ситуации.
Код:

Type Player
  Field Id;Хз зачем, так для прикола создал.
  Field Bag[10];Сумка игрока.
  Field Bank[10];Банк игрока.
End Type
Global Players[1]; это для примера, тут будет хэндл игрока.
For CrP%=1 To 2;Создаем 2-х игроков, еще не придумал зачем 2-рой,
; наверное для компании :)

  p.Player=New Player
  p\Id=CrP%;Так же для прикола заполнил...
  Players[CrP%-1]=Handle(p);Запишем хендл игрока чтобы не перебирать
; всех игроков при работе с инвентарем.

  p\Bag[1]=5;Положим предмет под ИД-шкой 5 в первый слот сумки.
  p\Bag[3]=546;Положим предмет под ИД-шкой 546 в третий слот сумки.
  p\Bank[3]=3;Положим предмет под ИД-шкой 3 в третий слот банка.
Next
Print  "До"
p.Player=Object.Player(Players[0])
  Print  "Сумка слот - 1: "+p\Bag[1]
  Print  "Сумка слот - 3: "+p\Bag[3]
  Print  "Банк слот - 3: "+p\Bank[3]
;Про функцию юзаемую ниже, первое значение - хэндл игрока в типе
; игроков, 2-е откуда будем брать предмет (1- из сумки, 2 из банка),
; 3-е слот из какого возьмем,
; 4-е куда будем ложить (0-выкинем, 1- в сумку, 2 - в банк).
; 5-е в какую ячейку (при выкидывании роли не играет).

MoveItem(Players[0],1,1,2,3);Перекинем предмет из 1-го слота сумки в 3-й слот банка.
MoveItem(Players[0],1,3,0,0);Выкинем предмет из 3-го слота сумки.
Print  "После"
p.Player=Object.Player(Players[0]);Выберем первого игрока через хендл которыйзаписывали
;при его создании(можно было и позже).
  Print  "Сумка слот - 1: "+p\Bag[1]
  Print  "Сумка слот - 3: "+p\Bag[3]
  Print  "Банк слот - 3: "+p\Bank[3]
MoveItem(Players[0],1,1,1,3);Переместим предмет из 1-го слота в 3-й.
Print  "После 2"
p.Player=Object.Player(Players[0])
  Print  "Сумка слот - 1: "+p\Bag[1]
  Print  "Сумка слот - 3: "+p\Bag[3]
  Print  "Банк слот - 3: "+p\Bank[3]
WaitKey

Function MoveItem(PlayerID%,ID_BagOut%,SlotNumOut%,ID_BagIn%,SlotNumIn%)
p.Player=Object.Player(PlayerID%)
Local TempItem%
Select ID_BagOut%
  Case 1;Перекладуем из сумки.
    Select ID_BagIn%
      Case 0;В никуда.
        p\Bag[SlotNumOut%]=0
      Case 1;В другой слот.
        TempItem%=p\Bag[SlotNumIn%]
        p\Bag[SlotNumIn%]=p\Bag[SlotNumOut%]
        p\Bag[SlotNumOut%]=TempItem%
      Case 2;В слот банка.
        TempItem%=p\Bank[SlotNumIn%]
        p\Bank[SlotNumIn%]=p\Bag[SlotNumOut%]
        p\Bag[SlotNumOut%]=TempItem%
    End Select
  Case 2;Перекладуем из банка.
    Select ID_BagIn%
      Case 0;В никуда.
        p\Bank[SlotNumOut%]=0
      Case 1;В сумку.
        TempItem%=p\Bag[SlotNumIn%]
        p\Bag[SlotNumIn%]=p\Bank[SlotNumOut%]
        p\Bank[SlotNumOut%]=TempItem%
      Case 2;В другой или в тот же слот банка.
        TempItem%=p\Bank[SlotNumIn%]
        p\Bank[SlotNumIn%]=p\Bank[SlotNumOut%]
        p\Bank[SlotNumOut%]=TempItem%
    End Select
End Select
End Function

П.с. И пусть только какаянить тварь скажет что это говнокод... >>:(
П.сс. Если помогло - клацни спасибо)))
П.ссс. Помогаю только потому что сам щас МОРПГ шаманю по чучуть(ну как мморпг, человек 100 потянет стабильно, покачто, пока возможностей мало и игровой мир не приукрашен), вот только мну не удовлетворяет DX7, а Ксорс дорогой, илиже SPE бажный...

SergSS 06.12.2010 19:48

Ответ: Нужна функция для работы с массивами.
 
Спасибо за код, идея интересная, но правд не совсем то все же)

Crayzi 06.12.2010 20:15

Ответ: Нужна функция для работы с массивами.
 
Цитата:

Сообщение от SergSS (Сообщение 171160)
Спасибо за код, идея интересная, но правд не совсем то все же)

Опять говориш както непонятно))) "но правд не совсем то всеже", я так понял эт типо "не совсем то что надо"? Ну дык я показал пример того, что как я понял ты хочеш сделать, если не то, то я хз... Если ты хотел сделать предметы с таймерами и т. д., прийдется сделать дополнительные массивы с данными(эт предположение)... там немного менять. Ну а так я те идею подал, если это не то что надо, то надо выражатся понятнее чем "обновление предметов"...

is.SarCasm 06.12.2010 20:22

Ответ: Нужна функция для работы с массивами.
 
Цитата:

а Ксорс дорогой
Если не ошибаюсь, то могут лицензию просто "подарить", но только если у него есть будущее.

Crayzi 06.12.2010 21:23

Ответ: Нужна функция для работы с массивами.
 
Цитата:

Сообщение от is.SarCasm (Сообщение 171165)
Если не ошибаюсь, то могут лицензию просто "подарить", но только если у него есть будущее.

оО, всмысле у кого есть будующее? У проэкта? ...шансов что у моего проэкта есть будующее маловато, его делаю только я, моделить у мну плохо получается, текстурщик с мя вообще никакой))) да и мой код оставляет желать лучшего...
П.с. Как определяется что у проэкта есть будующее? Я тож так научится хочу:)

is.SarCasm 06.12.2010 21:51

Ответ: Нужна функция для работы с массивами.
 
смотри на EvilChaotica и пускай слюни

SergSS 06.12.2010 21:52

Ответ: Нужна функция для работы с массивами.
 
Вложений: 1
Вот собственно пример того что делаю, пока не оптимизирован, но кое-как работает! да, пока коряво, но не понимаю почему не работает как надо... В чем ошибка может быть?:dontknow:

Crayzi 06.12.2010 22:10

Ответ: Нужна функция для работы с массивами.
 
Цитата:

Сообщение от SergSS (Сообщение 171183)
Вот собственно пример того что делаю, пока не оптимизирован, но кое-как работает! да, пока коряво, но не понимаю почему не работает как надо... В чем ошибка может быть?:dontknow:

Ну вроде все переносится, в чем ошибка то?
П.с. Ппц не привычно чей-то код читать, с теми функциями какими никогда не пользовался)))

SergSS 06.12.2010 22:15

Ответ: Нужна функция для работы с массивами.
 
кнопками 1 и два можно заново открыть сумки, иконкой в углу - закрыть.... только что понял в чем ошибка, но не могу найти ее... вопрос в том что обновляется только первая сумка в списке... т.е. когда ты закрываешь сумку - она удаляется, когда открываешь - создается заново.
теперь если мы создаем две сумки "сумка 1" и "сумка 2" они располагаются в массиве типов "Box" по прядку и обновляется только "сумка 1" теперь, если закрыть первую и открыть заново то в типах они уже будут в др порядке: "сумка 2" и "сумка 1" и обновляться будет только вторая...
вот щас буду думать в чем косяк...

Crayzi 06.12.2010 22:27

Ответ: Нужна функция для работы с массивами.
 
Цитата:

Сообщение от SergSS (Сообщение 171191)
кнопками 1 и два можно заново открыть сумки, иконкой в углу - закрыть.... только что понял в чем ошибка, но не могу найти ее... вопрос в том что обновляется только первая сумка в списке... т.е. когда ты закрываешь сумку - она удаляется, когда открываешь - создается заново.
теперь если мы создаем две сумки "сумка 1" и "сумка 2" они располагаются в массиве типов "Box" по прядку и обновляется только "сумка 1" теперь, если закрыть первую и открыть заново то в типах они уже будут в др порядке: "сумка 2" и "сумка 1" и обновляться будет только вторая...
вот щас буду думать в чем косяк...


Я кажись понял про что ты, только у мя чуть по другому както получилось, если закрыть только 1 или 2 окно, а потом его открыть то все предметы на местах, а если закрыть оба то вайп(обнуляются).
А на счет обновления я ща попробую разобратся, бо ничё не понял... В чём вообще смысл их обновлять?
Слуш, я закомментировал:
Код:

;box111[i]=RefreshBox(box111,i)
;box222[i]=RefreshBox(box222,i)

и инвентарь стал становится таким как в самом начале, после закрытия/открытия обоих окон...
Кстати, у тя в функции RefreshBox... присутствует функция "Goto", мож ты ею не прально пользуешся? Кстати, на функцию "Goto" много не хороших слов говорят... типо умные... типо программисты :-D


Часовой пояс GMT +4, время: 00:23.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot