Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€ для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 23

Автор Майкл ΠœΠΎΡ€Ρ€ΠΈΡΠΎΠ½

Π˜Π³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ» – это Ρ†ΠΈΠΊΠ» while, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ sleeping Π»ΠΎΠΆΠ½ΠΎ. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ update(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обновляСт Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ, послС Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ draw(), ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ sleep() класса Thread ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, которая опрСдСляСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ frameDelay. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° управляСт Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ update() вызываСтся Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΌΠ΅Ρ‚ΠΎΠ΄ update() вызываСтся 30 Ρ€Π°Π· Π² сСкунду, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ частота смСны ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² ΠΌΠΈΠ΄Π»Π΅Ρ‚Π΅ UFO Ρ€Π°Π²Π½Π° 30 ΠΊΠ°Π΄Ρ€ΠΎΠ²/с. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΠ΅Ρ‚ΠΎΠ΄ update() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° случайноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ скорости Π»Π΅Ρ‚Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ полоТСния. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ измСняСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

if (rand.nextInt() % 5 == 0) {

ufoXSpeed = Math.min(Math.max(ufoXSpeed + rand.nextInt() % 2, -8), 8);

ufoYSpeed = Math.min(Math.max(ufoYSpeed + rand.nextInt() % 2, -8), 8);

}...

Π‘ΠΎΠ²Π΅Ρ‚ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ

ΠœΠ΅Ρ‚ΠΎΠ΄ update() β€“ это самый Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, создавая ΠΈΠ³Ρ€Ρ‹ Π² срСдС J2ME. Одно Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° update() составляСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ», этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ стук сСрдца вашСй ΠΈΠ³Ρ€Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ каТдая строка ΠΊΠΎΠ΄Π° этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π° ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния эффСктивности. Π‘ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ°ΠΌΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ³Ρ€ Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ Π² Π³Π»Π°Π²Π΅ 17.

ΠœΠ΅Ρ‚ΠΎΠ΄ nextInt() класса Random() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для случайной Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайного Ρ†Π΅Π»ΠΎΠ³ΠΎ числа. Если число дСлится Π½Π° 5, Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π»Π΅Ρ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ‚Π°Ρ€Π΅Π»ΠΊΠΈ измСняСтся. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Π½ΠΎ идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΠ›Πž Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ Π΄Π΅Π»ΠΈΠΌΠΎΡΡ‚ΡŒ числа Π½Π° 5 (%), Π² срСднСм ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° измСняСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π·Π° ΠΏΡΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ‡Π°Ρ‰Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ число, стоящСС ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ дСлимости. НапримСр, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΊΠ°Π΄Ρ€Π΅, Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ: rand.nextInt() % 3.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π»Π΅Ρ‚Π°ΡŽΡ‰Π΅ΠΉ Ρ‚Π°Ρ€Π΅Π»ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ измСняСтся Π½Π° случайноС число. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ -2 Π΄ΠΎ 2. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Math.min() ΠΈ Math.max() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ограничСния скорости, ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π²ΠΎΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ 8. ΠŸΡ€ΠΈ этом ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния скорости говорят ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ спрайт пСрСмСщаСтся Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

...

Π‘ΠΎΠ²Π΅Ρ‚ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ€ΠΎΠ³ для ограничСния скорости, число 8 – это Π½Π΅ магичСскоС число.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° случайно, ΠΌΠ΅Ρ‚ΠΎΠ΄ update() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΠ›Πž Π² Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

ufoSprite.move(ufoXSpeed, ufoYSpeed);

ΠœΠ΅Ρ‚ΠΎΠ΄ move() класса Sprite() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ спрайт Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ число пиксСлСй. Π’ этом случаС значСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ скорости спрайта – это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для смСщСния. Но здСсь Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΠ›Πž достигаСт края экрана? Π₯отя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ стСнок, Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны экрана, ΠΊΠ°ΠΊ Π² ΠΈΠ³Ρ€Π΅ Asteroids. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого:

if (ufoSprite.getX() < -ufoSprite.getWidth()) //По достиТСнии ΠΠ›Πž края экрана ΠΏΡ€ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌΡƒ

ufoSprite.setPosition(getWidth(), ufoSprite.getY());

else if (ufoSprite.getX() > getWidth())

ufoSprite.setPosition(-ufoSprite.getWidth(), ufoSprite.getY());

if (ufoSprite.getY() < -ufoSprite.getHeight()) //По достиТСнии ΠΠ›Πž края экрана ΠΏΡ€ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌΡƒ

ufoSprite.setPosition(ufoSprite.getX(), getHeight());

else if (ufoSprite.getY() > getHeight())

ufoSprite.setPosition(ufoSprite.getX(), -ufoSprite.getHeight());

Π’ этом ΠΊΠΎΠ΄Π΅ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ волшСбного, ΠΎΠ½ просто провСряСт, Π½Π΅ Π²Ρ‹ΡˆΠ΅Π» Π»ΠΈ ΠΠ›Πž Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ экрана. Если Π΄Π°, Ρ‚ΠΎ Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ появится Ρƒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ края.

...

Π‘ΠΎΠ²Π΅Ρ‚ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ

Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ΄Ρ‚ΠΈ ΠΏΠΎ стопам ΠΈΠ³Ρ€Ρ‹ Asteroids, Ρ‚ΠΎ поступитС Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΠΈΠ³Ρ€Π΅ Pong. ΠŸΡƒΡΡ‚ΡŒ ΠΠ›Πž отраТаСтся ΠΎΡ‚ ΠΊΡ€Π°Π΅Π² экрана. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ спрайта Π½Π° экранС, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π·Π½Π°ΠΊ Π΅Π³ΠΎ скорости. ИзмСнСниС Π·Π½Π°ΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ufoXSpeed ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΠ›Πž ΠΎΡ‚ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†, Π° ufoYSped – ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ.

ПослСдний элСмСнт Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠΈ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ UFOCanvas – это ΠΌΠ΅Ρ‚ΠΎΠ΄ draw(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вызываСтся для рисования Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ:

private void draw(Graphics g) {

// ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ экран

g.setColor(0x000000);

g.fillRect(0, 0, getWidth(), getHeight());

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ спрайт UFO

ufoSprite.paint(g);

// ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€

flushGraphics();

}

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ экран сначала очищаСтся ΠΈ заполняСтся Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ paint(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ рисуСт спрайт. Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ созданная Π³Ρ€Π°Ρ„ΠΈΠΊΠ° выводится Π½Π° экран, для Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ flushGraphics(). Π’ этом ΠΈ состоит вся ΠΏΡ€Π΅Π»Π΅ΡΡ‚ΡŒ Π΄Π²ΡƒΡ…Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ: Π²Ρ‹ создаСтС Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π΅Π΅ Π½Π° экран. Π‘Π΅Π· этого ΠΈΠ³Ρ€Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΏΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅, посмотритС листинг 5.1.

Листинг 5.1. Класс UFOCanvas – это класс холста ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° UFO

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

import java.util.*;

import java.io.*;

public class UFOCanvas extends GameCanvas implements Runnable {

private Display display;

private boolean sleeping;

private long frameDelay;

private Random rand;

private Sprite ufoSprite;

private int ufoXSpeed, ufoYSpeed;

public UFOCanvas(Display d) {

super(true);

display = d;

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ частоту ΠΊΠ°Π΄Ρ€ΠΎΠ² 30 ΠΊΠ°Π΄Ρ€ΠΎΠ²/с

frameDelay = 33;

}

public void start() {

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ холст ΠΊΠ°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ экран

display.setCurrent(this);

// инициализация Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° случайных чисСл

rand = new Random();

// инициализация спрайта ΠΠ›Πž

ufoXSpeed = ufoYSpeed = 3;

try {

ufoSprite = new Sprite(Image.createImage("/Saucer.png"));

ufoSprite.setPosition(0, 0); //ΠΠ›Πž стартуСт Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ экрана

}

catch (IOException e) {

System.err.println("Failed loading image!");

}

// запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

sleeping = false;

Thread t = new Thread(this);

t.start();

}

public void stop() {

// Stop the animation

sleeping = true;

}

public void run() {

Graphics g = getGraphics();

// The main game loop

while (!sleeping) {

update();

draw(g);

try {

Thread.sleep(frameDelay);

}

catch (InterruptedException ie) {}

}

}

private void update() {

// Randomly alter the UFO\'s speed

if (rand.nextInt() % 5 == 0) { //Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ скорости ΠΏΠΎ осям Π₯ ΠΈ Y Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ ΠΎΡ‚ -8 Π΄ΠΎ 8

ufoXSpeed = Math.min(Math.max(ufoXSpeed + rand.nextInt() % 2, -8), 8);

ufoYSpeed = Math.min(Math.max(ufoYSpeed + rand.nextInt() % 2, -8), 8);

}

// Move the sprite

ufoSprite.move(ufoXSpeed, ufoYSpeed);

// Wrap the UFO around the screen if necessary

if (ufoSprite.getX() < -ufoSprite.getWidth())

ufoSprite.setPosition(getWidth(), ufoSprite.getY());

else if (ufoSprite.getX() > getWidth())

ufoSprite.setPosition(-ufoSprite.getWidth(), ufoSprite.getY());

if (ufoSprite.getY() < -ufoSprite.getHeight())

ufoSprite.setPosition(ufoSprite.getX(), getHeight());

else if (ufoSprite.getY() > getHeight())

ufoSprite.setPosition(ufoSprite.getX(), -ufoSprite.getHeight());

}

private void draw(Graphics g) {

// Clear the display

g.setColor(0x000000);

g.fillRect(0, 0, getWidth(), getHeight());

// Draw the UFO sprite //Π‘ΠΏΡ€Π°ΠΉΡ‚ ΠΎΡ‡Π΅Π½ΡŒ просто вывСсти Π½Π° экран, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ paint()

ufoSprite.paint(g);

// Flush the offscreen graphics buffer

flushGraphics();

}

}

Когда ΠΊΠΎΠ΄ UFOCanvas ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π½ΠΈΡŽ этого класса Π² ΠΌΠΈΠ΄Π»Π΅Ρ‚. Π’ листингС 5.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ класса UFOMIDlet. Листинг 5.2. Код класса UFOMIDlet, хранящийся Π² Ρ„Π°ΠΉΠ»Π΅ UFOMIDlet.java

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class UFOMIDlet extends MIDlet implements CommandListener {

private UFOCanvas canvas;

public void startApp() {

if (canvas == null) {

canvas = new UFOCanvas(Display.getDisplay(this)); //НастраиваСмый холст – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ класс ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° ΠΎΡ‚ созданных Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²

Command exitCommand = new Command("Exit", Command.EXIT, 0);

canvas.addCommand(exitCommand);

canvas.setCommandListener(this);

}

// Start up the canvas

canvas.start();

}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {

canvas.stop();

}

public void commandAction(Command c, Displayable s) {

if (c.getCommandType() == Command.EXIT) {

destroyApp(true);

notifyDestroyed();

}

}

}

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

ВСстированиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΈΠ΄Π»Π΅Ρ‚ UFO собран, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² эмуляторС J2ME. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π»Π΅Ρ‚Π°ΡŽΡ‰Π°Ρ Ρ‚Π°Ρ€Π΅Π»ΠΊΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ экрану (рис. 5.7).

Рис. 5.7. Когда ΠΌΠΈΠ΄Π»Π΅Ρ‚ запускаСтся, ΠΏΠΎ экрану Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π»Π΅Ρ‚Π°Ρ‚ΡŒ ΠΠ›Πž

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ слоТно ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚ΠΎ Π½Π° рис. 5.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС экрана.

Рис. 5.8. Как ΠΊΡ€ΠΎΠ»ΠΈΠΊ ΠΈΠ· Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹ Energizer, ΠΠ›Πž бСспрСстанно Π»Π΅Ρ‚Π°Π΅Ρ‚ ΠΏΠΎ экрану

ВсС, Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π² ΠΌΠΈΠ΄Π»Π΅Ρ‚Π΅ UFO, β€“ это ΠΏΠ°Ρ€Π° астСроидов ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ управлСния ΠΠ›Πž. НС Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, ΠΌΡ‹ восполним этот ΠΏΡ€ΠΎΠ±Π΅Π» Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

РСзюмС

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹ познакомились с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠ³Ρ€Π°Ρ…. Π’Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ анимация ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ создании Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ², Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΈΠ³Ρ€. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ³Ρ€ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° основных Ρ‚ΠΈΠΏΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, ΠΈ Π² этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± основах спрайтовой Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ MIDP API. Π“Π»Π°Π²Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ созданиСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСмонстрируСт основы спрайтовой Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ Π²Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ свои знания Π² области создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ для программирования управляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.