Розробка ігрової програми для мобільних пристроїв з сенсорним екраном

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    372,92 Кб
  • Опубликовано:
    2014-07-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Розробка ігрової програми для мобільних пристроїв з сенсорним екраном

Київський національний університет імені Тараса Шевченка Факультет кібернетики Кафедра інформаційних систем









ВИПУСКНА КВАЛІФІКАЦІЙНА РОБОТА БАКАЛАВРА на тему:

РОЗРОБКА ІГРОВОЇ ПРОГРАМИ ДЛЯ МОБІЛЬНИХ ПРИСТРОЇВ З СЕНСОРНИМ ЕКРАНОМ

студента 4 курсу Чупірчука Павла Миколайовича

Науковий керівник:

кандидат фізико-математичних наук, доцент

Іванов Євгеній Олександрович

Робота заслухана на засіданні кафедри інформаційних систем та рекомендована до захисту в ДЕК, протокол № від 2011 р.

Завідувач кафедри інформаційних систем проф. Провотар О.І.




Київ - 2011

Зміст

 

Вступ

Розділ 1. Ігрові програми

1.1 Історія розвитку

1.2 Жанри комп’ютерних ігор

Розділ 2. Мобільні пристрої з сенсорними екранами

2.1 Історія виникнення сенсорних екранів

2.2 Принципи роботи сенсорних екранів

Розділ 3. Java Platform, Micro Edition

3.1 Загальна інформація

3.2 Профілі і конфігурації

Розділ 4. Завдання

4.1 Постановка задачі

4.2 Опис гри

Розділ 5. Реалізація

5.1 Загальна модель

5.2 Програмна реалізація

5.3 Отримані результати

Висновки

Список використаних джерел

Додатки

Вступ

Люди завжди любили присвячувати свій вільний час усілякого роду іграм. З розвитком культури і технологій виникали все нові і нові ігри. В наш час надзвичайно популярними, особливо серед молоді, стали різноманітні відеоігри, що створює не малий попит на розробку ігрових програм. В світі існує не мало компаній, основною діяльністю яких є розробка комп’ютерних ігор. Над створенням кожної серйозної гри працюють великі колективи професіоналів, які займаються різними аспектами: розробкою концепції і сюжету гри, дизайну і графіки, програмування фізики гри, та ігрового процесу загалом. Постійний розвиток ігрової індустрії, створює в свою чергу попит на відповідних фахівців.

Комп’ютерні ігри розробляються для різних платформ та пристроїв, починаючи від персональних комп’ютерів і спеціальних консольних приставок, закінчуючи мобільними телефонами. До недавнього часу створення масштабної гри для мобільного телефону було практично не можливим, в силу обмеженості ресурсів пристрою і способів вводу інформації. Зараз, потужність деяких з нових моделей телефонів перевищує характеристики середньостатистичних настільних комп’ютерів десятирічної давності, що дозволяє створювати ігри набагато вищого рівня.

Використання сенсорних екранів як альтернативи клавіатурі дало додатковий поштовх для розвитку ігрових програм для мобільних пристроїв. По-перше відсутність жорсткої клавіатури збільшило розмір екрану, а отже і поле для розгортання гри. По-друге сенсорний екран дає можливість створювати різноманітні графічні інтерфейси не прив’язуючись до конкретного пристрою. По-третє ігри, які потребували для зручності керування маніпулятора типу миша, наприклад стратегії реального часу, тепер можна легко реалізувати для мобільних телефонів, адже сенсорний екран надає дуже зручний спосіб керування ігровим процесом.

Існують різні платформи, що дозволяють розробляти програми для мобільних телефонів. Найбільш універсальною серед них є Java Platform Micro Edition, оскільки вона розрахована на досить широкий спектр пристроїв, в тому числі, підтримуються пристрої з сенсорним екраном. А для роботи прогарами написаної під цю платформу достатньо, щоб на пристрої була встановлена віртуальна Java - машина.

Розділ 1. Ігрові програми


Ставлення людей до ігор носить свого роду ритуальний характер, майже релігійний. Вони дають можливість гравцям увійти в свого роду вищий стан буття, розвиваючи свої навики в нових рамках і отримуючи досвід нових висот. Вони дозволяють звичайним людям пережити неймовірний події, відчути себе воїном, королем чи шпигуном, при цьому фізично залишаючись в безпечному середовищі. Можливо, все це здасться перебільшенням, але безсумнівно, ігри відволікають і розважають нас так, як ні один з інших способів відпочинку.

 

1.1 Історія розвитку


Люди грали в ігри ще з давніх-давен. У Сахарі була виявлена 5000-річна ігрова дошка, висічена з каменю. Популярна у східних країнах гра го, була відома приблизно ще з 2000р до н. е. Нардоподібні ігри, такі, як табула згадувались ще в давньоримських записах, і навіть у Біблії. Карти Таро, що спочатку використовувалися для віщування майбутнього, перетворилася на сьогоднішні гральні карти.

Ще десять - двадцять років тому, єдиними іграми, на які люди витрачали багато свого часу були професійні спортивні ігри, настільні ігри як Монополія чи шахи, ігри з гральним кубиком і картою, як Dungeons and Dragons, і карточні ігри, як покер. Деякі ігри давали можливість заробити гроші, інші для викликали серйозні змагання, але більшість з них просто приносили задоволення.

З появою комп'ютерів, ігри вступили в нову еру. Вони стали однією з основних причин, чому багато людей придбали домашні комп'ютери. Незважаючи на простеньку графіку, граючи в імітатор тенісу, такий, як Pong, або мандрувати по багатому текстовому світі, як Zork - все це стало абсолютно новим видом ігор, які можна грати в будь-який час з найбільш грізним супротивником: дизайнером гри, який наперед запрограмував комп'ютер так, щоб той зміг перемогти людину.

Хвиля ігор - аркад 70-х і 80-х, на чолі з такими хітами, як Pac-Man, підкорила серця і поглинула монетки мільйонів молодих людей. Консольні системи, такі як Magnavox Odyssey, Atari 2600, Mattel Intellivision, і Coleco Vision дали можливість отримувати задоволення від аркадних ігор у себе вдома. Пізніше, в 1985 році, Nintendo Entertainment System здивувала людей приголомшливою графікою і складним ігровими світами; популярною грою того періоду є відома всім Super Mario Brothers. Комп'ютерні ігри перейшли на зовсім новий рівень популярності та визнання з такими бестселерами як Doom, наступний за ним Quake, а потім і Tomb Raider. Ясно, що реалістичні 3D світи стали популярними. Чим більше гра давала можливість гравцеві відчути, наче він справді був в іншій реальності, тим успішнішою ставала.

Графіка стрімко розвивалася і ставала все багатшою, оскільки швидкість і продуктивність 3D карт і процесорів збільшувалась удвічі кожного року. Super Nintendo поступився Sony PlayStation, а насьогодні найновішими є приставки Nintendo Wii, PlayStation 3, а також Xbox 360 від Microsoft.

Цікавий поворот відбувся на шляху розвитку комп’ютерних ігор. В кінці 90-х і початку 2000-х, завдяки таким іграм, як Ultima Online, Everquest і Age of Empires II, а також популярним казуальним веб - іграм, як Pogo, Yahoo Games, і MSN Gaming Zone, стало ясно, що більшості гравців важлива не тільки якість графіки чи деталізація ефектів, але й присутність інших, реальних людей у грі. Багатокористувацькі ігри, давно поширені у середовищі заядлих гравців, стали популярними в широких масах.

У певному сенсі, ігри пройшли замкнуте коло перетворень. Так, вони знову стали служити соціальним цілям, надаючи можливість двом чи більше людям увійти в нові світи, випробувати нові навички разом, взаємодіючи між собою зовсім по-новому.

Поки популярність багатокористувацьких ігор продовжує рости, відбувся ще один великий зсув в парадигмі комп’ютерних ігор.

Стає все важче і важче знайти людей, які не мають при собі - на роботі чи вдома, під час прогулянок чи у відпустці - портативних пристроїв з виходом до мережі, куди б вони не йшли. Будь це КПК, смартфон чи мобільний телефон, люди звикають до можливості з'єднуватися і спілкуватися один з одним в будь-який час, в будь-якому місці і де завгодно.

У найближчому майбутньому портативні пристрої, швидше за все стануть ще меншими і більш спеціалізованими. Телефони розміром з затички для вух, голосові помічники в наручних годинниках, і смарт-чіпи у кредитних карточках все це стає реальністю.

Це продовження змін, які почалася ще в 1970-х роках, з появою персональних комп'ютерів, що витіснили величезні, монолітні обчислювальні машини. Зрозуміло, що мільйони маленьких пристроїв, працюючих разом дадуть набагато більше розподіленої потужності, ніж один великий.

Не дивно, що ігри підтримують цю тенденцію. Звичайно, мабуть не розумно, намагатися досягти вражаючих спец ефектів на маленькому екрані, проте в ігор для мобільних телефонів можуть дати те, що на що не здатні навіть найкращі з консолей: вони завжди з гравцем, і можна грати де завгодно. Це означає не лише те, що грати стало більш зручно, але й створює підґрунтя для розробки абсолютно нових типів ігор, що пристосовуються до нового способу життя. [2]

 

1.2 Жанри комп’ютерних ігор


Жанри комп'ютерних ігор використовуються для класифікації відеоігор відповідно до інтерактивних ігрових дій гравця. Жанр відеогри визначається відповідно до мети гри, незалежно від її сценарію або змісту уявного ігрового світу, на відміну від творів літератури чи кіномистецтва. З іншого боку в сучасних іграх, як правило, змішані декілька жанрів, тому в різних джерелах одну й ту саму відеогру можуть відносити до різних жанрів. Не зважаючи на це між розробниками відеоігор існує домовленість, яка дозволяє віднести розроблену гру до одного з найбільш загальних жанрів або до всіх наявних у грі жанрів разом. Про це анонсується при розробці й повідомляється у рекламно-маркетингових кампаніях при продажу відеогри.

До найзагальніших жанрів можна віднести такі:

·        RPG (Role playing game) - рольова гра. Мета ігрового процесу полягає у виконанні різноманітних завдань та розвитку ігрового персонажа або групи, а також втілення в свого персонажа і виконанням його ролі.

·        Пригодницькі ігри, або квести. В іграх цього жанру гравець управляє персонажем, який рухається по сюжету та взаємодіє із навколишнім світом в рамках певної історії та виконує зумовлені сценарієм завдання для досягнення мети пригодницької гри. При цьому може виникати необхідність розв'язувати розумові задачі для руху сюжетною лінією. Сам сюжет може бути лінійним або залежати від дій гравця.

·        Ігри - симулятори призначені для імітації дійсності, вони відображають певні реальні явища та фізичні властивості у віртуальному середовищі. Існує чимало піджанрів, як-от: технічні (управління складними технічними пристроями, авіаційною технікою та інші), аркадні (відрізняються спрощеною фізичною моделлю), спортивні, економічні та інші.

·        Стратегічні ігри (Strategy). Сенс гри полягає в плануванні і вироблення певної стратегії для досягнення якоїсь конкретної мети, наприклад, перемоги у військовій операції. Гравець керує не одним персонажем, а цілим підрозділом, підприємством чи навіть державою. Розрізняють покрокові стратегічні ігри, де гравці по черзі роблять ходи, і стратегічні ігри в реальному масштабі часу (RTS - Real-time strategy), в яких всі гравці виконують свої дії одночасно.

·        Action - екшн. В іграх такого жанру необхідно використовувати рефлекси та швидкість реакції для подолання ігрових обставин. Це, можливо, один із базових жанрів й водночас найпоширеніший. Як правило екшн-ігри пов'язані із битвами. Цей жанр поділяється на велику кількість піджанрів, серед яких бійки (Fighting), "стріляли" (Shooter) від першої чи третьої особи, тактичні (Tactical), в яких ігровий персонаж діє у складі команди, стелс-екшн, метою якого є приховані дії для виконання завдань, без прямого знищення противників та інші. В свою чергу піджанри можуть ще ділитися.

Цей список не можна вважати вичерпним, оскільки індустрії відеоігор активно розвивається і жанри постійно оновлюються. [2]

Гра, створена в рамках даної роботи, може бути віднесена до жанру Tower defence (англ. захист вежами). Це жанр комп’ютерних ігор, який є під жанром RTS (real-time strategy), що перекладається як стратегія в реальному часі. Ідея Tower defence полягає в тому, що гравець повинен зупинити ворогів, які намагаються перетнути карту, і для цього він використовує оборонні вежі. Вежі зазвичай мають різні характеристики по ціні дальності дії, скорострільності і тому подібне. Якщо певна кількість ворогів таки досягає цілі - на цьому гра закінчується. За знищення ворогів гравець отримує ресурс, який можна витратити на будівництво нових веж, чи вдосконалення старих. Вдалий вибір і розстановка захисних споруд і є головною метою гри. Більшість ігор цього жанру передбачають карту, яка являє собою свого роду лабіринт, по якому бігтимуть вороги, що полегшує роботу гравця і дає йому можливість ефективно розмістити вежі. Існують також так звані лінійні версії гри, де вороги йдуть по прямих. Також в деяких версіях гравець може сам створювати лабіринт з веж і блоків.

Першою грою, яку можна віднести до цього жанру була Rampart, випущена Atari Games в 1990 році. Вона являла собою аркадну гру (для ігрових автоматів), яка згодом, завдяки своїй популярності з годом була портована на різні платформи. З розвитком технологій різні розробники створювали схожі ігри, з’явилось багато браузерних версій цих ігор, а також версії для мобільних телефонів. Найвідомішими представниками жанру на сьогодні є такі ігри як: Protector, Immortal Defense, GemCraft, Plants vs. Zombies.

Розділ 2. Мобільні пристрої з сенсорними екранами


Як і будь-яка комп’ютерна техніка, мобільні телефони пройшли певну еволюцію в процесі свого розвитку. Спочатку вони використовувались суто для розмов, але згодом у них почали з’являтись все нові й нові функції. Сучасний мобільний телефон більше нагадує малогабаритний комп’ютер ніж просто переговорний пристрій. Це призвело до зміни розмірів, дизайну, і способів введення інформації, зокрема широкого використання сенсорних екранів в нових моделях мобільних телефонів, КПК, планшетних ПК, та інших.

В загальному випадку сенсорний екран (Touch Screen) - це спеціальний пристрій, який прикріплюється до монітора, і виконує функції визначення координат точки дотику. Такий спосіб введення інформації дозволяє створювати найрізноманітніші інтерфейси, і не прив’язуватись до жорстких кнопок, що відкриває нові можливості для розробки ігрових програм.

 

2.1 Історія виникнення сенсорних екранів


Вважається, що перший сенсорний екран був винайдений Е.А. Джонсоном в Великій Британії, приблизно в 1965-1967 роках. Він описав технологію використання чутливих дисплеїв для контролю руху повітряних суден у статті, опублікованій в 1968 році.

У 1971 році доктором Семом Герстом (Sam Hurst), засновником компанії Elographics, був розроблений датчик дотиків в університеті Кентукі. Цей пристрій, названий "Елограф" був запатентований науковим фондом університету Кентукі. Елограф не був прозорим, як сучасні сенсорні екрани, проте, став важливим кроком у розвитку технології чутливих дисплеїв.

У 1974 році з’явився перший сенсорний планшет, що містив прозору чутливу поверхню, розроблений Семом Герстом в компанії Elographics. У 1977 році Elographics розробили і запатентували резистивну технологію чутливих екранів, яка наразі є однією з найпопулярніших. Того ж року, спільно з Siemens, було створено випуклу сенсорну панель, яка підходила до кінескопів того часу. На всесвітній виставці 1982 року Elographics представили телевізор з сенсорним екраном.

У 1983 році вийшов комп’ютер HP-150 з сенсорним екраном на базі інфрачервоної решітки. Щоправда тогочасні сенсорні екрани використовувалися в основному в промисловій і медичній апаратурі.

Широкого застосування в кишенькових пристроях, таких як телефони і КПК, сенсорні екрани набули в якості заміни крихітній клавіатурі, коли появились моделі з великими рідкокристалічними екранами. Першою ігровою консоллю з сенсорним екраном була Nintendo DS випущена в 2004 році.

 

2.2 Принципи роботи сенсорних екранів


Функціонально в будь-якому сенсорному екрані можна виділити три частини: сенсор (спеціальна панель, або датчики), контролер, який керує датчиками і обчислює, або готує данні для обчислення координат точки дотику, і драйвер - програма, що виконує необхідні обрахунки і коректує роботу контролера.

На перший погляд, може здатися, що всі сенсорні екрани працюють за однаковим принципом, але навіть з точки зору користувача не важко помітити різницю в їх функціонуванні. Існують різні варіанти технічної реалізації чутливих дисплеїв, що значно впливає на їх характеристики, такі як точність, довговічність, швидкість відгуку, реакція на матеріал, собівартість. Найпопулярніші з них: резистивні, ємнісні, матричні, індуктивні, з використанням поверхнево-акустичних хвиль, інфра-червоних променів, відеокамер. Нижче будуть розглянуті технології, які використовуються в мобільних пристроях як телефони чи КПК.

Резистивні сенсорні екрани

Резистивний екран складається з скляної панелі і гнучкої пластикової мембрани, на які нанесено спеціальне покриття. Простір між склом і мембраною заповнений діелектриком, який рівномірно розподілений по активній області екрану і надійно ізолює поверхні провідників. Коли на екран натискають, панель і мембрана замикаються, а контролер з допомогою аналого-цифрового перетворювача реєструє зміну опору і перетворює його в координати дотику. Існують різні варіації резистивних дисплеїв: 4, 5 і 8 - провідникові, в залежності від кількості електродів, що використовуються, напруг що на них подаються.

Ємнісні сенсорні екрани

Ємнісний екран являє собою скляну панель, покриту прозорим матеріалом. Електроди розміщені по кутах екрану, подають на провідний шар невелику постійну напругу, однакову для всіх кутів. При дотику до екрану пальцем, або іншим предметом з відповідною провідністю, виникає відтік електрики. При цьому чим ближче палець до електроду, тим менший опір екрану, а значить сильніша сила струму. Сила струму у всіх чотирьох кутах реєструється датчиками, які передають інформацію в контролер, що вираховує координати точки дотику.

Точність ємнісних екранів досягає точності резистивних. Меша кількість шарів, робить їх більш прозорими (до 90%). Відсутність рухомих елементів, що піддаються деформації збільшує надійність - вони витримують до 200 мільйонів натискань в одну точку, що становить близько шести з половиною років натискань з інтервалом в одну секунду, також вони стійкі до низьких температур. Проте недоліками таких екранів є: необхідність торкатися тільки предметами з певними електропровідними властивостями (палець, або спеціальний стилус), крім того користувач повинен мати досить хороший контакт з "землею", інакше він набуде потенціал екрану, що спричинятиме збої. Екрани такого типу не допускають натискання в двох точках одночасно.

Другий вид ємнісних екранів, позбавлений більшості перелічених недоліків. Проекційно-ємнісні екрани відрізняються тим, що в них на внутрішній стороні нанесена сітка електродів. Кожен електрод разом з тілом людини утворює конденсатор, ємність якого вимірюється, методом подавання імпульсу струму і вимірювання його напруги. Всі електроди мають однакові розміри, форму і провідність, тому за відсутності сторонніх предметів їх ємності рівні. Контролер почергово подає імпульс на кожен електрод, той з них, що матиме і максимальну ємність і відповідатиме точці дотику.

Такі екрани витримують більший діапазон температур, і не настільки вимогливі до провідності людини і землі. Статичні провідні забруднення можна легко ігнорувати програмним шляхом. Важливою властивістю таких екранів є також можливість реєстрації кількох точок дотику одночасно. Щоправда їм властива менша роздільна здатність в порівнянні з традиційними ємнісними дисплеями.

Інфра-червоні сенсорні екрани

Принцип роботи полягає в тому, що сітка, сформована горизонтальними і вертикальними інфра-червоними променями, переривається при дотику до монітора будь-яким предметом. Контролер визначає місце, в якому промінь був перерваний.

Інфра-червоні екрани чутливі до забруднень і тому використовуються там, де важлива якість зображення. Також з їх допомогою дуже просто перетворити звичайний екран на сенсорний. Такий тип екранів використовується в телефонах шведської компанії Neonode. [4]

На даний момент найпопулярнішою стала технологія ємнісних сенсорних екранів, хоча значну частину ринку все ще займають резистивні. Оскільки стилуси для ємнісних екранів, в силу складності їх виробництва, не надто розповсюджені, розробникам програм потрібно орієнтуватися на керування з допомогою пальців, а значить збільшення розмірів елементів графічних інтерфейсів.

Розділ 3. Java Platform, Micro Edition

 

3.1 Загальна інформація


Мова програмування Java, створена Sun Microsystems, зіграла важливу роль в розвитку ігор. Будучи мовою, в якій нема вказівників і складних операцій з пам'яттю, вона також є об'єктно-орієнтованою, безпечною і може працювати на базі більшості платформ, таким чином з її появою, розробники програм, раптом відкрили для себе те, що ніколи не здавалося, можливо раніше. Java дозволила мільйонам програмістів створювати якісні програми в рекордні строки та кількості.Platform, Micro Edition (Java ME), [5] була спробою взяти Все найкраще від Java SE і пристосувати, для невеликих пристроїв, таких як мобільні телефони, телевізійні приставки, пейджери, органайзерів і кишенькові комп’ютерів (КПК), а також вбудовані чіпи, які є в таких пристроях, як холодильники, мікрохвильові печі, "Розумні"кредитні картки, і автомобілі.

Більшість основних виробників мобільних телефонів відразу зрозуміли потенціал J2ME: якщо прилад підтримує Java то, сотні тисяч розробників зможуть без проблем створювати програмки для нього, що збільшує його цінність. Крім того, що оскільки програма написана на Java, розроблена для одного пристрою, вона зможе працювати і на іншому пристрої зазнавши мінімальних модифікацій, або взагалі без них. Це, безумовно, набагато краще, ніж змушувати розробників, вивчати рідні мови і API кожної моделі телефону для створення відповідних програм. [2]

 

3.2 Профілі і конфігурації


Мова програмування Java незалежна від архітектури, в силу того, що використовує інтерпретатор, який перекладає байт-код, згенерований компілятором в машино - незалежний код. Інтерпретація коду здійснюється під керуванням системи виконання, так званої віртуальної Java машини. Цей механізм створює середовище виконання пристосунків. Середовище виконання в свою чергу, висуває певні вимоги до властивостей мови програмування Java, побудовані на основі специфікації Java Language Specification, розробленої компанією Sun Microsystems. При написанні програм на Java активно використовується бібліотеки Java API, без яких написати реальну програму майже не можливо. Ці бібліотеки містять велику кількість наперед визначених інтерфейсів, класів, методів, констант, що допомагають програмісту створювати робочі додатки, за мінімальні терміни. [3]

Невеликі розміри портативних приладів накладають значні обмеження на процесор, пам’ять, дисплей, пристрій вводу, але платформа Java ME розроблена спеціально для того, щоб створювати програми, орієнтовані саме на такі портативні пристрої.

Середовище виконання програм Java, повинне знаходитись всередині портативних пристроїв, за це відповідає їх виробник, це і характеризує конкретний пристрій, як пристрій, що підтримує технологію Java.

Існує велика кількість портативних пристроїв, що підтримують Java, але потужність, і відповідно, їх можливості різні. Тому платформа Java ME розроблена у вигляді блочної моделі модулів, конфігурацій і профілів.

Конфігурація визначає властивості мови Java і віртуальної Java машини, а також набір доступних бібліотек Java API. Профіль, в свою чергу, висуває вимоги до апаратної частини приладу і може містити раяд додаткових бібліотек Java, спрямованих на роботу з конкретним пристроєм.

Платформа Java ME складається з двох конфігурацій CDC (Connected Device Configuration - кофігурація пристроїв, що підключаються) і CLDC (Connected Limited Device Configuration - кофігурація пристроїв, що підключаються з обмеженнями). Кожна з конфігурацій визначає своє сімейство пристроїв. При програмуванні для мобільних телефонів використовується конфігурація CLDC. Кожна з конфігурацій містить свої профілі, які надбудовуються над своєю конфігурацією. Коли програміст створює програмне забезпечення для портативних пристроїв, він повинен знати під який профіль і конфігурацію пише програму, а виробник пристрою повинен здійснювати підтримку того чи іншого профілю в зв’язці зі своєю конфігурацією.

Конфігурація CDC об’єднує ряд пристроїв, що мають постійне мережне підключення, наприклад телевізійні приставки, автомобільні системи навігації тощо. Конфігурація CLDC розрахована на сімейство мобільних пристроїв, таких як телефони, органайзери, КПК. Для таких пристроїв характерні 16 або 32 розрядні процесори, 160-521 Кб пам’яті для платформи Java ME, бездротове мережеве підключення, живлення від акумулятора. Конфігурації СDC і CLDC незалежні одне від одного і не можуть використовуватись разом.

Існують дві версії конфігурації: CLDC 1.0 i CLDC 1.1 Конфігурація 1.1 має більше можливостей, наприклад, підтримку чисел з плаваючою точкою, що в свою чергу робить серйознішими вимоги до апаратної частини.

Єдиний доступний профіль в конфігурації CLDC називається MIDP (Mobile Information Device Profile - інформаційний профіль мобільних пристроїв). Цей профіль має три версії 1.0, 2.0, 2.1 Всі телефони, що підтримують Java, сумісні з профілем MIDP 1.0, який був сформований при початковому створенні платформи Java ME і містить в собі певний набір API. З виходом MIDP 2.0 було додано ряд нових бібліотек, що покращили процес створення програм для мобільних телефонів. Профіль MIDP 2.1 не значним чином відрізняється від 2.0. в ньому були посилені вимоги до специфікацій і безпеки, що практично не вплинуло API. [1]

Отож, програмний продукт, створений розробниками орієнтований на конкретний профіль, який є специфікацією, що встановлює певні вимоги до апаратної частини телефону, а також містить додаткові бібліотеки. Кожен конкретний профіль надбудовується над своєю, тільки йому доступною конфігурацією. Конфігурація висуває вимоги до віртуальної Java машини і властивостей мови Java. Далі йде тісна взаємодія з апаратним забезпеченням телефону, через наявні сервіси, які надаються операційною системою або прошивкою телефону. Даний рисунок ілюструє цей ланцюжок взаємодії. Така модульність в побудові Java ME дає необмежені можливості в модернізації усієї платформи і написанні справді апаратно-незалежного коду програми.

 


Розділ 4. Завдання


4.1 Постановка задачі


Запропонувати програмну реалізацію гри жанру Tower Defence, на базі платформи Java Platform Micro Edition, для мобільних пристроїв з сенсорним екраном. Програма повинна бути розрахована на керування з допомогою пальця або стилуса.

 

4.2 Опис гри


Гра відбувається на карті, що складається з клітинок. Клітинки бувають чотирьох типів: місця придатні для розміщення вежі, точка появи монстрів, дорога по якій вони можуть рухатись і ціль, куди вони прямують. Мета гравця - не дозволити монстрам добратися до їх цілі, для цього він розміщує оборонні вежі вздовж дороги. Доступні кілька видів веж з різними показниками сили, скорострільності, радіусу дії, і, відповідно, ціни. Гравець може змонтувати вежу на придатній клітинці, якщо у нього достатньо для цього ресурсу. Також вежа може бути розмонтована, при цьому ресурс витрачений на неї повернеться. Монстри також бувають різних видів в залежності від показників їх швидкості, живучості, і кількості ресурсу, яку отримує гравець за знищення монстра.

Гра може проводитись у кількох варіантах: проходження компанії раунд за раундом, чи в режимі гри на виживання. Раунд гри закінчується перемогою, коли гравець знищить певну задану кількість монстрів, тоді він переходить в наступний раунд, який може відбуватися вже на інакшій карті, або поразкою, якщо кілька монстрів зможуть пройти карту. В режимі на виживання, гравець повинен захищатися від безкінечної послідовності монстрів, що постійно генеруватимуться. В такому варіанті гра триває до програшу, або поки гравець її не зупинить, як результат - враховується кількість знищених монстрів.

інтерактивний ігровий мобільний сенсорний

Розділ 5. Реалізація

 

5.1 Загальна модель


В процесі гри відбувається постійний рух монстрів по спеціальних шляхах. Для цього потрібно перш за все проаналізувати карту гри на прохідність, і згенерувати усі можливі маршрути. Ігрове поле розглядається як неорієнтований граф, вершинами якого є клітинки придатні для пересування, а ребрами зв’язані сусідні клітинки, між якими можливі переходи. На такому графі виконується пошук в глибину з урахуванням того, що згенеровані шляхи не повинні містити циклів. Одержані шляхи конвертуються в набір точок на площині, які повинен пройти монстр. В залежності від його швидкості він поступово переміщається між ними.

Для організації руху і взаємодії ігрових об’єктів програма в своїй основі повинна містити цикл, що постійно повторюється. В тілі циклу проводиться звернення до всіх активних елементів і їх перемалювання. Кожна вежа перевіряє наявність монстрів в радіусі своєї дії і атакує їх відповідно до свого типу. При цьому повинна враховуватись скорострільність, а саме: вежа, час перезарядки якої ще не пройшов - не повинна взаємодіяти з монстрами.

Кожна вежа повинна автоматично вдосконалюватися. За кожне враження монстра додається один бал досвіду, при набиранні певної кількості балів, в залежності від виду вежі, може збільшуватись її сила, скорострільність чи радіус дії.

Також, в процесі гри повинна бути можливість додавання нових веж і ліквідації не потрібних. Ці можливості надає користувачу бокове меню, в якому можна обрати нову вежу для побудови. Також на ньому відображаються запас ресурсу, і інформація про обрану вежу. При виборі уже побудованої вежі в боковому меню активізується кнопка для знищення вежі. При побудові нової вежі необхідно враховувати наявність достатньої кількості ресурсу, і зменшувати його кількість відповідно до ціни.

 

5.2 Програмна реалізація


Готова програма являє собою Java мідлет, на базі конфігурації CLDC - 1.1, профілю MIDP - 2.1.

В процесі програмної реалізації було створено набір класів:, Menu, MenuCanvas, Monster, MonsterFactory, Monster, Monsters, SimpleFactory, SimpleTower, SpeedTower, SplashTower, TDGame, TDCanvs, Tower, Towers, Trek, TrekBuilder, point.

Програмний код класів наведений в додатку. Ієрархію створених класів демонструє наступна діаграма.


Детальніше про кожен клас і його призначення:- основний клас - Midlet, що є оболонкою для всієї гри.- організовує головне меню ігри.- клас наслідник GameCanvas, реалізує графіку власне ігрового процесу, взаємодіє з користувачем, обробляючи дотики до екрану.- містить у собі інформацію про поточне ігрове поле.- забезпечує бокове меню в ігровому процесі.- містить у собі інформацію про монстра, його характеристики, зображення, шлях прямування. Забезпечує малювання і участь в ігровому процесі одного монстра.- інтерфейс, що описує генератор послідовностей монстрів. Містить тільки один метод Monster genNext (), що генерує наступного монстра. У різних ігрових рівнях можуть використовуватись різні реалізації цього інтерфейсу.- реалізує інтерфейс MonsterFactory, генеруючи послідовність монстрів з характеристиками заданими випадковим чином в певних рамках.- клас, що містить в собі масив усіх об’єктів класу Monster, і почергово опитує на кожній ітерації, для того щоб здійснити рух, і промальовування.- абстрактний клас, що описує одну вежу. Містить її характеристики, зображення, методи встановлення і ліквідації вежі. Два абстрактні методи attack (Monster [] m) і upgrade () - дають можливість описувати різні схеми поведінки: атаки і вдосконалення, в залежності від типу вежі.- наслідує Tower, представляє звичайну вишку, що атакує одночасно тільки одного ворога.- наслідує Tower, представляє вишку, що зменшує швидкість одного ворога.- наслідує Tower, представляє звичайну вишку, що атакує одночасно всіх ворогів в радіусі своєї дії.- містить посилання на всі присутні на карті вежі. Активує їх на кожній ітерації. Забезпечує можливість додавання нових і видалення старих веж.- містить шлях прямування конкретного монстра у вигляді послідовності контрольних точок.- генерує всі можливі шляхи слідування монстрів, на основі заданого поля.- клас, що представляє точку, містить координати х,y.

 

5.3 Отримані результати


Програма розроблялася в інтегрованому сереловищі NetBeans IDE 7.0. [6]

В одержаній реалізації, гра матиме такий вигляд.


Скріншот зроблено у програмі MicroEmulator 2.0.4.62.

Дана версія розрахована на дисплеї з роздільною здатністю 640х360 пікселів. Програма тестувалась на телефоні Sony Ericsson U1, де успішно працювала.

Висновки


В ході виконання роботи було запропоновано реалізацію гри, для мобільних пристроїв з сенсорним екраном на базі обраної платформи Java Micro Edition. Отримано досвід роботи з інструментами розробки програм для мобільних пристроїв, зокрема в середовищі NetBeans IDE 7.0.

Важливими особливостями такого програмування є розміри графічних елементів інтерфейсу - адже це значним чином впливає на зручність користування продуктом. При цьому потрібно враховувати роздільну здатність екрану і точність сенсору, а також користуватиметься людина стилусом, чи пальцем. Можливий варіант виходу з ситуації - розробка різних версій продукту для пристроїв з кардинально різними характеристиками. Завдяки універсальності платформи Java ME цей процес зводиться до заміни графічних файлів і констант, а не повного переписування коду.

Варто зазначити, що розробка ігрових програм для портативних пристроїв - доволі перспективна сфера, адже кількість мобільних телефонів з сенсорним екраном постійно зростає, а людству ніколи не набридне грати в цікаві ігри, що зумовлює попит на відповідне програмне забезпечення.

Список використаних джерел


1.       Горнаков С.Г. "Програмирование мобильних телефонов на Java 2 Micro Edition" - М.: ДМК Пресс, 2004

2.       David Fox, Roman Verhosek "Micro Java Game Development" - Addison Wesley, 2002

3.       MIDP Programming with J2ME: http://www.developer.com/java/j2me/article. php/10934_1561591_8/MIDP-Programming-with-J2ME. htm <http://www.developer.com/java/j2me/article.php/10934_1561591_8/MIDP-Programming-with-J2ME.htm>

.        Мухин И.А. Сенсорные экраны - решение проблем (10 технологий). "BROADCASTING Телевидение и радиовещение": 1 часть - № 3 (55) май 2006, с.50-52; 2 часть - № 4 (56) июнь-июль 2006, с.40-41; 3 часть - № 7 (59) ноябрь 2006, с.64-66.

.        Офіційний сайт Java Platform, Micro Edition: <http://www.oracle.com/technetwork/java/javame/index.html>

.        Офіційний сайт середовища розробки NetBeans IDE: <http://netbeans.org/>

Додатки


Додаток: Код програми

// GameField. java

import java. io. IOException;javax. microedition. lcdui. Graphics;javax. microedition. lcdui. Image;javax. microedition. lcdui. game. TiledLayer;class GameField {final int GRASS = 1;final int ROAD = 2;final int HOME = 3;[] [] field;tl;GameField (int [] [] field) {. field = field;(field. length, field [0]. length,100,0);

}

// генерує поле по замовчуваннюGameField () {n = 10;m = 15;= new int [n] [m];(int i=0; i<n; i++)(int j=0; j<m; j++)[i] [j] =GRASS;[0] [0] = HOME;[0] [1] = ROAD;[0] [2] = ROAD;[1] [2] = ROAD;[2] [2] = ROAD;[3] [2] = ROAD;[4] [2] = ROAD;[4] [3] = ROAD;[1] [3] = ROAD;[1] [4] = ROAD;[2] [4] = ROAD;[3] [4] = ROAD;[4] [4] = ROAD;[4] [5] = ROAD;[4] [6] = ROAD;[4] [7] = ROAD;[5] [7] = ROAD;[6] [7] = ROAD;[7] [7] = ROAD;[8] [7] = ROAD;[8] [8] = ROAD;[8] [9] = ROAD;[8] [10] = ROAD;[8] [11] = ROAD;[8] [12] = ROAD;[8] [13] = ROAD;[9] [13] = ROAD;[9] [14] = ROAD;(n, m,100,0);

}void createLayer (int n, int m, int x0, int y0) {{= new TiledLayer (m, n, Image. createImage ("/field. png"), 36, 36);

} catch (IOException ex) {. printStackTrace ();

}. setPosition (x0, y0);(int i=0; i<n; i++)(int j=0; j<m; j++). setCell (j, i, field [i] [j]);

}void paint (Graphics g) {. paint (g);

}point getCellij (int x, int y) {- = tl. getX ();- = tl. getY ();new point (x / tl. getCellWidth (),y /tl. getCellHeight ());

}TrekBuilder genTrekBuilder () {tb = new TrekBuilder (36,36,tl. getX (),tl. getY ());. buildTreks (field, 9, 14);tb;

}point getCellXY (point p) {new point (p. x*tl. getCellWidth () +tl. getX (), p. y*tl. getCellHeight () +tl. getY ());

}boolean isCellAvailable (int i, int j) {( (j >=0 && j<field. length && i>=0 && i<field [j]. length) && field [j] [i] == GRASS);

}void checkCell (point p) {= getCellij (p. x, p. y);s = (field [p. x] [p. y] == GRASS)?"Grass": "";= (field [p. x] [p. y] == ROAD)?"road": s;= (field [p. x] [p. y] == HOME)?"home": s;. out. println (s + " ("+p. x + " " + p. y + ")");

}

}

// Menu. java

import java. io. IOException;javax. microedition. lcdui. Graphics;javax. microedition. lcdui. Image;class Menu {bgimg,changeimg,sellimg;pc;sell = false;Menu (TDCanvas pc) {. pc = pc;{= Image. createImage ("/menu. png");= Image. createImage ("/change. png");= Image. createImage ("/sell. png");

} catch (IOException ex) {. printStackTrace ();

}

}void changeState (boolean sell) {. sell = sell;

}void paint (Graphics g) {. drawImage (bgimg, 0, 0, Graphics. TOP|Graphics. LEFT);(sell) g. drawImage (sellimg, 7, 188, Graphics. TOP|Graphics. LEFT);g. drawImage (changeimg, 7, 188, Graphics. TOP|Graphics. LEFT);

}void pressed (int x, int y) {(x>7 && x<83 && y>188 && y<264) {(sell) {. removeCur ();= false;

}pc. changeCurTower ();

}

}

}

// MenuCanvas. java

import javax. microedition. lcdui. Canvas;javax. microedition. lcdui. Display;javax. microedition. lcdui. Graphics;class MenuCanvas extends Canvas{cenX = 0;cenY = 0;selected;[] options = {"Campaign","Survival","Exit"};tdg;MenuCanvas (TDGame tdg) {();. tdg = tdg;(true);= getWidth () /2;= getHeight () /2;

}void pointerPressed (int x, int y) {(x > cenX)(y >cenY) select ();cancel ();(y >cenY) down ();up ();

}void paint (Graphics g) {. setGrayScale (255);. setColor (10, 200, 100);. fillRect (0, 0, getWidth (), getHeight ());. setGrayScale (0);(int i=0; i<options. length; i++) {(i == selected) g. setColor (200, 20,10);. drawString (options [i], cenX - cenX/2, i*15,Graphics. TOP|Graphics. LEFT);. setColor (0,0,0);

}. drawString ("ok", 5+ cenX + cenX/2, 5+ cenY + cenY/2,Graphics. TOP|Graphics. LEFT);. drawString ("cancel", 5+ cenX + cenX/2,cenY/2 - 5,Graphics. TOP|Graphics. LEFT);. drawString ("up", 2, cenY/2 - 5, Graphics. TOP|Graphics. LEFT);. drawString ("down", 2, 5+ cenY + cenY/2, Graphics. TOP|Graphics. LEFT);

}void up () {= (selected>0)? selected-1: options. length-1;();

}void down () {= (selected<options. length-1)? selected+1: 0;();

}void select () {(selected) {0:. getDisplay (tdg). setCurrent (new TDCanvas (tdg, TDCanvas. CAMPAIGN));;1:. getDisplay (tdg). setCurrent (new TDCanvas (tdg, TDCanvas. SURVIVAL));;2:. destroyApp (false);. notifyDestroyed ();;

}

}void cancel () {(tdg. canContinue ()) tdg. continueGame ();

}

}

// Monster. java

import javax. microedition. lcdui. Graphics;javax. microedition. lcdui. Image;javax. microedition. lcdui. game. Sprite;class Monster {sp;speed;maxspeed;minspeed = 1;hp;dmg;gold;tr;Monster (int speed, int hp, int dmg, int gold, Image img) {. speed = speed;. hp = hp;. dmg = dmg;. gold = gold;= new Sprite (img,36,36);

}void SetXY (int x, int y) {. setPosition (x, y);

}void SetXY (point p) {. setPosition (p. x, p. y);

}void paint (Graphics g) {. paint (g);(sp. getFrame ()! = 0) sp. setFrame (0);sp. setFrame (1);

}void setTrek (Trek tr) {. tr = tr;(tr. getNext ());

}boolean move () {();res = moveWith (speed);res;

}boolean moveWith (int step) {(tr. isEmty ()) {

// видалити монстра= 0;false;

}{pto = tr. getNext ();cur = new point (sp. getX (),sp. getY ());(cur. equals (pto)) {. delNext ();();

}{step1 = 0;(pto. x > cur. x) {= changeStep (cur. x,pto. x,step);. x+=step1;= step1;

}(pto. x < cur. x) {= changeStep (cur. x,pto. x,step);. x-=step;= step1;

}(pto. y > cur. y) {= changeStep (cur. y,pto. y,step);. y+=step;= step1;

}(pto. y < cur. y) {= changeStep (cur. y,pto. y,step);. y-=step;= step1;

}(cur);(step! =0) moveWith (step);

}true;

}

}int changeStep (int f, int t, int step) {dist = Math. abs (f-t);(dist<step) return dist;return step;

}point getCentPosition () {new point (sp. getX () +sp. getWidth () /2,sp. getY () +sp. getHeight () /2);

}point getPosition () {new point (sp. getX (),sp. getY ());

}void hit (int d) {- = d;(! isAlive ()) {. st. removeAllElements ();

}. setFrame (2);

}void hitSpeed (int d) {- = d;(speed < minspeed) speed = minspeed;

}void Speed () {(speed < maxspeed) speed += 1;

}boolean isAlive () {(hp>0);

}int getHp () {hp;

}void setHp (int hp) {. hp = hp;

}

}

// MonsterFactory. java

public interface MonsterFactory {Monster genNext ();

}

// Monsters. java

import java. util. Vector;javax. microedition. lcdui. Graphics;class Monsters {mar = new Vector ();pc;Monsters (TDCanvas pc) {. pc = pc;

}void add (Monster m) {. addElement (m);

}void move () {(int i=0; i<mar. size (); i++) {m = ( (Monster) mar. elementAt (i));(m. isAlive ()) m. move ();{. removeElementAt (i);p = m. getPosition ();(p. x == 100 && p. y == 0) pc. hp - = m. dmg;pc. gold += m. gold;

}

}

}Monster [] getArray () {[] oar = new Monster [mar. size ()];. copyInto (oar);oar;

}void paint (Graphics g) {(int i=0; i<mar. size (); i++) {

( (Monster) mar. elementAt (i)). paint (g);

}

}

}

// SimpleFactory. java

import java. util. Random;javax. microedition. lcdui. Image;class SimpleFactory implements MonsterFactory{tb;img;start;SimpleFactory (TrekBuilder tb, Image img) {. tb = tb;. img = img;

}Monster genNext () {r = new Random ();speed = r. nextInt (8) +2;m = new Monster (speed, 30, 7, 3, img);. setTrek (tb. randTrek ());m;

}

}

// SimpleTower. java

import javax. microedition. lcdui. Image;class SimpleTower extends Tower{SimpleTower (int xp, int dmg, int range, int gold, int cooldown, Image img) {(xp, dmg,range,gold, cooldown, img,"damages\n one");

}boolean attack (Monster [] m) {. setFrame (0);(int i=0; i<m. length; i++) {(isInRange (m [i])) {[i]. hit (dmg);. setFrame (1);true;

}false;

}void upgrade () {(xp % 20 == 0) dmg ++;(xp % 30 == 0) range ++;

}

}

// SpeedTower. java

import javax. microedition. lcdui. Image;class SpeedTower extends Tower{SpeedTower (int xp, int dmg, int range, int gold, int cooldown, Image img) {(xp, dmg,range,gold, cooldown, img,"damages\n speed");

}boolean attack (Monster [] m) {. setFrame (0);(int i=0; i<m. length; i++) {(isInRange (m [i])) {[i]. hitSpeed (dmg);. setFrame (1);true;

}

}false;

}void upgrade () {(xp % 20 == 0 && cooldown>0) cooldown--;(xp % 30 == 0) range++;

}

}

// SplashTower. java

import javax. microedition. lcdui. Image;class SplashTower extends Tower{SplashTower (int xp, int dmg, int range, int gold, int cooldown, Image img) {(xp, dmg,range,gold, cooldown, img,"splash\n damage");

}boolean attack (Monster [] m) {hit = false;. setFrame (0);(int i=0; i<m. length; i++) {(isInRange (m [i])) {[i]. hit (dmg);. setFrame (1);= true;

}

}hit;

}void upgrade () {(xp % 20 == 0 && cooldown>0) cooldown--;(xp % 30 == 0) dmg++;

}

}

// TDGame. java

import java. util. Random;javax. microedition. midlet. *;javax. microedition. lcdui. *;javax. microedition. lcdui. game. GameCanvas;class TDGame extends MIDlet

{Display display;void startApp () {= Display. getDisplay (this);. setCurrent (new MenuCanvas (this));

}void pauseApp () {}void destroyApp (boolean forced) {}TDCanvas PausedGame = null;void setToPause (TDCanvas tdc) {= tdc;

}boolean canContinue () {(PausedGame! = null);

}void continueGame () {. getDisplay (this). setCurrent (PausedGame);. continueGame ();= null;

}

}TDCanvas extends GameCanvas implements Runnable{img, im1, im2, im3,mimg;t;gf = new GameField ();tb;tws;mf;ms;static int hp = 100;pe;m = new Menu (this);startTime = System. currentTimeMillis ();gold = 100;static final int SURVIVAL = 0;static final int CAMPAIGN = 1;TDCanvas (TDGame pe, int mode) {(true);(true);. pe = pe;{= Image. createImage ("/monstr_fastt. png");= Image. createImage ("/tower_simple. png");= Image. createImage ("/tower_speed. png");= Image. createImage ("/tower_splash. png");

} catch (Exception ex) {. out. println (ex. getMessage ());

}= gf. genTrekBuilder ();= new SimpleFactory (tb, img);= new Towers ();= new Monsters (this);. add (mf. genNext ());= new Thread (this);. start ();

}curTower = - 1;void removeCur () {+= tws. remove (curTower);

}void pointerPressed (int x, int y) {(x>100) {= tws. check (new point (x,y));(curTower == - 1) {. moveNew (x, y);. changeState (false);. changeState (false);

}{. changeState (true);. changeState (true);

}

}{(y<90) {= true;. setToPause (this);. getDisplay (pe). setCurrent (new MenuCanvas (pe));

}. pressed (x, y);

}

}simple = 0;void changeCurTower () {++;(simple > 2) simple =0;(simple);

}void setCurTower (int simple) {(simple == 0) tws. tryNew (new SimpleTower (0, 7, 36, 10, 5, im1));if (simple == 1) tws. tryNew (new SpeedTower (0, 2, 36, 20, 5, im2));tws. tryNew (new SplashTower (0, 4, 36, 15, 10, im3));

}void pointerReleased (int x, int y) {(! m. isSell ()) {res = tws. put (gf,gold);(res! =-1) {= res;(simple);

}

}

}void pointerDragged (int x, int y) {. moveNew (x, y);

}void painting (Graphics g) {. setGrayScale (255);. fillRect (0, 0, getWidth (), getHeight ());. setGrayScale (0);. drawRect (0, 0, getWidth (), getHeight ());. paint (g);. paint (g);. paint (g);. paint (g);(m. isSell ()) tws. paintInfo (g, 7,101, curTower);c = g. getColor ();. setColor (0, 230, 25);. drawString (" hp: "+ hp, 6, 10,Graphics. TOP|Graphics. LEFT);. setColor (255, 245, 48);. drawString ("Gold: "+ gold, 6, 25,Graphics. TOP|Graphics. LEFT);. setColor (255, 10,10);. drawString ("Mons: "+ 25, 6, 40,Graphics. TOP|Graphics. LEFT);. setColor (10, 10, 210);tm = (int) ( (System. currentTimeMillis () - startTime) /1000);min = (tm/60) %60;sec = tm%60;. drawString ("Time: "+ min+": "+sec, 5, 55,Graphics. TOP|Graphics. LEFT);. setColor (c);();

}void continueGame () {= false;

}boolean pause = false;void run () {k = 0;g = getGraphics ();addgoldtime = 0;(true) {(! pause) {add = (int) (System. currentTimeMillis () /1000);(add%2 == 0 && add! = addgoldtime) {= add;++;[] mar = ms. getArray ();. act (mar);. move ();++;r = new Random ();(k % (r. nextInt (5) +5) == 0) {= 0;. add (mf. genNext ());

}(g);

}

}{. sleep (80);

} catch (InterruptedException ex) {. printStackTrace ();

}(hp <= 0) break;

}. setColor (255, 0, 120);. drawString ("G A M E O V E R", 30, 30,Graphics. TOP|Graphics. LEFT);();{. sleep (200);

} catch (InterruptedException ex) {. printStackTrace ();

}. destroyApp (false);. notifyDestroyed ();

}

}

// Tower. java

import javax. microedition. lcdui. Graphics;javax. microedition. lcdui. Image;javax. microedition. lcdui. game. Sprite;abstract class Tower {public boolean attack (Monster [] m);protected void upgrade ();sp;xp;dmg;range;gold;cooldown;lastactiontime = 0;info;img;Tower (int xp, int dmg, int range, int gold, int cooldown, Image img,String info) {. xp = xp;. dmg = dmg;. range = range;. gold = gold;. cooldown = cooldown;. img = Image. createImage (img, 0, 0, 36, 36, Sprite. TRANS_NONE);= new Sprite (img, 36, 36);. info = info;

}void setXY (int x, int y) {. setPosition (x, y);

}void paint (Graphics g) {. paint (g);

}void paintInfo (Graphics g, int x, int y) {. drawImage (img, x, y, Graphics. TOP|Graphics. LEFT);(g);tp = getCentPosition ();color = g. getColor ();. setColor (255, 0, 0);. drawRect (tp. x - range, tp. y - range, range*2, range*2);. drawString ("Dmg: \n"+ dmg, x+37, y, Graphics. TOP|Graphics. LEFT);. setColor (0, 30, 200);. drawString ("Range: "+ range, x, y+36, Graphics. TOP|Graphics. LEFT);. setColor (255, 245, 48);. drawString ("Gold: "+ gold, x, y+51, Graphics. TOP|Graphics. LEFT);. setColor (200, 200, 200);. drawString ("Cldn: "+ cooldown, x, y+66, Graphics. TOP|Graphics. LEFT);. setColor (0, 0, 0);. drawString (info, x-1, y-28, Graphics. TOP|Graphics. LEFT);. setColor (color);

}boolean isCooledDown () {time = System. currentTimeMillis ();(time - lastactiontime > cooldown*100);

}boolean isInRange (Monster m) {p = m. getCentPosition ();tp = getCentPosition ();( (p. x <= tp. x + range && p. x >= tp. x - range) &&

(p. y <= tp. y + range) && (p. y >= tp. y - range));

}void act (Monster [] m) {(isCooledDown ()) {(attack (m)) {++;();= (xp > 1000)? xp%1000: xp;

}= System. currentTimeMillis ();

}

}point getCentPosition () {new point (sp. getX () +sp. getWidth () /2,sp. getY () +sp. getHeight () /2);

}point getPosition () {new point (sp. getX (),sp. getY ());

}int getPrice () {gold;

}

// Towers. java

import javax. microedition. lcdui. Graphics;class Towers {[] arr;ntw = null;sell;Towers () {= new Tower [148];

}void act (Monster [] mar) {(int i=0; i<arr. length; i++) {(arr [i]! = null) {[i]. act (mar);

}

}

}void tryNew (Tower ntw) {. ntw = ntw;. setXY (-100, - 100);

}void cancelNew () {= null;

}void moveNew (int x, int y) {(ntw! = null) ntw. setXY (x, y);

}void paint (Graphics g) {(int i=0; i<arr. length; i++) {(arr [i]! = null) arr [i]. paint (g);

}(! sell && ntw! = null) ntw. paintInfo (g, 7,101);

}void paintInfo (Graphics g, int x, int y, int ind) {(arr [ind]! = null) arr [ind]. paintInfo (g,x,y);

}int put (GameField gf, int gold) {(ntw! = null) {(gold < ntw. getPrice ()) return - 1;p = ntw. getCentPosition ();= gf. getCellij (p. x, p. y);(! gf. isCellAvailable (p. x, p. y)) return - 1;= gf. getCellXY (p);(! isFree (p)) return - 1;. setXY (p. x, p. y);(int i=0; i<arr. length; i++) {(arr [i] == null) {[i] = ntw;();gold - arr [i]. gold;

}

}

}- 1;

}boolean isFree (point p) {(int i=0; i<arr. length; i++) {(arr [i]! = null) {(p. equals (arr [i]. getPosition ())) return false;

}

}true;

}int check (point p) {(int i=0; i<arr. length; i++) {(arr [i]! = null) {cur = arr [i]. getPosition ();(p. x > cur. x && p. x < cur. x + arr [i]. sp. getWidth () &&. y > cur. y && p. y < cur. y + arr [i]. sp. getHeight ()) return i;

}

}- 1;

}int remove (int i) {gold = arr [i]. gold;[i] =null;= false;gold;

}void changeState (boolean sell) {. sell = sell;

}

}

// Trek. java

import java. util. Stack;class Trek {st;Trek (Stack st) {. st = st;

}point getNext () {(point) st. peek ();

}boolean isEmty () {st. isEmpty ();

}void delNext () {. pop ();

}Trek copy () {st1 = new Stack ();. setSize (st. size ());(int i=0; i<st. size (); i++). setElementAt (st. elementAt (i), i);new Trek (st1);

}

}

// TrekBuilder. java

import java. util. Random;java. util. Stack;java. util. Vector;class TrekBuilder {[] treks = null;[] [] map = null;h,w,x0,y0;TrekBuilder (int h, int w, int x0, int y0) {. h = h;. w = w;. x0 = x0;. y0 = y0;

}Stack convertToXY (Stack st) {(int i=0; i<st. size (); i++) {x = ( (point) st. elementAt (i)). x;y = ( (point) st. elementAt (i)). y;

( (point) st. elementAt (i)). x = y*w + x0;

( (point) st. elementAt (i)). y = x*h + y0;

}. out. println ();st;

}boolean buildTreks (int [] [] map, int si, int sj) {. map = map;from = new Stack ();. push (new point (si, sj));v = findTrek (from);(v. isEmpty ()) return false;= new Trek [v. size ()];(int i =0; i<v. size (); i++) {s = (Stack) v. elementAt (i);. addElement (new point (si,sj));[i] = new Trek (convertToXY (s));

}true;

}boolean ok (int i, int j) {(map [i] [j] == GameField. ROAD);

}boolean finish (int i, int j) {(map [i] [j] == GameField. HOME);

}

// повертає вектор стеків шляху (шлях в клітинках, а не координатах)Vector findTrek (Stack from) {ret = new Vector ();[] neib = new point [4];f = (point) from. peek ();[0] = new point (f. x,f. y-1);[1] = new point (f. x,f. y+1);[2] = new point (f. x-1,f. y);[3] = new point (f. x+1,f. y);(int i=0; i<4; i++) {(neib [i]. x < map. length && neib [i]. y < map [0]. length && neib [i]. x>=0 && neib [i]. y>=0) {(finish (neib [i]. x,neib [i]. y)) {st = new Stack ();. push (neib [i]. copy ());. addElement (st);

}(ok (neib [i]. x,neib [i]. y) &&! from. contains (neib [i])) {. push (neib [i]);v = findTrek (from);. pop ();(int j = 0; j<v. size (); j++) {cur = (Stack) v. elementAt (j);. push (neib [i]. copy ());. addElement (cur);

}

}

}

}ret;

}Trek randTrek () {(treks == null) return null;{r = new Random ();i = r. nextInt (treks. length);treks [i]. copy ();

}

}Trek [] getTreks () {treks;

}

}

// point. java

public class point {int x;int y;point (int x, int y) {. x = x;. y = y;

}boolean equals (Object obj) {(obj instanceof point) {p = (point) obj;(x == p. x && y == p. y);

}super. equals (obj);point copy () {new point (x,y);

}

}

Похожие работы на - Розробка ігрової програми для мобільних пристроїв з сенсорним екраном

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!