Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 05.12.2010, 20:20   #1
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Вопрос Нужна функция для работы с массивами.

Добрый день! Столкнулся со следующей проблемой:
Мне нужна функция которая делает некоторые операции с массивом и затем записывает изменения в исходный массив, т.е. делаю так:
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
Код очень приближенный, но думаю логика понятна.
На сколько знаю, функция не способна возвращать массив, а значит приходится перебирать все элементы массива вне ее...
Задача в том, что для функции должно быть не важно под каким именем в нее пихают массив заранее оговоренного размера, но вся проблема в том, что не хотелось бы в теле цикла перебирать все массивы, которым придется обращаться к этой функции. Можно ли как-нибудь сделать так, чтобы функция автоматически записывала все изменения в исходный массив?
Не уверен на сколько понятно удалось изложить мысль, но буду благодарен любой помощи! Спасибо!
(Offline)
 
Ответить с цитированием
Старый 05.12.2010, 22:09   #2
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

Сообщение от SergSS Посмотреть сообщение
На сколько знаю, функция не способна возвращать массив, а значит приходится перебирать все элементы массива вне ее...
Возможно ошибаюсь но те надо ковать функцию: "CreateBank ([size])".
Сообщение от SergSS Посмотреть сообщение
Задача в том, что для функции должно быть не важно под каким именем в нее пихают массив заранее оговоренного размера, но вся проблема в том, что не хотелось бы в теле цикла перебирать все массивы, которым придется обращаться к этой функции. Можно ли как-нибудь сделать так, чтобы функция автоматически записывала все изменения в исходный массив?
Если честно никак не могу понять вопроса, может эт я уже отупел, по возможности перевразируй или объясни по другому... ...Как массивы могут обращатся к функции?...

.......................
Некоторое время спустя...
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
Случаем не это мел введу?
(Offline)
 
Ответить с цитированием
Старый 05.12.2010, 23:02   #3
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Нужна функция для работы с массивами.

Спасибо за ответ не совсем понял пока чем банки отличаются от массивов, мозг наверн щас уже не варит, но почитаю!
а задачу перефразирую так - есть функция отрисовки массива и изменения значения в некоторых его элементах, т.е. каждому числу соответствует картинка+ часть элементов в функции меняется. Мне нужно чтобы запихивая в нее разные массивы по ходу программы функция изменяла только тот массив который в нее пихнули. можно ли как нить функции передать имя массива и работать с ним в функции или ссылку на этот массив...
т.е. я передаю массив некоторой функции, например RefreshMassiv(IshodnyjMassiv) и она должна изменить значения в этом массиве и перезаписать его, потом я передаю в нее другой массив RefreshMassiv(EweMassiv) и изменения должны записаться уже в EweMassiv.
(Offline)
 
Ответить с цитированием
Старый 05.12.2010, 23:33   #4
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

Короче я понял, у тебя есть массив, он заполнен изображениями, таких массивов несколько, тебе надо функция для обработки какого либо из массивов?
Допустим
Test[10]
test2[10]
?
Но я всеравно не пойму для чего функция обновления массивов? Что именно ты собираешся с ними делать? какие данные там будут кроме картинок?
Можно какойнить пример с тем как ты собираешся обновлять картинки...
(Offline)
 
Ответить с цитированием
Старый 05.12.2010, 23:58   #5
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Нужна функция для работы с массивами.

Смотри, самый простой пример это реализация сумок и окон торговли во всяких рпг. Т.е. есть один массив - сумка1, есть другой - сумка2. я передал эти два массива по очереди в функцию отрисовки и перетаскивания мышкой из одной в другую. Допустим есть десяток сумок или окон торговли я хочу сделать универсальную функцию, которая бы брала массив-сумку и отрисовывала. Затем я беру и выкидываю(зануляю) мышкой один из элементов массива, теперь мне нужно чтобы исходный массив-сумка занулил или изменил соответствующий элемент(обновился/перезаписался).
К сожалению, нет примера, чтобы норм показать, то что пишу очень путано, т.к. споткнулся на том, что изменения происходят у меня лишь внутри функции, но не записываются в массив который к ней обратился.
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 00:49   #6
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Сообщение Ответ: Нужна функция для работы с массивами.

Ну тут тебе надо сделать просто функцию в которой будут заложены определенные действия в зависимости от ситуации.
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 бажный...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
SergSS (06.12.2010)
Старый 06.12.2010, 19:48   #7
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Нужна функция для работы с массивами.

Спасибо за код, идея интересная, но правд не совсем то все же)
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 20:15   #8
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

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

Последний раз редактировалось Crayzi, 06.12.2010 в 21:27.
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 20:22   #9
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 428 пользователей)
Ответ: Нужна функция для работы с массивами.

а Ксорс дорогой
Если не ошибаюсь, то могут лицензию просто "подарить", но только если у него есть будущее.
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 21:23   #10
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

Сообщение от is.SarCasm Посмотреть сообщение
Если не ошибаюсь, то могут лицензию просто "подарить", но только если у него есть будущее.
оО, всмысле у кого есть будующее? У проэкта? ...шансов что у моего проэкта есть будующее маловато, его делаю только я, моделить у мну плохо получается, текстурщик с мя вообще никакой))) да и мой код оставляет желать лучшего...
П.с. Как определяется что у проэкта есть будующее? Я тож так научится хочу
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 21:51   #11
is.SarCasm
Бывалый
 
Аватар для is.SarCasm
 
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений
(для 428 пользователей)
Ответ: Нужна функция для работы с массивами.

смотри на EvilChaotica и пускай слюни
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 21:52   #12
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Нужна функция для работы с массивами.

Вот собственно пример того что делаю, пока не оптимизирован, но кое-как работает! да, пока коряво, но не понимаю почему не работает как надо... В чем ошибка может быть?
Вложения
Тип файла: rar Gui_Torg.rar (133.0 Кб, 468 просмотров)
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 22:10   #13
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

Сообщение от SergSS Посмотреть сообщение
Вот собственно пример того что делаю, пока не оптимизирован, но кое-как работает! да, пока коряво, но не понимаю почему не работает как надо... В чем ошибка может быть?
Ну вроде все переносится, в чем ошибка то?
П.с. Ппц не привычно чей-то код читать, с теми функциями какими никогда не пользовался)))
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 22:15   #14
SergSS
AnyKey`щик
 
Регистрация: 05.12.2010
Сообщений: 10
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Нужна функция для работы с массивами.

кнопками 1 и два можно заново открыть сумки, иконкой в углу - закрыть.... только что понял в чем ошибка, но не могу найти ее... вопрос в том что обновляется только первая сумка в списке... т.е. когда ты закрываешь сумку - она удаляется, когда открываешь - создается заново.
теперь если мы создаем две сумки "сумка 1" и "сумка 2" они располагаются в массиве типов "Box" по прядку и обновляется только "сумка 1" теперь, если закрыть первую и открыть заново то в типах они уже будут в др порядке: "сумка 2" и "сумка 1" и обновляться будет только вторая...
вот щас буду думать в чем косяк...
(Offline)
 
Ответить с цитированием
Старый 06.12.2010, 22:27   #15
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Нужна функция для работы с массивами.

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

Я кажись понял про что ты, только у мя чуть по другому както получилось, если закрыть только 1 или 2 окно, а потом его открыть то все предметы на местах, а если закрыть оба то вайп(обнуляются).
А на счет обновления я ща попробую разобратся, бо ничё не понял... В чём вообще смысл их обновлять?
Слуш, я закомментировал:
;box111[i]=RefreshBox(box111,i)
;box222[i]=RefreshBox(box222,i)
и инвентарь стал становится таким как в самом начале, после закрытия/открытия обоих окон...
Кстати, у тя в функции RefreshBox... присутствует функция "Goto", мож ты ею не прально пользуешся? Кстати, на функцию "Goto" много не хороших слов говорят... типо умные... типо программисты
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com