ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ прилоТСниями Π½Π° Java

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π”Π°Π½Π½Ρ‹Π΅ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡ‚ΠΎΠΊ постоянно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для «Ρ‡ΠΈΡΡ‚ΠΎΡ‚Ρ‹» ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. Если ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Ρ‚ΡŒ порядок отрисовки, Ρ‚ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ графичСскиС Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ, ΠΈΠ»ΠΈ события Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π² ΡΠ²ΠΎΠ΅ΠΉ очСрСдности. ИмСнно эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ update ΠΈ draw. Update Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ прилоТСниями Π½Π° Java (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

1. Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Java

1.1 Java Runtime Environment

1.2 Java development Kit

1.3 ДокумСнтация Java API

2. Π‘Ρ€Π΅Π΄Π° программирования Java

2.1 ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ исходного ΠΊΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку

2.2 Java IDE

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ создания ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ 2d — прилоТСния

3.1 Анимация ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

3.2 Анимация ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

3.3 Frame Per Second ΠΏΡ€ΠΈ использовании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

3.4Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ°, вставка ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

3.5 ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ update () ΠΈ draw ()

3.6 Game State Manager

3.7 Бобытия ΠΊΠ½ΠΎΠΏΠΎΠΊ

4. ГрафичСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹

4.1 ΠŸΡ€ΡΠΌΠ°Ρ линия

4.2 Π¦Π²Π΅Ρ‚

4.3 Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°

4.4 ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

4.5 Овал

4.6 ΠœΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

4.7 ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ

4.8 Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π’ Π½Π°ΡΡ‚оящСС врСмя сфСра ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ вСсьма Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ развиваСтся. ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Π½ΠΎΠ²Ρ‹Ρ… языков программирования, Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ. Π’ ΡΡ„Π΅Ρ€Π΅ IT количСство Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСст постоянно растСт. На ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΠΉ дСнь, Π² ΡΡ‚ΠΎΠΉ области Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Π΄Π΅Ρ„ΠΈΡ†ΠΈΡ‚ Π² Π²Ρ‹ΡΠΎΠΊΠΎΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… спСциалистах.

ВрСбования ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Π°ΠΌ постоянно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Π·Π° ΡΡ‡Π΅Ρ‚ Π±ΡƒΡ€Π½ΠΎΠ³ΠΎ развития отрасли. Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, пСрвостСпСнной ваТности вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ встаСт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ IT-спСциалистом — это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ языка программирования, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ программист Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, профСссионалы ΠΈ Π±Π»ΠΈΠ·ΠΊΠΎ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ся ΠΎΠ΄Π½ΠΈΠΌ языком, Π½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спСциалиста высокиС познания Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ — Π΄Π²ΡƒΡ… языков. Если Π±Ρ€Π°Ρ‚ΡŒ многочислСнныС статистики ΠΏΠΎ ΡΠ·Ρ‹ΠΊΠ°ΠΌ программирования, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ мСсто Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎ Π²ΠΎΡΡ‚рСбованности, дСлят языки Java ΠΈ PHP. ИмСнно язык Java ΠΈ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΠΌΠ½ΠΎΠΉ для Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния. Π”Π°Π»Π΅Π΅ ΠΌΠ½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ этого интСрСсного языка программирования.

Java — это язык программирования ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ выпущСнная ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Sun Microsystems Π² 1995 Π³ΠΎΠ΄Ρƒ. Π­Ρ‚ΠΎ базовая тСхнология, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ соврСмСнныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π² Ρ‚ΠΎΠΌ числС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΈΠ³Ρ€Ρ‹ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ-прилоТСния). Java Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 850 ΠΌΠ»Π½. ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ΠΈ Π² ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π°Ρ… устройств (Π² Ρ‚ΠΎΠΌ числС Π² ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°Ρ… ΠΈ Π² Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π°Ρ…) ΠΏΠΎ Π²ΡΠ΅ΠΌΡƒ ΠΌΠΈΡ€Ρƒ. На ΡΠ·Ρ‹ΠΊΠ΅ java Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ desktop-прилоТСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ слоТности, web — интСрфСйсы.

Одно ΠΈΠ· Π³Π»Π°Π²Π½Ρ‹Ρ… прСимущСств Java — это ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°). Π’. Π΅. «ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ написанная Π½Π° Java, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅». Π’ Java это достигаСтся Π·Π° ΡΡ‡Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ JVM (Java Virtual Machine), которая ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄. Π’Π°ΠΊΠΆΠ΅ JVM сущСствСнно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ послСдствия ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Java Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Android.

Android — это открытая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, основанная Π½Π° ΡΠ΄Ρ€Π΅ Linux. УстановлСна ΠΎΠ½Π° Π½Π° Ρ‚ысячах устройствах ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Android прСдоставляСт прилоТСния для всСх Π²ΠΈΠ΄ΠΎΠ² оборудования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ соврСмСнных ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройств — Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ компасы, Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, GPS, Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ, ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹, Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΠΈ, Π½Π΅Ρ‚Π±ΡƒΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π’Π°ΠΊΠΆΠ΅, язык Java Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠ³Ρ€ ΠΏΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Symbian Π±Ρ‹Π»ΠΈ написаны Π½Π° Java, благодаря Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ j2me.

J2ME — подмноТСство ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Java для устройств, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… Π² Ρ€Π΅ΡΡƒΡ€ΡΠ°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: сотовых Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ², ΠΊΠ°Ρ€ΠΌΠ°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ², рСсивСров Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ³ΠΎ тСлСвидСния, ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»Π΅ΠΉ дисков Blu-ray. Π’ Π½Π°ΡΡ‚оящСС врСмя являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° Π½Π° Ρ€Ρ‹Π½ΠΎΠΊ Android ΠΈ IOS.

Π’ Π½Π°ΡΡ‚оящСС врСмя, Π΄Π°Π½Π½Ρ‹ΠΉ язык Π΄ΠΎ ΡΠΈΡ… ΠΏΠΎΡ€ Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΡΡ„Π΅Ρ€Π΅ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, благодаря ΠžΠ‘ Android, которая Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ кусок Ρ€Ρ‹Π½ΠΊΠ°.

ΠΠ΅ΠΌΠ°Π»ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΈ desktop — ΠΈΠ³Ρ€Ρ‹, написанныС Π½Π° Java. Π’ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ³Ρ€ ΠΏΠΎΠ΄ pc Π²Π΅Π΄Π΅Ρ‚ся Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… Java Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (LWJGL — lightweight Java game library, Slick 2D, libGDX ΠΈ Ρ‚. Π΄.).

Однако, ΠΏΡ€ΠΈ написаний ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° «Ρ Π½ΡƒΠ»Ρ», ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ся, Π° Π²Π΅ΡΡŒ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ вСдСтся Π½Π° «Ρ‡ΠΈΡΡ‚ΠΎΠΌ» Java SE.

БущСствуСт ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Java Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для написания слоТных ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанныС Π½Π° Java, ΠΈΠΌΠ΅Π»ΠΈ Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΡ… большС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Ρ‡Π΅ΠΌ написанныС Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Π‘ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, написанных Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java, Π±Ρ‹Π»Π° сущСствСнно ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° с Π²Ρ‹ΠΏΡƒΡΠΊΠΎΠΌ Π² 1997 — 1998 Π³ΠΎΠ΄Π°Ρ… Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ JIT-компилятора вСрсии 1.1 Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ особСнностям языка, для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы, класс StringBuffer, ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹Π΅ логичСскиС вычислСния ΠΈ Ρ‚. Π΄.). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° оптимизация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java — с 2000 Π³ΠΎΠ΄Π° для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина HotSpot.

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ прСимущСством Π² ΡΡ‚ΠΎΡ€ΠΎΠ½Ρƒ Π²Ρ‹Π±ΠΎΡ€Π° Java для написания ΠΈΠ³Ρ€ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Java — ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ‚.Π½. jar — Ρ„Π°ΠΉΠ»Ρ‹. JAR Ρ„Π°ΠΉΠ» — это Java — Π°Ρ€Ρ…ΠΈΠ² (сокращСниС ΠΎΡ‚ Π°Π½Π³Π». Java ARchive). ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ собой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ZIP-Π°Ρ€Ρ…ΠΈΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java. Jar Ρ„Π°ΠΉΠ»Ρ‹ вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹, Ρ‚.ΠΊ. ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π° Π»ΡŽΠ±ΠΎΠΉ ОБ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ установлСна JVM. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ удобство jar — Ρ„Π°ΠΉΠ»Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ слоТный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, с Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ нСсколькими нСслоТными дСйствиями пСрСвСсти Π²ΠΎ Π²ΡΠ΅Π³ΠΎ лишь ΠΎΠ΄ΠΈΠ½ jar — Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ свободно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΠΉ дСнь Π½Π° Java Π±Ρ‹Π»ΠΎ написано мноТСство Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ³Ρ€. Одна ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… популярных ΠΈΠ³Ρ€ Π² ΠΌΠΈΡ€Π΅, количСство ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ прСвысило 20 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ², Π±Ρ‹Π»Π° написана Π½Π° Java. Π― Π³ΠΎΠ²ΠΎΡ€ΡŽ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΎΠ± ΠΈΠ½Π΄ΠΈ ΠΈΠ³Ρ€Π΅ Minecraft.

Инди ΠΈΠ³Ρ€Ρ‹ — это ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ созданы нСзависимыми Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ ΠΈ Π½Π΅ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌΡ‹ΠΌ Π³Π΅ΠΉΠΌΠΏΠ»Π΅Π΅ΠΌ. На ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΠΉ дСнь, ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½Π΄ΠΈ ΠΈΠ³Ρ€ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ растСт. ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ свои силы Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ½Π΄ΠΈ ΠΈΠ³Ρ€Ρ‹, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ выбираСтся Π»ΠΈΠ±ΠΎ язык C++, Π»ΠΈΠ±ΠΎ Java, Ρ‚.ΠΊ. ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΡ‚ΠΈΡ… языках Π±Ρ‹Π»ΠΎ написано Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ½Π΄ΠΈ ΠΈΠ³Ρ€ ΠΈ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ сСбя Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ сфСрС.

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ написания ΠΈΠ½Π΄ΠΈ ΠΈΠ³Ρ€ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚. Однако ΠΊΡ€Π°ΠΉΠ½Π΅ рСкомСндуСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ Π² ΡΠΎΠΎΡ‚вСтствии с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ общСпринятыми ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π΄Π°Π»Π΅Π΅.

1. Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Java

Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ элСмСнты, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Java. ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π½ΠΈΠΆΠ΅. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Java Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ (Java API), которая Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ вСсьма ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

1.1 Java Runtime Environment

«Java Runtime Environment» — минимальная рСализация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, нСобходимая для исполнСния Java — ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π±Π΅Π· компилятора ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Бостоит ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ — «Java Virtual Machine» ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Java — классов. JRE распространяСтся свободно ΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° с ΡΠ°ΠΉΡ‚Π° Oracle.

ΠŸΡ€ΠΈ установкС JRE, Ρƒ Π½Π°Ρ появится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ простого запуска ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, написанных Π½Π° Java, Π±Π΅Π· возмоТности Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, самыС Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ вСрсия JRE — это JRE 7. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ JRE 7 ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ΡΡΡ‹Π»ΠΊΠ΅ http://www.oracle.com/technetwork/Java/Javase/downloads/

На ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ JRE ΠΏΠΎΠ΄ мноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ (рисунок 1.1).

Рисунок 1.1 — Π’Ρ‹Π±ΠΎΡ€ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ JRE 7

1.2 Java Development Kit

Java Development Kit — бСсплатно распространяСмый ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Oracle Corporation (Ρ€Π°Π½Π΅Π΅ Sun Microsystems) ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Java, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² ΡΠ΅Π±Ρ компилятор Java (Javac), стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов Java, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ систСму Java (JRE). Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ JRE ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ — достаточно Π±ΡƒΠ΄Π΅Ρ‚ JDK.

Π‘Π°ΠΌΡƒΡŽ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ JDK ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎ ΡΡΡ‹Π»ΠΊΠ΅ http://www.oracle.com/technetwork/Java/Javase/downloads/jdk7-downloads-1 880 260.html. На ΡΡ‚Ρ€Π°Π½ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠžΠ‘ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ (рисунок 1.2)

Рисунок 1.2 — Π’Ρ‹Π±ΠΎΡ€ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ JDK 7

1.3 ДокумСнтация Java API

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. НапримСр, Π΄Π°ΠΆΠ΅ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java содСрТит тысячи классов, содСрТащих ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ справочной систСмой, содСрТащСй Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΎΠ± API, ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. ДокумСнтация являСтся составной Ρ‡Π°ΡΡ‚ΡŒΡŽ Π½Π°Π±ΠΎΡ€Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств JDK. Она прСдставлСна Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ HTML. Если ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠΎ ΡΡΡ‹Π»ΠΊΠ΅ http://docs.oracle.com/Javase/6/docs/api/ Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· ΡΠ΅Π±Ρ прСдставляСт Java API.

Окно Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Ρ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ°. Π’ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ΅ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° всСх доступных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Под Π½ΠΈΠΌ Π²ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ΅ побольшС пСрСчислСны всС классы. (рисунок 1.3). Если Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π° Π»ΡŽΠ±ΠΎΠΌ ΠΈΠ· ΠΈΠΌΠ΅Π½ классов, Ρ‚ΠΎ ΠΈΠ½Ρ„ормация ΠΎΠ± ΡΡ‚ΠΎΠΌ классС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² Π±ΠΎΠ»ΡŒΡˆΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ΅, располоТСнном справа (рисунок 1.4).

Рисунок 1.3 — Окно с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ API

Рисунок 1.5 — ΠŸΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Java API, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ ΡΡΡ‹Π»ΠΊΠ΅ http://www.oracle.com/technetwork/Java/Javase/documentation/Java-se-7-doc-download-435 117.html.

2. Π‘Ρ€Π΅Π΄Π° программирования Java

ПослС установки всСх Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², врСмя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‡Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π—Π΄Π΅ΡΡŒ Π΄Π²Π° ΠΏΡƒΡ‚ΠΈ: Π»ΠΈΠ±ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с JDK нСпосрСдствСнно Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Рассмотрим ΠΎΠ±Π° этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°.

2.1 ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ исходного ΠΊΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² — это вСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ вСсти Π² Ρ‚Скстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный Java — ΠΊΠΎΠ΄ Π² Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΡΠ»Π΅ этот Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ.

НиТС прСдставлСна ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий:

1. БохраняСм наш исходный ΠΊΠΎΠ΄ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ *.java (рисунок 2.1).

2. ЗапускаСм ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку ΠΈ Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹ΠΌ Java — ΠΊΠΎΠ΄ΠΎΠΌ (рисунок 2.2).

3. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Javac, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ исходный Java — ΠΊΠΎΠ΄ Π² Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄ (рисунок 2.3).

4. ЗапускаСм Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Java (рисунок 2.4).

Рисунок 2.1 — Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ исходного ΠΊΠΎΠ΄Π° Рисунок 2.2 — ΠŸΡƒΡ‚ΡŒ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Рисунок 2.3 — ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄ Рисунок 2.4 — Запуск Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄Π° ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ, Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΌΠ°Π»ΠΎΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ. Для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² всС Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅ — ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ вСсь исходный ΠΊΠΎΠ΄ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Π΅ΠΌ скомпилированный Π±Π°ΠΉΡ‚ — ΠΊΠΎΠ΄. Но Π΅ΡΠ»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ большС дСсяти Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ‚ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Для этих Ρ†Π΅Π»Π΅ΠΉ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

2.2 Java IDE

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Java ΠΊΠΎΠ΄ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ занятиСм, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это ваТнСйшСС ΡƒΠΌΠ΅Π½ΠΈΠ΅. Выполняя Π±Π°Π·ΠΎΠ²Ρ‹Π΅ шаги Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JDK ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π§Π°Ρ‰Π΅ всСго, ΠΊΡ€Π°ΠΉΠ½Π΅ рСкомСндуСтся ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ — Π»ΠΈΠ±ΠΎ IDE (integrated development environment), Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Java JDK Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку.

Однако, послС освоСния Π±Π°Π·ΠΎΠ²Ρ‹Ρ… шагов выполнСния Java ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, навСрняка появится ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π—Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ врСмя Ρ‚Π°ΠΊΠΈΠ΅ срСды стали Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΡ‰Π½Ρ‹ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ просто Π½Π΅Ρ‚ особого смысла ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π±Π΅Π· Π½ΠΈΡ…. Π‘Π°ΠΌΡ‹Π΅ распространСнныС IDE для Java Π½Π° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΠΉ дСнь — это: Eclipse, NetBeans ΠΈ IDEA. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… срСд Π΄ Π΅ΡΡ‚ΡŒ свои прСимущСства ΠΈ ΡΠ²ΠΎΠΈ нСдостатки. Π›ΠΈΡ‡Π½ΠΎ я ΠΎΡΡ‚ановился Π½Π° IDE Eclipse ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρƒ Π΄Π°Π½Π½ΠΎΠΉ срСды вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ горячиС клавиши. Под Π½Π΅Π΅ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΌ доступС находится ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство инструмСнтов для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π”Π°ΠΆΠ΅ такая крупная корпорация, ΠΊΠ°ΠΊ Google Π»ΠΈΡ‡Π½ΠΎ написала для Eclipse Π½Π΅ΠΌΠ°Π»ΠΎ инструмСнтария. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄ ΠžΠ‘ Android, Π»ΡƒΡ‡ΡˆΡƒΡŽ IDE Π½Π°ΠΉΡ‚ΠΈ слоТно — для Eclipse Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΌ доступС находится вСсьма ΠΌΠΎΡ‰Π½Ρ‹ΠΉ Android SDK, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ Π½Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Android ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ IDE, стоит ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ ΡΡΡ‹Π»ΠΊΠ΅ http://www.eclipse.org/downloads/ ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ (рисунок 2.5).

Рисунок 2.5 — ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Eclipse

ВсСго прСдлагаСтся ΠΎΠΊΠΎΠ»ΠΎ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… направлСнностСй. Как Π²ΠΈΠ΄ΠΈΠΌ, Π²Ρ‹Π±ΠΎΡ€ достаточно Π²Π΅Π»ΠΈΠΊ. Для своСй Π·Π°Π΄Π°Ρ‡ΠΈ, я Π²Ρ‹Π±Ρ€Π°Π» стандартный ΠΏΠ°ΠΊΠ΅Ρ‚ Eclipse Standart. Π”Π°Π»Π΅Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ (рисунок 2.6) ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся бСсплатноС скачиваниС Π΄Π°Π½Π½ΠΎΠΉ срСды.

Рисунок 2.6 — Π’Ρ‹Π±ΠΎΡ€ Π½ΡƒΠΆΠ½ΠΎΠΉ ΠžΠ‘ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ создания ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ 2d — прилоТСния ΠšΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ любого ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния являСтся анимация. Анимация — это иллюзия двиТСния слоСв Π½Π° ΡΠΊΡ€Π°Π½Π΅, ΠΏΡƒΡ‚Π΅ΠΌ быстрой смСны ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ВсС двиТСния, дСйствия, Ρ„ΠΈΠ·ΠΈΠΊΠ° пСрсонаТСй — это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ запрограммированная быстрая смСна ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Благодаря высокой Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ мощности ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ иллюзия ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ², Ρ…ΠΎΠ΄ΡŒΠ±Ρ‹, Π°Ρ‚Π°ΠΊ ΠΈ Ρ‚. Π΄. БущСствуСт мноТСство аспСктов ΠΏΡ€ΠΈ «ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ 2d Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, основныС ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я Π·Π°Ρ‚Ρ€ΠΎΠ½Ρƒ Π½ΠΈΠΆΠ΅.

3.1 Анимация ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠŸΡ€ΠΈ создании Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π½Π° Java SE, сущСствуСт 2 основных ΠΏΡ€ΠΈΠ΅ΠΌΠ° для смСны ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π‘Π°ΠΌΡ‹ΠΉ распространСнный — это использованиС Swing Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π­Ρ‚ΠΎ самый простой, Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ эффСктивный способ для создания Java ΠΈΠ³Ρ€. Для Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, наш класс обязан Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ интСрфСйс Action Listener ΠΈ ΠΏΡ€ΠΈ этом Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ интСрфСйса — Action Performed. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° происходит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСйствиС. ΠŸΡ€Π°Π²Π΄Π°, Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Action Listener. Π§Π°Ρ‰Π΅ всСго, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ классы.

Π‘Π°ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄: Timer (int interval, ActionListener listener).

Π”Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² создаСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ сообщСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ listener. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ пСрСдаСтся ΠΏΠΎ ΠΈΡΡ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ задаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ interval.

ΠœΠ΅Ρ‚ΠΎΠ΄ start () запускаСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΌΠ΅Ρ‚ΠΎΠ΄ actionPerformed () Π΅Π³ΠΎ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ.

ΠœΠ΅Ρ‚ΠΎΠ΄ stop () останавливаСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€. ПослС остановки Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ actionPerformed () ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ большС Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ся.

3.2 Анимация ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π‘Π°ΠΌΡ‹ΠΉ эффСктивный способ создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ — это использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ Java ΠΏΠΎΡ‚ΠΎΠΊ прСдставлСн классом Thread (ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Java.lang.Thread), всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Thread. Π•ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡŽ своСго ΠΏΠΎΡ‚ΠΎΠΊΠ°:

ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Thread;

Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Runnable (ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Java.lang.Runnable).

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ возмоТности ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ для всСх ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС опрСдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основной процСсс ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π£ ΠΊΠ»Π°ΡΡΠ° Thread Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠΎΠ², построСнных Π½Π° ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² статичСскиС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Π½Π΅ ΠΈΠΌΠ΅Ρ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Thread, Ρ‡Ρ‚ΠΎ особСнно ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСализация Runnable вмСсто Thread.

Часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚Π΄Π°Π» ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² ΠΈΠ·Π²Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, для этого Π΅ΡΡ‚ΡŒ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… yield (). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ — sleep (), ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ, Ссли извСстно, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‡Π°ΡΡ‚ΠΎ ΠΏΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. НапримСр, Ρ€Π°Π· Π² ΡΠ΅ΠΊΡƒΠ½Π΄Ρƒ ΠΈΠ»ΠΈ Π² ΠΌΠΈΠ½ΡƒΡ‚Ρƒ. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ число миллисСкунд.

Π’Π°ΠΆΠ½ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΆΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‚ΠΎ Π΄Π»Ρ этого Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

Π½ΡƒΠΆΠ½ΠΎ просто ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ;

Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ большС Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ. НапримСр, Ссли это ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ процСсс, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π² ΡƒΡΠ»ΠΎΠ²ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ join () ΠΎΡ‚ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.

3.3 Frame Per Second ΠΏΡ€ΠΈ использовании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ ΠΏΡƒΡ‚ΡŒ использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΈ создании Java — ΠΈΠ³Ρ€Ρ‹ — это Π² Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΡƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событий. Π’Π°ΠΊΠΎΠΉ способ ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство нСдостатков. Π‘Π°ΠΌΡ‹ΠΉ сущСствСнный — это использованиС слишком Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов памяти. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π² ΠΈΠ³Ρ€Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚.Π½. кадровая частота (FPS) — количСство смСняСмых ΠΊΠ°Π΄Ρ€ΠΎΠ² Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅. Минимальная кадровая частота для создания ощущСния плавности двиТСния составляСт 12—18 ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² ΡΠ΅ΠΊΡƒΠ½Π΄Ρƒ. FPS рассчитываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1. Π—Π°Π²ΠΎΠ΄ΠΈΠΌ Π·Π°Ρ€Π°Π½Π΅Π΅ 2 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ FPS ΠΈ FPS для понимания Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ вычисляСтся, ΠΊΠ°ΠΊ 1000 / FPS, это дСлаСтся ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ основноС разряд Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ — 1 миллисСкунда

2. Когда ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ†ΠΈΠΊΠ», фиксируСм врСмя Π΅Π³ΠΎ Π²Ρ…ΠΎΠ΄Π° (startTime).

3. ПослС выполняСм всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для обновлСния ΠΈ ΠΏΡ€ΠΎΡ€ΠΈΡΠΎΠ²ΠΊΠΈ событий ΠΈ ΡΡ€Π°Π·Ρƒ ΠΆΠ΅ послС этого, Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π° выполнСния прорисовки ΠΈ startTime).

4. НуТная Π½Π°ΠΌ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° — пСрСмСнная wait, Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ врСмя, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ (ввСсти Π² ΡΠΎΠ½). Оно вычисляСтся, ΠΊΠ°ΠΊ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ FPS ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ для выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ отрисовки. ИмСнно Π½Π° ΡΡ‚Ρƒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π΅ ΠΎΠΏΠ°ΡΠ°ΡΡΡŒ, ΠΏΠΎΡ‚Π΅Ρ€ΠΈ памяти ΠΈ «ΠΏΠΎΠ΄Π²ΠΈΡΠ°Π½ΠΈΠΉ» ΠΈΠ³Ρ€Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

private int FPS = 100;

private long targetTime = 1000 / FPS;

while (running) {

start = System. nanoTime ();

update ();

draw ();

elapsed = System. nanoTime () — start;

wait = targetTime — elapsed / 1 000 000;

if (wait < 0)

wait = 5;

try {

Thread.sleep (wait);

} catch (Exception e) {

e.printStackTrace ();

}

}

3.4 Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ°, вставка ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Окно Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (Ρ‚.Π΅. ΠΎΠΊΠ½ΠΎ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰Π΅Π΅ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°) Π² ΡΠ·Ρ‹ΠΊΠ΅ Java называСтся Ρ„Ρ€Π΅ΠΉΠΌΠΎΠΌ (frame). Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ AWT для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прСдусмотрСн класс Frame. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Swing Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ этого класса являСтся JFrame. Класс

JFrame Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ класс Frame ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚авляСт собой ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Swing, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° Ρ…олстС (canvas).

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„Ρ€Π΅ΠΉΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ бСсполСзный Ρ€Π°Π·ΠΌΠ΅Ρ€ — 0×0 пиксСлСй, поэтому устанавливаСм Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ setSize (int width, int height). И Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ — это опрСдСляСм, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ Ρ„Ρ€Π΅ΠΉΠΌ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΠ΄Π°:

frame. setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚.ΠΊ. ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

Π’ ΡΠ°ΠΌΠΎΠΌ ΠΊΠΎΠ½Ρ†Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ (true), ΠΈΠ½Π°Ρ‡Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ :

setVisible (boolean vis);

Окно создано, Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Для этих Ρ†Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹. Один ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… — это JPanel. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JPanel, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Π‘Π°ΠΌΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Π½Π°Ρˆ Ρ„Ρ€Π΅ΠΉΠΌ, происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° setContentPane (contentPane obj)

3.5 ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ update () ΠΈ draw ()

Π”Π°Π½Π½Ρ‹Π΅ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡ‚ΠΎΠΊ постоянно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для «Ρ‡ΠΈΡΡ‚ΠΎΡ‚Ρ‹» ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. Если ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Ρ‚ΡŒ порядок отрисовки, Ρ‚ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ графичСскиС Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ, ΠΈΠ»ΠΈ события Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π² ΡΠ²ΠΎΠ΅ΠΉ очСрСдности. ИмСнно эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ update ΠΈ draw. Update Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ отрисовки нашСго ΠΎΠΊΠ½Π°. Update ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ расчСты ΠΏΠΎ Π²ΡΠ΅ΠΌ измСнСниям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ Π² Π½Π°ΡˆΠ΅ΠΉ ΠΈΠ³Ρ€Π΅. Π£ΠΆΠ΅ послС этого, Π·Π° Π΄Π΅Π»ΠΎ бСрСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ draw, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ draw Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΈ ΡƒΠΆΠ΅ Ρ‚Π°ΠΌ взаимодСйствуСт Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graphics — drawImage. ΠŸΠΎΡ‚ΠΎΠΊ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ FPS, постоянно выполняСт эти Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚Π΅ΠΌ самым «ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π—Π΄Π΅ΡΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΡΡ‚ΡŒ. НСльзя Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ draw ΠΏΠ΅Ρ€Π΅Π΄ update, Ρ‚.ΠΊ. Π½Π° ΡΠΊΡ€Π°Π½Π΅ Ρ‚Π΅ΠΌ самым окаТСтся старый ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ контСкст.

3.6 Game State Manager

GameStateManager — абстрактная структура, которая просто Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠ° Π² ΠΈΠ³Ρ€ΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠΈ. ИмСнно ΠΎΠ½Π° Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ update ΠΈ draw Π²ΠΎ Π²ΡΠ΅Ρ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΈΠ³Ρ€Ρ‹. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ΅ мСсто Π΅Π΅ ΠΏΡ€ΠΈΡ…одится Π½Π° ΠΊΠ»Π°ΡΡ GameStateManager, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… поля — цСлочислСнная пСрСмСнная currentState ΠΈ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив gameStates абстрактного класса GameState, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ draw, update, init, keyPressed, keyReleased. Π’ ΠΌΠ°ΡΡΠΈΠ²Π΅ gameStates содСрТатся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния ΠΈΠ³Ρ€Ρ‹ (МСню, Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ1, Настройки ΠΈ Ρ‚. Π΄.). currentState — ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ³Ρ€Ρ‹ сСйчас Π°ΠΊΡ‚ΠΈΠ²Π΅Π½. ΠŸΠΎΡ‚ΠΎΠΊ постоянно обновляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ update ΠΈ draw ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GameStateManager, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ эти ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° gameStates, Π²Ρ‹Π·Ρ‹Π²Π°ΡΡΡŒ ΡƒΠΆΠ΅ ΠΈΠ· ΡΠ°ΠΌΠΎΠ³ΠΎ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’. Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GameStateManager Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΠ΅Ρ‚ с Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ ΠΈΠ³Ρ€Ρ‹, Π° Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Ρ массиву gameStates, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅ΠΆΠΈΠΌ сам своСврСмСнно Π½Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ сСбя, ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ‚рисуСт Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (рисунок 3.1).

Рисунок 3.1 — Π‘Ρ…Π΅ΠΌΠ° GSM

3.7 Бобытия ΠΊΠ½ΠΎΠΏΠΎΠΊ Как ΠΈ Ρ update ΠΈ draw, события ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GameStateManager. Π‘Π°ΠΌΠΎ событиС — это keyEvent. Оно ΠΆΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· GameStateManager Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π», Π³Π΄Π΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Скста. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши :

public void keyPressed (keyEvent key) {

if (key == VK_ENTER)

System.out.printl («The enter was pressed»);

}

Для ΡΠ»ΡƒΡˆΠ°Π½ΠΈΡ событий, класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс KeyListener, пСрСопрСдСляя ΠΌΡƒΡ‚ΠΎΠ΄Ρ‹ keyPressed (keyEvent) (клавиша Π½Π°ΠΆΠ°Ρ‚Π°) ΠΈ keyReleased (keyEvent) (клавиша ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°). keyEvent — события клавиш ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΈ ΠΎΡ‚пускании клавиши, соотвСтствСнно (рисунок 3.2).

Рисунок 3.2 — Π Π°Π±ΠΎΡ‚Π° с ΠΊΠ»Π°Π²ΠΈΡˆΠ°ΠΌΠΈ Π² GSM

4. ГрафичСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ Π“Ρ€Π°Ρ„ΠΈΠΊΡƒ Π² Java ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ классы Graphics ΠΈ Graphics2D. Π Π°Π±ΠΎΡ‚Π° с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ осущСствляСтся Π² Π³Ρ€Π°Ρ„ичСском контСкстС элСмСнтов, унаслСдованных ΠΎΡ‚ ΠΊΠ»Π°ΡΡΠ° Component. ΠŸΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ: Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ… управлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, JFrame, JPanel, JButton ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. Π’Π°ΠΊΠΈΠ΅ элСмСнты ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ графичСским контСкстом, Π² ΡΡ‚ΠΎΠΌ контСкстС ΠΌΡ‹ ΠΈ Ρ€ΠΈΡΡƒΠ΅ΠΌ. Всё, Ρ‡Ρ‚ΠΎ нарисовано Π² ΠΊΠΎΠ½Ρ‚СкстС, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π΅. ΠšΠ»Π°ΡΡΡ‹ Graphics ΠΈ Graphics2D Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Ρ€Π°Ρ„ичСским контСкстом. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр контСкста ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ paint:

public void paint (Graphics g);

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ наслСдуСтся ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° Component. АргумСнт Graphics g ΡΠΎΠ·Π΄Π°Ρ‘тся систСмой, Π° ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ Π΅Π³ΠΎ Π² Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для рисования. ΠŸΡ€ΠΈ создании элСмСнта ΠΌΠ΅Ρ‚ΠΎΠ΄ paint Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ автоматичСски.

4.1 ΠŸΡ€ΡΠΌΠ°Ρ линия ΠœΠ΅Ρ‚ΠΎΠ΄ drawLine класса Graphics Π½Π°Ρ‡Π΅Ρ€Ρ‚ΠΈΡ‚ ΠΏΡ€ΡΠΌΡƒΡŽ линию:

g.drawLine (x1, y1, x2, y2);

Π—Π΄Π΅ΡΡŒ x1 ΠΈ y2 — это ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y Π½Π°Ρ‡Π°Π»Π° Π»ΠΈΠ½ΠΈΠΈ, x2 ΠΈ y2 — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΊΠΎΠ½Ρ†Π° Π»ΠΈΠ½ΠΈΠΈ.

4.2 Π¦Π²Π΅Ρ‚ ΠœΠ΅Ρ‚ΠΎΠ΄ setColor класса Graphics сдСлаСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚:

АргумСнты конструктора new Color (0, 0, 255) — это красный, Π·Π΅Π»Ρ‘Π½Ρ‹ΠΉ ΠΈ ΡΠΈΠ½ΠΈΠΉ Ρ†Π²Π΅Ρ‚Π° соотвСтствСнно (rgb). Как Π·Π°Π΄Π°Ρ‚ΡŒ rgb Ρ†Π²Π΅Ρ‚Π°? Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°Π΄Π°Π½ чисто синий Ρ†Π²Π΅Ρ‚, Ρ‚.ΠΊ. значСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ. Π’ΠΎΡ‚ красный ΠΈ Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚Π°:

Color newColor = new Color (255, 0, 0);

Color newColor = new Color (0, 255, 0);

4.3 Π¦Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° Π—Π°Π΄Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ setBackground:

mainFrame.setBackground (Color.white);

4.4 ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΠ°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ drawRect класса Graphics, Π³Π΄Π΅ x1, y1 — это ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°;

x2, y2 — высота ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°:

g.drawRect (x1, y1, x2, y2);

4.5 Овал ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ drawOval класса Graphics рисуСтся ΠΎΠ²Π°Π»:

g.drawOval (20, 110, 150, 60);

АргумСнты ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вписан ΠΎΠ²Π°Π».

4.6 ΠœΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ drawPolygon класса Graphics:

int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50};

int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190};

Polygon poly = new Polygon (arrayX, arrayY, 8);

g.drawPolygon (poly);

Π—Π΄Π΅ΡΡŒ создаём ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Polygon. arrayX — это Ρ…-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, arrayY — это y-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, 8 — число Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

4.7 ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс Point:

Point aPoint = new Point (50, 190);

Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ — это x, y ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹.

4.8 Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ класс Graphics2D. НСпосрСдствСнно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Graphics2D Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ графичСский контСкст сильно зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ графичСской ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, этот класс сдСлан абстрактным. Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ — это явноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Graphics:

Graphics2D g2 = (Graphics2D) g;

Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graphics2D имССтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ — drawImage (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, собствСнно, ΠΈ Ρ€ΠΈΡΡƒΠ΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡ€Π°Π½. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ:

g2.drawImage (image, 0, 0, width, height, null);

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ…ΠΎΠ΄Π΅ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π±Ρ‹Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ основныС элСмСнты программирования Π½Π° Java. Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΈ рассмотрСны основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ прилоТСниями. Π”Π°Π½Π½ΠΎΠ΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ для Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования памяти. Π’Π°ΠΊΠΆΠ΅ использовалась вСсьма удобная игровая структура GameStateManager, которая обСспСчиваСт распрСдСлСниС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ. Π’ ΠΈΡ‚ΠΎΠ³Π΅, для дСмонстрации ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½Ρ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠΎΠ², Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Ρ€ Π±Π΅Π· использования сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π’ Ρ…ΠΎΠ΄Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… клавиш, ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ пСрсонаТ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия: Ρ…ΠΎΠ΄ΡŒΠ±Π°, ΠΏΡ€Ρ‹ΠΆΠΎΠΊ, ΠΏΠΎΠ»Π΅Ρ‚, ΡƒΠ΄Π°Ρ€ Ρ€ΡƒΠΊΠΎΠΉ, ΡΡ‚Ρ€Π΅Π»ΡŒΠ±Π°. Π£Ρ€ΠΎΠ²Π½ΠΈ создавались Π² Ρ‚Скстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°. ΠŸΠ΅Ρ€ΡΠΎΠ½Π°ΠΆ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΉΡ‚ΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ уровня, ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΈΡ€ΡƒΡŽ со ΡΡ‚Π΅Π½Π°ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠ»ΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΠΎΠΌ. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ рСсурсов использовались .gif, .jpg ΠΈ .png Ρ„Π°ΠΉΠ»Ρ‹. Π’Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΉΠ» ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ .map, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, каТдая Ρ†ΠΈΡ„Ρ€Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ «ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΠΈ» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ участок ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° titles.

Π˜Π³Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Ρ€ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²: GameState, Entity, Main, TileMap. GameState — ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΈΠ³Ρ€Ρ‹. Π’ Entity находятся классы для пСрсонаТСй ΠΈΠ³Ρ€Ρ‹ ΠΈ ΠΈΡ… Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Ρ‹Π΅ дСйствия. Из ΠΏΠ°ΠΊΠ΅Ρ‚Π° Main начинаСтся запуск ΠΈΠ³Ρ€Ρ‹, ΠΈΠ΄Π΅Ρ‚ полная настройка Ρ„Ρ€Π΅ΠΉΠΌΠ° с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠ°Π½Π΅Π»ΠΈ. ИмСнно ΠΎΡ‚ΡΡŽΠ΄Π° Π±Π΅Ρ€ΡƒΡ‚ своС Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ TileMap ΠΈΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠ°Ρ€Ρ‚Ρ‹, Π΅Π΅ ΠΏΡ€ΠΎΡ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„ΠΎΠ½ΠΎΠΌ.

Π”Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π»ΡŽΠ±Ρ‹Ρ… desktop — устройствах, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… установлСна JVM. Запуск ΠΈΠ΄Π΅Ρ‚ ΠΈΠ· jar Ρ„Π°ΠΉΠ»Π°. Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ планируСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π²Π΅Π± ΠΈ Π½Π° ΠžΠ‘ Android.

ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ java компиляция Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников

Andrew Davison, Killer Game Programming in Java — «O'Reilly Media», Май 2005, — 998 c.

Java2. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° профСссионала Π’ΠΎΠΌ 1. ΠžΡΠ½ΠΎΠ²Ρ‹, 8 — Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ — «Sun microsystems», 2010 — 820 c.

ЭккСль, Π‘. Ѐилософия Java. / Π‘. ЭккСль. — Π‘Пб.: ΠŸΠΈΡ‚Π΅Ρ€, 2001. — 880 с.

Π¨ΠΈΠ»Π΄Ρ‚, Π“. Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° JAVA / Π“. Π¨ΠΈΠ»Π΄Ρ‚, Π”ΠΆ. Π₯олмс. — Πœ.: Π’ΠΈΠ»ΡŒΡΠΌΡ, 2005. — 331 с.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ A

ОписаниС класса Game ΠΏΠ°ΠΊΠ΅Ρ‚Π° Main

package Main;

import javax.swing.JFrame;

public class Game {

public static void main (String[] args) {

JFrame window = new JFrame («Game»);

window.setContentPane (new GamePanel ());

window.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

window.setResizable (false);

window.pack ();

window.setVisible (true);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘ ОписаниС класса GamePanel ΠΏΠ°ΠΊΠ΅Ρ‚Π° Main

package Main;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.awt.event.*;

import javax.swing.JPanel;

import GameState. GameStateManager;

@SuppressWarnings («serial»)

public class GamePanel extends JPanel implements Runnable, KeyListener {

// Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹

public static final int WIDTH = 800;

public static final int HEIGHT = 600;

public static final int SCALE = 2;

// ΠΏΠΎΡ‚ΠΎΠΊ

private Thread thread;

private boolean running;

private int FPS = 100;

private long targetTime = 1000 / FPS;

// ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

private BufferedImage image;

private Graphics2D g;

// game state manager

private GameStateManager gsm;

public GamePanel () {

super ();

setPreferredSize (new Dimension (WIDTH * SCALE, HEIGHT * SCALE));

setFocusable (true);

requestFocus ();

}

public void addNotify () {

super.addNotify ();

if (thread == null) {

thread = new Thread (this);

addKeyListener (this);

thread.start ();

}

}

private void init () {

image = new BufferedImage (WIDTH, HEIGHT,

BufferedImage.TYPE_INT_RGB);

g = (Graphics2D) image. getGraphics ();

running = true;

gsm = new GameStateManager ();

}

public void run () {

init ();

long start;

long elapsed;

long wait;

// game loop

while (running) {

start = System. nanoTime ();

update ();

draw ();

drawToScreen ();

elapsed = System. nanoTime () — start;

wait = targetTime — elapsed / 1 000 000;

if (wait < 0)

wait = 5;

try {

Thread.sleep (wait);

} catch (Exception e) {

e.printStackTrace ();

}

}

}

private void update () {

gsm.update ();

}

private void draw () {

gsm.draw (g);

}

private void drawToScreen () {

Graphics g2 = getGraphics ();

g2.drawImage (image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);

g2.dispose ();

}

public void keyTyped (KeyEvent key) {

}

public void keyPressed (KeyEvent key) {

gsm.keyPressed (key.getKeyCode ());

}

public void keyReleased (KeyEvent key) {

gsm.keyReleased (key.getKeyCode ());

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’ ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса GameState ΠΏΠ°ΠΊΠ΅Ρ‚Π° GameState

package GameState;

public abstract class GameState {

protected GameStateManager gsm;

public abstract void init ();

public abstract void update ();

public abstract void draw (Java.awt.Graphics2D g);

public abstract void keyPressed (int k);

public abstract void keyReleased (int k);

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π“ ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса GameStateManager ΠΏΠ°ΠΊΠ΅Ρ‚Π° GameState

package GameState;

import java.util.ArrayList;

public class GameStateManager {

private GameState[] gameStates;

private int currentState;

public static final int NUMGAMESTATES = 2;

public static final int MENUSTATE = 0;

public static final int LEVEL1STATE = 1;

public GameStateManager () {

gameStates = new GameState[NUMGAMESTATES];

currentState = MENUSTATE;

loadState (currentState);

}

private void loadState (int state) {

if (state == MENUSTATE)

gameStates[state] = new MenuState (this);

if (state == LEVEL1STATE)

gameStates[state] = new Level1State (this);

}

private void unloadState (int state) {

gameStates[state] = null;

}

public void setState (int state) {

unloadState (currentState);

currentState = state;

loadState (currentState);

//gameStates[currentState]. init ();

}

public void update () {

try {

gameStates[currentState]. update ();

} catch (Exception e) {}

}

public void draw (Java.awt.Graphics2D g) {

try {

gameStates[currentState]. draw (g);

} catch (Exception e) {}

}

public void keyPressed (int k) {

gameStates[currentState]. keyPressed (k);

}

public void keyReleased (int k) {

gameStates[currentState]. keyReleased (k);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π” ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса Level1State ΠΏΠ°ΠΊΠ΅Ρ‚Π° GameState

package GameState;

import Main. GamePanel;

import TileMap.*;

import Entity.*;

import java.awt.*;

import java.awt.event.KeyEvent;

import java.util.ArrayList;

public class Level1State extends GameState {

private TileMap tileMap;

private Background bg;

private Player player;

private ArrayList explosions;

private HUD hud;

public Level1State (GameStateManager gsm) {

this.gsm = gsm;

init ();

}

public void init () {

tileMap = new TileMap (30);

tileMap.loadTiles («/Tilesets/grasstileset2.gif»);

tileMap.loadMap («/Maps/level1.map»);

tileMap.setPosition (0, 0);

tileMap.setTween (1);

bg = new Background («/Backgrounds/back.gif», 0.1);

player = new Player (tileMap);

player.setPosition (100, 100);

explosions = new ArrayList ();

hud = new HUD (player);

}

public void update () {

// ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ пСрсонаТа

player.update ();

tileMap.setPosition (

GamePanel.WIDTH / 2 — player. getx (),

GamePanel.HEIGHT / 2 — player. gety ()

);

// Ρ„ΠΎΠ½

bg.setPosition (tileMap.getx (), tileMap. gety ());

// ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²Π·Ρ€Ρ‹Π²ΠΎΠ²

for (int i = 0; i < explosions. size (); i++) {

explosions.get (i).update ();

if (explosions.get (i).shouldRemove ()) {

explosions.remove (i);

i—;

}

}

}

public void draw (Graphics2D g) {

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΠ½

bg.draw (g);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚Ρƒ

tileMap.draw (g);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ пСрсонаТа

player.draw (g);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Ρ€Ρ‹Π²

for (int i = 0; i < explosions. size (); i++) {

explosions.get (i).setMapPosition (

(int)tileMap.getx (), (int)tileMap.gety ());

explosions.get (i).draw (g);

}

//Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ панСль Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ

hud.draw (g);

}

public void keyPressed (int k) {

if (k == KeyEvent. VK_LEFT) player. setLeft (true);

if (k == KeyEvent. VK_RIGHT) player. setRight (true);

if (k == KeyEvent. VK_UP) player. setUp (true);

if (k == KeyEvent. VK_DOWN) player. setDown (true);

if (k == KeyEvent. VK_W) player. setJumping (true);

if (k == KeyEvent. VK_E) player. setGliding (true);

if (k == KeyEvent. VK_R) player. setScratching ();

if (k == KeyEvent. VK_F) player. setFiring ();

}

public void keyReleased (int k) {

if (k == KeyEvent. VK_LEFT) player. setLeft (false);

if (k == KeyEvent. VK_RIGHT) player. setRight (false);

if (k == KeyEvent. VK_UP) player. setUp (false);

if (k == KeyEvent. VK_DOWN) player. setDown (false);

if (k == KeyEvent. VK_W) player. setJumping (false);

if (k == KeyEvent. VK_E) player. setGliding (false);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π• ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса MenuState ΠΏΠ°ΠΊΠ΅Ρ‚Π° GameState

package GameState;

import TileMap. Background;

import java.awt.*;

import java.awt.event.KeyEvent;

public class MenuState extends GameState {

private Background bg;

private int currentChoice = 0;

private String[] options = { «Start», «Help», «Quit» };

private Color titleColor;

private Font titleFont;

private Font font;

public MenuState (GameStateManager gsm) {

this.gsm = gsm;

try {

bg = new Background («/Backgrounds/back.jpg», 1);

bg.setVector (-0.2, 0);

titleColor = new Color (128, 0, 0);

titleFont = new Font («Charlemagne Std», Font. PLAIN, 28);

font = new Font («Charlemagne Std», Font. PLAIN, 12);

} catch (Exception e) {

e.printStackTrace ();

}

}

public void init () {

}

public void update () {

bg.update ();

}

public void draw (Graphics2D g) {

bg.draw (g);

g.setColor (titleColor);

g.setFont (titleFont);

g.drawString («Student dragon», 200, 90);

g.setFont (font);

for (int i = 0; i < options. length; i++) {

if (i == currentChoice) {

g.setColor (Color.BLACK);

} else {

g.setColor (Color.RED);

}

g.drawString (options[i], 324, 140 + (int) (i * 15 * 1.2));

}

}

private void select () {

if (currentChoice == 0) {

gsm.setState (GameStateManager.LEVEL1STATE);

}

if (currentChoice == 1) {

// help

}

if (currentChoice == 2) {

System.exit (0);

}

}

public void keyPressed (int k) {

if (k == KeyEvent. VK_ENTER) {

select ();

}

if (k == KeyEvent. VK_UP) {

currentChoice—;

if (currentChoice == -1) {

currentChoice = options. length — 1;

}

}

if (k == KeyEvent. VK_DOWN) {

currentChoice++;

if (currentChoice == options. length) {

currentChoice = 0;

}

}

}

public void keyReleased (int k) {

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π– ОписаниС класса Background ΠΏΠ°ΠΊΠ΅Ρ‚Π° TileMap

package TileMap;

import Main. GamePanel;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;

public class Background {

private BufferedImage image;

private double x;

private double y;

private double dx;

private double dy;

private double moveScale;

public Background (String s, double ms) {

try {

image = ImageIO. read (

getClass ().getResourceAsStream (s)

);

moveScale = ms;

}

catch (Exception e) {

e.printStackTrace ();

}

}

public void setPosition (double x, double y) {

this.x = (x * moveScale) % GamePanel. WIDTH;

this.y = (y * moveScale) % GamePanel. HEIGHT;

}

public void setVector (double dx, double dy) {

this.dx = dx;

this.dy = dy;

}

public void update () {

x += dx;

y += dy;

}

public void draw (Graphics2D g) {

g.drawImage (image, (int)x, (int)y, null);

if (x < 0) {

g.drawImage (

image,

(int)x + GamePanel. WIDTH,

(int)y,

null

);

}

if (x > 0) {

g.drawImage (

image,

(int)x — GamePanel. WIDTH,

(int)y,

null

);

}

if (x <= -GamePanel.WIDTH) {

x += GamePanel. WIDTH;

}}}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π— ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса Tile ΠΏΠ°ΠΊΠ΅Ρ‚Π° TileMap

import java.awt.image.BufferedImage;

public class Tile {

private BufferedImage image;

private int type;

// Ρ‚ΠΈΠΏΡ‹ Ρ‚Π°ΠΉΠ»ΠΎΠ²

public static final int NORMAL = 0;

public static final int BLOCKED = 1;

public Tile (BufferedImage image, int type) {

this.image = image;

this.type = type;

}

public BufferedImage getImage () { return image; }

public int getType () { return type; }

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ И ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса TileMap ΠΏΠ°ΠΊΠ΅Ρ‚Π° TileMap

import java.awt.*;

import java.awt.image.*;

import java.io.*;

import javax.imageio.ImageIO;

import Main. GamePanel;

public class TileMap {

// позиция

private double x;

private double y;

// Π³Ρ€Π°Π½ΠΈΡ†Ρ‹

private int xmin;

private int ymin;

private int xmax;

private int ymax;

private double tween;

// ΠΊΠ°Ρ€Ρ‚Π°

private int[][] map;

private int tileSize;

private int numRows;

private int numCols;

private int width;

private int height;

// Ρ‚Π°ΠΉΠ»Ρ‹

private BufferedImage tileset;

private int numTilesAcross;

private Tile[][] tiles;

// рисования

private int rowOffset;

private int colOffset;

private int numRowsToDraw;

private int numColsToDraw;

public TileMap (int tileSize) {

this.tileSize = tileSize;

numRowsToDraw = GamePanel. HEIGHT / tileSize + 2;

numColsToDraw = GamePanel. WIDTH / tileSize + 2;

tween = 0.07;

}

public void loadTiles (String s) {

try {

tileset = ImageIO. read (getClass ().getResourceAsStream (s));

numTilesAcross = tileset. getWidth () / tileSize;

tiles = new Tile[2][numTilesAcross];

BufferedImage subimage;

for (int col = 0; col < numTilesAcross; col++) {

subimage = tileset. getSubimage (col * tileSize, 0, tileSize, tileSize);

tiles[0][col] = new Tile (subimage, Tile. NORMAL);

subimage = tileset. getSubimage (col * tileSize,

tileSize, tileSize, tileSize);

tiles[1][col] = new Tile (subimage, Tile. BLOCKED);

}

} catch (Exception e) {

e.printStackTrace ();

}

}

public void loadMap (String s) {

try {

InputStream in = getClass ().getResourceAsStream (s);

BufferedReader br = new BufferedReader (

new InputStreamReader (in)

);

numCols = Integer. parseInt (br.readLine ());

numRows = Integer. parseInt (br.readLine ());

map = new int[numRows][numCols];

width = numCols * tileSize;

height = numRows * tileSize;

xmin = GamePanel. WIDTH — width — 100;

xmax = 0;

ymin = GamePanel. HEIGHT — height;//here

ymax = 0;

String delims = «\s+» ;

for (int row = 0; row < numRows; row++) {

String line = br. readLine ();

String[] tokens = line. split (delims);

for (int col = 0; col < numCols; col++) {

map[row][col] = Integer. parseInt (tokens[col]);

}

}

} catch (Exception e) {

e.printStackTrace ();

}

}

public int getTileSize () {

return tileSize;

}

public double getx () {

return x;

}

public double gety () {

return y;

}

public int getWidth () {

return width;

}

public int getHeight () {

return height;

}

public int getType (int row, int col) {

int rc = map[row][col];

int r = rc / numTilesAcross;

int c = rc % numTilesAcross;

return tiles[r][c]. getType ();

}

public void setTween (double d) {

tween = d;

}

public void setPosition (double x, double y) {

this.x += (x — this. x) * tween;

this.y += (y — this. y) * tween;

fixBounds ();

colOffset = (int) -this.x / tileSize;

rowOffset = (int) -this.y / tileSize;

}

private void fixBounds () {

if (x < xmin)

x = xmin;

if (y < ymin)

y = ymin;

if (x > xmax)

x = xmax;

if (y > ymax)

y = ymax;

}

public void draw (Graphics2D g) {

for (int row = rowOffset; row < rowOffset + numRowsToDraw; row++) {

if (row >= numRows)

break;

for (int col = colOffset; col < colOffset +

numColsToDraw; col++)

{

if (col >= numCols)

break;

if (map[row][col] == 0)

continue;

int rc = map[row][col];

int r = rc / numTilesAcross;

int c = rc % numTilesAcross;

g.drawImage (tiles[r][c]. getImage (),

(int) x + col * tileSize,

(int) y + row * tileSize, null);

}

}

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ К ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса Animation ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import java.awt.image.BufferedImage;

public class Animation {

private BufferedImage[] frames;

private int currentFrame;

private long startTime;

private long delay;

private boolean playedOnce;

public Animation () {

playedOnce = false;

}

public void setFrames (BufferedImage[] frames) {

this.frames = frames;

currentFrame = 0;

startTime = System. nanoTime ();

playedOnce = false;

}

public void setDelay (long d) {

delay = d;

}

public void setFrame (int i) {

currentFrame = i;

}

public void update () {

if (delay == -1)

return;

long elapsed = (System.nanoTime () — startTime) / 1 000 000;

if (elapsed > delay) {

currentFrame++;

startTime = System. nanoTime ();

}

if (currentFrame == frames. length) {

currentFrame = 0;

playedOnce = true;

}

}

public int getFrame () {

return currentFrame;

}

public BufferedImage getImage () {

return frames[currentFrame];

}

public boolean hasPlayedOnce () {

return playedOnce;

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π› ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса Explosion ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

public class Explosion {

private int x;

private int y;

private int xmap;

private int ymap;

private int width;

private int height;

private Animation animation;

private BufferedImage[] sprites;

private boolean remove;

public Explosion (int x, int y) {

this.x = x;

this.y = y;

width = 30;

height = 30;

try {

BufferedImage spritesheet = ImageIO. read (

getClass ().getResourceAsStream (

" /Sprites/Enemies/explosion.gif"

)

);

sprites = new BufferedImage[6];

for (int i = 0; i < sprites. length; i++) {

sprites[i] = spritesheet. getSubimage (

i * width,

0,

width,

height

);

}

}

catch (Exception e) {

e.printStackTrace ();

}

animation = new Animation ();

animation.setFrames (sprites);

animation.setDelay (70);

}

public void update () {

animation.update ();

if (animation.hasPlayedOnce ()) {

remove = true;

}

}

public boolean shouldRemove () { return remove; }

public void setMapPosition (int x, int y) {

xmap = x;

ymap = y;

}

public void draw (Graphics2D g) {

g.drawImage (

animation.getImage (),

x + xmap — width / 2,

y + ymap — height / 2,

null

);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ М ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса FireBall ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import Main. GamePanel;

import TileMap. TileMap;

import java.awt.*;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

public class FireBall extends MapObject {

private boolean hit;

private boolean remove;

private BufferedImage[] sprites;

private BufferedImage[] hitSprites;

public FireBall (TileMap tm, boolean right) {

super™;

facingRight = right;

moveSpeed = 3.8;

if (right) dx = moveSpeed;

else dx = -moveSpeed;

width = 30;

height = 30;

cwidth = 14;

cheight = 14;

// load sprites

try {

BufferedImage spritesheet = ImageIO. read (

getClass ().getResourceAsStream (

" /Sprites/Player/fireball.gif"

)

);

sprites = new BufferedImage[4];

for (int i = 0; i < sprites. length; i++) {

sprites[i] = spritesheet. getSubimage (

i * width,

0,

width,

height

);

}

hitSprites = new BufferedImage[3];

for (int i = 0; i < hitSprites. length; i++) {

hitSprites[i] = spritesheet. getSubimage (

i * width,

height,

width,

height

);

}

animation = new Animation ();

animation.setFrames (sprites);

animation.setDelay (70);

}

catch (Exception e) {

e.printStackTrace ();

}

}

public void setHit () {

if (hit) return;

hit = true;

animation.setFrames (hitSprites);

animation.setDelay (70);

dx = 0;

}

public boolean shouldRemove () {

return remove;

}

public void update () {

checkTileMapCollision ();

setPosition (xtemp, ytemp);

if (dx == 0 && !hit) {

setHit ();

}

animation.update ();

if (hit && animation. hasPlayedOnce ()) {

remove = true;

}

}

public void draw (Graphics2D g) {

setMapPosition ();

super.draw (g);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Н ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса HUD ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import java.awt.*;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

public class HUD {

private Player player;

private BufferedImage image;

private Font font;

public HUD (Player p) {

player = p;

try {

image = ImageIO. read (

getClass ().getResourceAsStream (

" /HUD/hud.gif"

)

);

font = new Font («Arial», Font. PLAIN, 14);

}

catch (Exception e) {

e.printStackTrace ();

}

}

public void draw (Graphics2D g) {

g.drawImage (image, 0, 10, null);

g.setFont (font);

g.setColor (Color.WHITE);

g.drawString (

player.getHealth () + «/» + player. getMaxHealth (),

30,

);

g.drawString (

player.getFire () / 100 + «/» + player. getMaxFire () / 100,

30,

);

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ О ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса MapObject ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import Main. GamePanel;

import TileMap. TileMap;

import TileMap. Tile;

import java.awt.Rectangle;

public abstract class MapObject {

protected TileMap tileMap;

protected int tileSize;

protected double xmap;

protected double ymap;

// позиция

protected double x;

protected double y;

protected double dx;

protected double dy;

// ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅

protected int width;

protected int height;

// коллизия

protected int cwidth;

protected int cheight;

// Π΅Ρ‰Π΅ коллизия

protected int currRow;

protected int currCol;

protected double xdest;

protected double ydest;

protected double xtemp;

protected double ytemp;

protected boolean topLeft;

protected boolean topRight;

protected boolean bottomLeft;

protected boolean bottomRight;

// анимация

protected Animation animation;

protected int currentAction;

protected int previousAction;

protected boolean facingRight;

// Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

protected boolean left;

protected boolean right;

protected boolean up;

protected boolean down;

protected boolean jumping;

protected boolean falling;

// свойства двиТСния

protected double moveSpeed;

protected double maxSpeed;

protected double stopSpeed;

protected double fallSpeed;

protected double maxFallSpeed;

protected double jumpStart;

protected double stopJumpSpeed;

public MapObject (TileMap tm) {

tileMap = tm;

tileSize = tm. getTileSize ();

}

public boolean intersects (MapObject o) {

Rectangle r1 = getRectangle ();

Rectangle r2 = o. getRectangle ();

return r1. intersects (r2);

}

public Rectangle getRectangle () {

return new Rectangle (

(int)x — cwidth,

(int)y — cheight,

cwidth,

cheight

);

}

public void calculateCorners (double x, double y) {

int leftTile = (int)(x — cwidth / 2) / tileSize;

int rightTile = (int)(x + cwidth /2 — 1) / tileSize;

int topTile = (int)(y — cheight / 2) / tileSize;

int bottomTile = (int)(y + cheight / 2 — 1) / tileSize;

int tl = tileMap. getType (topTile, leftTile);

int tr = tileMap. getType (topTile, rightTile);

int bl = tileMap. getType (bottomTile, leftTile);

int br = tileMap. getType (bottomTile, rightTile);

topLeft = tl == Tile. BLOCKED;

topRight = tr == Tile. BLOCKED;

bottomLeft = bl == Tile. BLOCKED;

bottomRight = br == Tile. BLOCKED;

}

public void checkTileMapCollision () {

currCol = (int)x / tileSize;

currRow = (int)y / tileSize;

xdest = x + dx;

ydest = y + dy;

xtemp = x;

ytemp = y;

calculateCorners (x, ydest);

if (dy < 0) {

if (topLeft || topRight) {

dy = 0;

ytemp = currRow * tileSize + cheight / 2;

}

else {

ytemp += dy;

}

}

if (dy > 0) {

if (bottomLeft || bottomRight) {

dy = 0;

falling = false;

ytemp = (currRow + 1) * tileSize — cheight / 2;

}

else {

ytemp += dy;

}

}

calculateCorners (xdest, y);

if (dx < 0) {

if (topLeft || bottomLeft) {

dx = 0;

xtemp = currCol * tileSize + cwidth / 2;

}

else {

xtemp += dx;

}

}

if (dx > 0) {

if (topRight || bottomRight) {

dx = 0;

xtemp = (currCol + 1) * tileSize — cwidth / 2;

}

else {

xtemp += dx;

}

}

if (!falling) {

calculateCorners (x, ydest + 1);

if (!bottomLeft && !bottomRight) {

falling = true;

}

}

}

public int getx () { return (int)x; }

public int gety () { return (int)y; }

public int getWidth () { return width; }

public int getHeight () { return height; }

public int getCWidth () { return cwidth; }

public int getCHeight () { return cheight; }

public void setPosition (double x, double y) {

this.x = x;

this.y = y;

}

public void setVector (double dx, double dy) {

this.dx = dx;

this.dy = dy;

}

public void setMapPosition () {

xmap = tileMap. getx ();

ymap = tileMap. gety ();

}

public void setLeft (boolean b) { left = b; }

public void setRight (boolean b) { right = b; }

public void setUp (boolean b) { up = b; }

public void setDown (boolean b) { down = b; }

public void setJumping (boolean b) { jumping = b; }

public boolean notOnScreen ()

public void draw (Java.awt.Graphics2D g) {

if (facingRight) {

g.drawImage (

animation.getImage (),

(int)(x + xmap — width / 2),

(int)(y + ymap — height / 2),

null

);

}

else {

g.drawImage (

animation.getImage (),

(int)(x + xmap — width / 2 + width),

(int)(y + ymap — height / 2),

— width,

height,

null

);

}

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ П ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ класса Player ΠΏΠ°ΠΊΠ΅Ρ‚Π° Entity

package Entity;

import TileMap.*;

import java.util.ArrayList;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.util.HashMap;

public class Player extends MapObject {

// дСйствия ΠΈΠ³Ρ€ΠΎΠΊΠ°

private int health;

private int maxHealth;

private int fire;

private int maxFire;

private boolean dead;

private boolean flinching;

private long flinchTimer;

// ΡΡ‚Ρ€Π΅Π»ΡŒΠ±Π°

private boolean firing;

private int fireCost;

private int fireBallDamage;

private ArrayList fireBalls;

// ΡƒΠ΄Π°Ρ€ Ρ€ΡƒΠΊΠΎΠΉ

private boolean scratching;

private int scratchDamage;

private int scratchRange;

// ΠΏΠΎΠ»Π΅Ρ‚

private boolean gliding;

// анимация

private ArrayList sprites;

private final int[] numFrames = {

2, 8, 1, 2, 4, 2, 5

};

// id Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

private static final int IDLE = 0;

private static final int WALKING = 1;

private static final int JUMPING = 2;

private static final int FALLING = 3;

private static final int GLIDING = 4;

private static final int FIREBALL = 5;

private static final int SCRATCHING = 6;

public Player (TileMap tm) {

super™;

width = 30;

height = 30;

cwidth = 30;

cheight = 30;

moveSpeed = 0.3;

maxSpeed = 1.6;

stopSpeed = 0.4;

fallSpeed = 0.15;

maxFallSpeed = 4.0;

jumpStart = -4.8;

stopJumpSpeed = 0.3;

facingRight = true;

health = maxHealth = 5;

fire = maxFire = 2500;

fireCost = 200;

fireBallDamage = 5;

fireBalls = new ArrayList ();

scratchDamage = 8;

scratchRange = 40;

// Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° спрайтов

try {

BufferedImage spritesheet = ImageIO. read (

getClass ().getResourceAsStream (

" /Sprites/Player/playersprites.gif"

)

);

sprites = new ArrayList ();

for (int i = 0; i < 7; i++) {

BufferedImage[] bi =

new BufferedImage[numFrames[i]];

for (int j = 0; j < numFrames[i]; j++) {

if (i ≠ SCRATCHING) {

bi[j] = spritesheet. getSubimage (

j * width,

i * height,

width,

height

);

}

else {

bi[j] = spritesheet. getSubimage (

j * width * 2,

i * height,

width * 2,

height

);

}

}

sprites.add (bi);

}

}

catch (Exception e) {

e.printStackTrace ();

}

animation = new Animation ();

currentAction = IDLE;

animation.setFrames (sprites.get (IDLE));

animation.setDelay (400);

}

public int getHealth () { return health; }

public int getMaxHealth () { return maxHealth; }

public int getFire () { return fire; }

public int getMaxFire () { return maxFire; }

public void setFiring () {

firing = true;

}

public void setScratching () {

scratching = true;

}

public void setGliding (boolean b) {

gliding = b;

}

public void hit (int damage) {

if (flinching) return;

health -= damage;

if (health < 0) health = 0;

if (health == 0) dead = true;

flinching = true;

flinchTimer = System. nanoTime ();

}

private void getNextPosition () {

// Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

if (left) {

dx -= moveSpeed;

if (dx < -maxSpeed) {

dx = -maxSpeed;

}

}

else if (right) {

dx += moveSpeed;

if (dx > maxSpeed) {

dx = maxSpeed;

}

}

else {

if (dx > 0) {

dx -= stopSpeed;

if (dx < 0) {

dx = 0;

}

}

else if (dx < 0) {

dx += stopSpeed;

if (dx > 0) {

dx = 0;

}

}

}

// Π²ΠΎ Π²Ρ€Π΅ΠΌΡ ΡƒΠ΄Π°Ρ€Π° Π·Π°ΠΏΡ€Π΅Ρ‚ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

if (

(currentAction == SCRATCHING || currentAction == FIREBALL) &&

!(jumping || falling)) {

dx = 0;

}

// ΠΏΡ€Ρ‹ΠΆΠΎΠΊ

if (jumping && !falling) {

dy = jumpStart;

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ