?

Log in

No account? Create an account
Игра [entries|archive|friends|userinfo]
Влад

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

LVY Age Run [May. 7th, 2016|04:02 pm]
Влад
[Tags|]

Уже почти полгода я каждый месяц запиливаю простенькую игрушку для onegameamonth.com. Срыв сроков за это время получился всего один раз, а на отчет сил хватает не всегда.
Результат апреля можно увидеть тут:



Что это за ерунда?

Тема месяца была «AGE». В широком смысле слова. Хочешь, пиши про век, хочешь – про возраст, хочешь – про процесс старения. После долгих раздумий, была придумана простая концепция: герой пытается дожить до Технологической Сингулярности, чтобы загрузить свое сознание в сеть и стать бессмертным. Отражается это в виде бегущего силуэта, который с помощью прыжков пытается уклониться от вредных привычек и приобрести полезные.
Задача: пробежать дистанцию при том, что здоровье постоянно убывает.
Управление: «пробел» для прыжка, «Esc» для паузы.



Курение в спортивном зале

Собираемые в ходе игры привычки разделены на две категории: временные и постоянные. Временные (курение, алкоголь, спорт) действуют несколько секунд. Постоянные (диета и переедание) действуют постоянно, зато отменяют друг друга. Все привычки умножают скорость убывания здоровья на свой коэффициент (вредные – на повышающий, полезные – на понижающий).

Камера, анимация и бесконечный бег

В этот раз я сам заставил камеру следовать за персонажем (в феврале для этих целей пришлось взять чужой код). У меня осталось ощущение, что движение вышло малость скачкообразным, но это могут быть и глюки восприятия. :)
За анимацию бега мне было бы стыдно, если бы не ряд причин. Во-первых, я делал её утром перед отлетом в отпуск, потратив на неё около часа. Во-вторых, это вообще первый раз, когда я делал хоть какую-то анимацию. В-третьих, кривизна моих рук в вопросах любого рисования такова, что я пять минут пытался придумать к ней подходящий эпитет и не смог.
Чтобы реализовать бесконечный бег, пришлось сжульничать. Герой честно бежит по прямоугольнику размером чуть больше окна камеры, но когда он пробегает один «метр» (один тайл), то поверхность скачком смещается вправо на этот самый «метр».

А больше про эту игрушку и сказать-то нечего. :)
Ссылка для игры в браузере (р
аботает только в IE, Firefox и Opera): https://egoludens.itch.io/age-run?secret=17NtnmbJRZgnX7X7QS5FrcJmW8
linkpost comment

LVY Procrastination [Jan. 31st, 2016|10:24 pm]
Влад
[Tags|]

Прокрастинаторы прокрастинировали-прокрастинировали, да не выпрокрастинировали. :)

Я запилил очередную игршку для развлечения и саморазвития. Кажется, получилась полная фигня, но для меня этот микропроект оказался ценным уроком. Пока я его делал, узнал несколько интересных мелочей, осталось заставить себя написать post mortem.

Есть такой сайт -
http://www.onegameamonth.com - это что-то вроде game jam, только без соревновательного элемента. Участникам предлагается создавать по одной игре каждый месяц. Никаких правил и ограничений нет, кроме тех, которые ты придумываешь себе сам. Но есть геймификация (за создание игр ты получаешь "экспу" и "уровни") и возможность посмотреть, что делают другие. В качестве бонуса ежемесячно объявляется необязательная тема для использования в игре. Вот я и решил попробовать сделать игру в рамках этого сайта. На самом деле, в декабре я одну уже делал, но - прокрастинация! - так и не собрался написать про нее.

В январе 2016 темой было объявлено хобби. Тут-то я и растерялся: у меня вообще-то мало хобби, а таких, чтобы с моими [близкими к нулю] навыками сделать про это игру - вообще нет. В итоге я решил выкрутиться, в некотором роде, рекурсивным методом – написать игру про написание игр:

Делалось все снова на Unity3D, язык программирования C#.

Локализация

Это первый случай, когда я пишу игру, поддерживающую два языка: английский и русский. В отличие от прошлого раза (про который я так и не собрался написать), о локализации я задумался с самого начала и заложил ее в архитектуру. Я сделал маленький компонент (класс, описывающий поведение объекта в Unity), который отслеживает изменение языка игры и в момент изменения меняет надпись на объекте, с которым связан данный экземпляр класса. В итоге получилось довольно удобно:
Прокрастинация - скрин 2.png

Прогресс-бары

В игрушке активно используются прогресс-бары. Как выяснилось, в Unity3D есть стандартный шаблон для рисования бегунка. Если оторвать у него ручку (сделать сам бегунок невидимым и отключить возможность управления пользователем), то получается неплохой прогресс-бар. :)



Генератор названий

Это была одна из самых интересных для меня частей проекта. Идея очень простая – есть небольшой набор слов (я использовал по одному прилагательному и одному существительному на каждую букву алфавита – ну, кроме Ы, Ь и Ъ) и набор шаблонов названий (тут я обошелся вообще двумя вариантами: комбинацией из двух существительных и комбинацией прилагательного и существительного). Так как в русском языке прилагательные имеют род (м/ж/с), а в английском – нет, то со временем пришлось прикрутить еще и согласование существительного и прилагательного. В итоге система, несмотря на примитивность, рождала забавные названия:

  • Распущенная зима

  • Капитан и накипь

  • Горе и счастье

  • Грязный якорь

  • Честная щука

  • Engines of The Flight

  • The Sandy Aberration

  • Darkness of The Xenophobe

  • The Delicate Knight

  • The Indecisive Soul

И так далее. :)

Прокрутка

Неожиданные проблемы вызвала, казалось бы, простая задача: окошко, в котором выводится некий контент (в моем случае список завершенных проектов) с возможностью прокрутки. У меня постоянно получались какие-то дикие изощрения: то двигалось само окно вместо контента, то контент отрисовывался в полном размере без учета размера окна, то появлялась возможность прокрутки окна до состояния «контент уехал за пределы видимой области и уже никогда не вернется». В итоге получилась слегка костыльная, но работающая система. Остался только один побочный эффект – объекты, из которых состоит контент, почему-то называются “deleted gameobject”. При этом, во-первых, с точки зрения пользователя все работает хорошо, а во-вторых, проблема проявляется только в одном списке из двух, причем механизмы в них, вроде как, одинаковые. Так что на эту мелочь я решил забить, сделав на будущее пометку – Unity, кажется, не нравится моя манера в одном и том же кадре очищать Layout Vertical Group и заполнять ее заново.

Картинки

Тут я все нарисовал в Пэйнте, потратив на каждую картинку, иллюстрирующую деятельность, не более 30 секунд. Комментарии излишни:



Я откладывал это пост до последнего, прямо вот по этой картинке:



Игру можно скачать тут:
https://yadi.sk/d/6NWZ_Cseo5DJt
link1 comment|post comment

LVY Pong [May. 10th, 2015|06:00 pm]
Влад
[Tags|]

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

Pong.

Стопицотый клон понга.

Спасибо движку Unity3D, берущему на себя массу работы. Тем не менее, даже с ним я допустил классическую ошибку планирования, недооценив объем работы. Морально я был к этому готов (особенно, учитывая наличие в семье грудничка, который требует внимания - и ЧАСТО). Но все равно было познавательно. Казалось бы, что сложного в ЭТОМ:


Выяснилось, что нюансов (как обычно) значительно больше, чем видно извне. Я постараюсь перечислить запомнившиеся. Может, когда-нибудь, посмеюсь над тем, каким я был нубом (в конце концов, однажды в 2006 на работе я "додумался" при закрытии месяца сохранять временные значения в реквизите справочника номенклатуры;1С-ники поймут, насколько это был аццкий быдлокод). :)

Ограничение движения платформ по вертикали.

Сначала я попробовал использовать 2D-физику движка и поставить невидимые твердые тела по краям игрового поля. Это привело к интересным побочным эффектам. Во-первых, хорошо разоганные платформы останавливались у границ поля не моментально, а с небольшим отскоком от стены. Выглядело это забавно и был небольшой соблазн так и оставить, но я решил, что в паре я+движок главным должен быть все-таки я. Во-вторых, после нескольких ударов платформой по границе игрового поля обнаружилось, что платформа слегка поворачивается. :) Видимо, граница игрового поля тоже сдвигалась от упругих ударов, т.к. движок честно отрабатывал столкновение двух твердых тел. :)

Можно было просто поставить ограничитель по координатам, но это я делать уже умел, а хотелось использовать более гибкий подход. В итоге, обработка столкновений была сделана вручную: стенка, обнаружив прикосновение к ней платформы, посылала той указание обнулить вертикальную скорость. Появился новый забавный нюанс: так как я привязывался к началу пересечения стенки и платформы, то после остановки платформы объекты оставались в "пересеченном" состоянии. Поэтому повторная попытка выехать за границу игрового поля была успешной - новое столкновение не возникало и скорость не обнулялась. Проблема решилась так: после обнуления скорости координаты платформы меняются так, чтобы она оказывалась прижатой к границе, но все-таки не пересекалась с ней.


Пунктирная линия в центре поля

Вот уж где не ожидал подвоха. Все казалось простым: рисуешь маленький участок пунктира и мостишь им полоску от верха до низа поля. Но выяснилось, что движок Unity поддерживает тайлинг только для 3D объектов, а отрисовщику спрайтов такая роскошь недоступна. Проблему решил следующим образом: рисую один растянутый спрайт в нужной мне области и цепляю к нему самописный скрипт, который создает несколько клонированных объектов с нерастянутым спрайтом в области исходного спрайта, после чего отключает отрисовщик исходного спрайта. Получился закат солнца вручную, но хотя бы относительно универсальный.

Одновременная обработка двух столкновений

Когда квадратик мячик уже бодро летал по игровому полю, отражаясь от стенок и платформ, выяснилось, что при попадании шарика в угол, где одновременно есть платформа и граница поля, происходит отражение шарика за границы игрового поля, т.к. результат отражения от платформы обрабатывался позже и аннулировал результат отражения от стенки. Решил так же, как с проникновением платформы за границу поля - небольшим изменением координат мячика после столкновения.

Пользовательский интерфейс

Несмотря на его примитивность, попил мне крови. Во-первых, методика расчета координат элементов GUI отличается от аналогичной у объектов. Пришлось попотеть с курсором, прежде чем я понял, что я совершенно зря меняю Transform вместо RectTransform. :) И еще пришлось часок потыкаться в разные подходы при организации паузы в игре (кнопка Esc, если чо). Менять скорость времени я не хотел, поэтому пришлось сохранять скорости всех движущихся объектов и обнулять их на время паузы. А при снятии с паузы - восстанавливать. И добавить в код управления платформами проверку на установку паузы. Получилось не элегантно, но работает.

Взамодействие между объектами

Сначала я нашел метод SendMessage() и использовал его в хвост и в гриву. :) Потом все-таки научился использовать обращаться к public-переменным и сделал Singleton, хранящий состояние основных параметров игры. Он же используется для передачи данных из GUI в игровой процесс и обратно. В итоге в архитектуре есть много ненужных ссылок объектов друг на друга, но исправлять уже не хочется. Учту в следующем проекте. В конце концов, это и была одна из целей создания LVY Pong - наступить на основные грабли и обойти их в следующий раз.

Вот, собственно, и все. Спасибо тем, кто дочитал (хоть я и сомневаюсь в вашем существовании). :)
Ссылка на скачивание игры: https://yadi.sk/d/0A_MIP2XgXwsr
(инсталлятора нет, тупо запускается exe-файл)

link3 comments|post comment

10 questions & answers (using List 1) [Mar. 13th, 2013|04:27 am]
Влад
[Tags|]

Rekke's emissary was weird. Bald head, facial tattoos and forked tongue were giving Orchid creeps, not to speak about clothing.

'So, the mighty Whipsaw finally decided to send someone,' said freak mockingly. 'Did he decided to learn to appreciate his neighbours?'
'I guess he decided to let Rekke keep you freaks in line... I mean, let the passionate leader energize his team himself.' grunted Krin.

'Please, be polite to the guy,' Orchid replied softly. 'Don't you see his whole-hearted commitment to principles of his community?'
Krin smiled. 'I see an arrogant scum just asking for a lesson of politeness. Tell him what we need and let's get this over with.'

'Forgive my colleague. Sometimes his integrity is just a bit too overt,' readhead smiled. 'Whipsaw send us to kindly ask your community for help with some technical issues. Will you help us?'
'You guys have some nerve talking like that. Whipsaw must be set for decisive actions.'

Freak paused for a couple of seconds, 'Rekke's a one hell of a principled chum. I'll relay your plea to him. You better make it worth it though. What is exactly what you need?'
'Access to your spare parts storage. And hands-off policy for our tech guy.'

'I get it,' emissary grinned. 'Valuable asset and all that. Problem with water, eh?'
'Wha-' Krin was clearly shocked, 'How did you-?' he regained control of himself. 'I guess someone was way too collaborative...'

'We understand your problems,' murmured freak. 'Let no one say Rekke won't show some empathy to his thirsty neighbor. But friendship is two-way street. How about you let us establish a mission at your settlement? Maybe even help us spread the word of God.'
Krin looked like he was ready to explode. 'I think Whipsaw won't appreciate this,' Orchid quickly intervened. 'I personally don't have anything against it, but boss will definitely think you're going to interfere with the settlement affairs.

'Sometimes one doesn't know what makes him tick.' Emissary shrugged, 'But I guess you're right. Whipsaw is way too arrogant to share his authority over people souls. Too bad. Will you at least let your people come to us for water? Or should they die because of your boss' stubborness?'
'Or we could just... take over your little madhouse,' Krin said threatingly.

'Stop it, both of you!' girl cried loudly. 'Just think through all implications. Bloodbath won't solve anything and could lead both parties to demise. If we let you build your church in the view of settlement instead of opening your mission, will it suffice?'
'Frankly, no. But the alternatives are clearly worse. So I'll tell Rekke about your offer. We aim to get on well with everyone, after all.'

'But,' he continued, 'are there any guarantees that if we build our humble shrine, you won't prohibit your people to visit it?'
'You know, as long as you stick to your end of bargain, I think we'll figure it out somehow. Maybe hands-off policy shouldn't be applied to our guy only...'

...

'I still think we're able to just take what we want and shoot everyone who has trouble with that.' said Krin on the way back to settlement, 'Why should we let these wackos instill false faith in our people?'
'You should work on your interpersonal skills, Krin. He knew what we needed. If we come to Rekke with guns blazing, he'll run away damaging water filter beyond repair before that. He can sacrifice his cult, but we can't do this to Peanut Creek. So we'll have to deal with his 'humble shrine' later. But for now our primary concern is plain survival.'
linkpost comment

(no subject) [Feb. 26th, 2013|01:28 am]
Влад
[Tags|]

'Ten days to fix water filtering system? You're nuts!' Whipsaw was furious and Fuse didn't know what to do. 'What do you think we'll drink for ten days? Mud? I give you three days and you better have good news after that or I'll make sure everybody knows who's responsible for water rationing!'
Door slammed shut as Whipsaw walked out. Fuse didn't moved an inch. He felt like he was just crushed, burned and buried. Filtering system was damaged badly and it just wasn't honest to blame Fuse for something he didn't break. Yet the critcism wasn't totally uncalled for - Fuse was busy last week and skipped maintenance.
'Feeling down?' soft voice disrupted Fuse's trail of thought.
'Hi, Orchid,' he replied. 'Came to see the worst tech-guy on the whole west coast?'
'Shut up, honey. Boss is really mad at you, I know. Couldn't help but overheard your argument. But that's definitely not a good reason to stare idly into the void and belittling yourself. What are you going to do?'
Fuse shook his head. 'I don't know. Thing is broken and I don't have spare parts to fix it. I could make them myself but that's going to take a couple of days. So looks like I'm a dead man. Maybe I should just run aw-'
His cheek burnt as Orchid slapped him.
'Don't. Even. Think. About it,' she said. 'We all gonna die without you. Seriously, you're our key to survival. So if you say we need to do something - we do it. Order us to jump and we'll ask you how high. Because we need water. That means we need you. All of us." Fuse blushed, but readhead girl continued her speech, 'Tell me, do we have a chance to obtain those spare parts you need?'
'Well...' Fuse's fase lighted up, 'In fact, Rekke may have them. They have the same type of water filtering system. But how do we-'
'Just tell that to Whipsaw.'
'He'll rip me apart... Besides I coudn't even say a word to him after today's situation'
Orchid sighed.
'Fuse, honey, listen to me. You can do it. Fake it. Just put on your bravest face, speak calmly and don't shake. I believe in you. Trust me, you'll feel better after that. That's called facial feedback. Not only your mood affects your attitude - it works both ways.'

An hour later, Fuse walked out of Whipsaw's compound. His heart raced, his back was sweaty but for a moment he felt like king of the world. Whipsaw agreed with him and ordered to prepare a negotiation team for a visit to Rekke's madhouse.
'Well,' said Fuse to himself, 'maybe I'm not a total wreck after all.'
linkpost comment

(no subject) [Feb. 21st, 2013|12:17 am]
Влад
[Tags|]

Task I

Ruling a settlement in a post-apocalyptic world requires a certain managerial talent and dedication. When the world crumbles and everything becomes a threat, someone has to step up and take over disorganized bunch of people trying to make a living. Whipsaw was one of those decisive people, a passionate yet brutal leader, always ready to bash some skulls in. His autocratic approach made people afraid of him, leaving him alone in his walk of life.
As time passed and Peanut Creek grown to a holding with a size of about a hundred souls, Whipsaw had to give up on micromanagement and appointed Krin and Fuse as his trusted Lieutenants. Fuse, who got in charge of managing supplies, was a tech-savvy guy, always weighting up a situation before taking any action. Krin, a heavy-built freaky scarred guy overtly inclined to violence, became responsible for guarding the settlement, foraging and keeping troublemakers in line. Another valuable asset to Peanut Creek was Orchid, green-eyed redhead girl, always optimistic and instilling hope in people. Knowing what makes people tick, Whipsaw allocated some resources to help her set up her own theater with volunteer actors, bolstering morale in settlement.
Things were going steady (and that was a rarity in this wasted world) until Rekke, arrogant leader of some wicked cult residing nearby, decided to interfere...

Task II

A: Good morning, colleagues. Take your seats, please. I have to announce the upcoming changes in our company's structure. A decision was taken by our CEO, that we must raise the percentage of automated opeartions in our assembly lines. We estimate that we'll be able to let go about 20 percent of our assembly workers.
B: Gosh, Andy, you're talking about massive lay-offs! Personally, I undestand the reasons for this decision, but I'm really concerned about leaving so many people without a job. What about our social obligations?
A: That's a valid point, but I really don't see this as a problem. Qualified assembly workers should find a new job easily. Severance packages also won't hurt.
B: Are there any guarantees that those severance payments will be enough? I don't want some luddite wacko to come here with a revenge mission and Molotov cocktail!
A: It would be three times their monthly salary. That should be enough for everybody. Besides, in the longer term the benefits are clear for everybody. Fired people will get a bonus and our company will be more effective and competitive.
B:OK, I can see your point... But can you assure us that at least we won't fire the couples working together? I don't want to feel responsible for others' family troubles.
A: My understanding is that we support the Famiy Company Policy, so they should be safe.
B: Hmmm, I like the idea of further assembly automation, but that would be a challenging task to communicate this decision down to factory areas and I'm not happy about me doing it.
A: Let's give this a chance to work! You are crucial to make this decision come to life smoothly and I'm sure you'll handle it all right. Just remember, we all work as a team, so don't be afraid to ask me for help if you'll need some.
B: Well, I'm already feeling better. Let's buck up and do what I have to do!
linkpost comment

Moscow style plaque [Feb. 12th, 2012|12:30 pm]
Влад
"В этом доме с 19.. по 19.. жил и работал ученый Иванов И.И.
А сейчас тут офисы и две элитных квартиры."


Запись сделана с помощью m.livejournal.com.

linkpost comment

Политота [Oct. 16th, 2011|12:15 pm]
Влад
http://www.youtube.com/watch?v=unsi_QTS2E4&feature=colike
linkpost comment

(no subject) [Oct. 7th, 2011|02:30 am]
Влад
Читайте и думайте.

http://bjorn-varulv.livejournal.com/59694.html


linkpost comment

Привет, слабовидящие! [Sep. 24th, 2011|01:16 am]
Влад
[состояние |annoyedannoyed]

Теоретически, рельефная плитка должна тактильно предупреждать слепых и слабовидящих об опасном участке (обычно в роли опасности выступает автомобиль).
На улице Новослободской, впрочем, рельефная плитка сама является опасностью для невнимательных пешеходов. В таком состоянии она уже больше недели (фото от 12 сентября 2011):





linkpost comment

navigation
[ viewing | most recent entries ]
[ go | earlier ]