Пишем Space Invaders при помощи Corona. Реализация геймплея. Часть 2


Оглавление (нажмите, чтобы открыть):

Пишем Space Invaders при помощи Corona. Реализация геймплея. Часть 2

Итак, первое что хочется отметить, это графика. Выполнена она в милом (немного мультяшном) 2D стиле и имеет хорошую детализацию.

После того как нас введут в курс событий у вас будет возможность выбрать звёздную системы для полёта, и планету для исследования.

Основной фишкой является время. Чтобы совершить перелёт в другую систему надо время, чтобы переработать ресурсов тоже надо время, и т.д.

В игре имеется 4 главных ресурса, а именно:
Енергия , служит топливом и самой енергией для корабля. Пополняется со временем. Необходима для переработки ресурсов, стрельбы из бортовых орудий и путешествий в космосе

Металы , служат для ремонта и апгрейда вашего корабля и орудий. Добывается путем переработки всякого хлама который вы собираете на планете

Еда , нужна чтобы ваш гг не сдох с голоду, и для прокачки его способностей (ХП, меткость, ум, реакция)
Добывается также как и металы

Кристаллики , проще говоря Премиум валюта. Сделает время ожидания меньше, и т.д. и т.п. Не особо напрягает (по крайней мере, в начале)

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

Некое подобие Space Invaders

26.06.2020, 17:49

Реализация боев в Space Invaders
Здравствуйте. Мне нужно написать игру на Паскале наподобие Space Invaders, где несколько уровней.

некое подобие Everesta
Доброго времени суток! Пишу курсовую работу. Задание — создать программу на подобии Everesta.

Некое подобие склада
Подскажите, плз, как сделать! Сущ таблица Склад, Заказ. Для заполнения таблицы Заказ сущ Форма.

Классическая Space Invaders, «выпадение» кораблей из нижнего ряда
Подскажите, пожалуйста, как сделать, чтобы из нижнего ряда передвигающейся матрицы врагов с.

Некое подобие файловой системы
В моем представлении это должно выглядеть так. Сперва создается файл заданного размера. Далее.

Create a Space Invaders Game in Corona: Implementing Gameplay

In the first part of this series, we set up some defaults for the game and laid the foundation for transitioning between scenes. In this part, we’ll begin implementing the game’s gameplay.

1. A Word about Metatables

The Lua programming language does not have a class system built in. However, by using Lua’s metatable construct we can emulate a class system. There is a good example on the Corona website showing how to implement this.

An important thing to note is that Corona’s Display objects cannot be set as the metatable. This has to do with how the underlying C language interfaces with them. A simple way to get around this is to set the Display object as a key on a new table and then put that table as the metatable. This is the approach that we’ll take in this tutorial.

If you read the above article on the Corona website, you will have noticed that the __Index metamethod was being used on the metatable. The way the __Index metamethod works, is that when you try to access an absent field in a table, it triggers the interpreter to look for an __Index metamethod. If the __Index is there, it will look for the field and prov >nil .

2. Implementing PulsatingText Class

The game has text that continuously grows and shrinks, creating a pulsating text effect. We will create this functionality as a module so we can use it throughout the project. Also, by having it as a module, we can use it in any project that would require this type of functionality.

Add the following to the pulsatingtext.lua file you created in the first part of this tutorial. Make sure this code and all code from here on is placed above where you are returning the scene object.

We create the main table pulsatingText and the table to be used as the metatable pulsatingText_mt . In the new method, we create the TextField object and add it to the table newPulsatingText that will be set as the metatable. We then add the TextField object to the group that was passed in through the parameter, which will be the scene’s group in which we instantiate an instance of PulsatingText .

It’s important to make sure that we add it to the scene’s group so it will be removed when the scene is removed. Finally, we set the metatable.

We have two methods that access the TextField object and perform operations on its properties. One sets the color by using the setFillColor method and takes as parameters the R, G, and B colors as a number from to 1. The other uses the Transition library to make the text grow and shrink. It enlarges the text by using the xScale and yScale properties. Setting the iterations property to -1 makes the action repeat forever.

3. Using the PulsatingText Class

Open start.lua and add the following code to the scene:create method.

We create an new TextField instance with the word «INVADERZ», set its color, and call the pulsate method. Notice how we passed the group variable as a parameter to ensure the TextField object gets added to this scene’s view hierarchy.

I have included a font in the downloads named «Conquest» that has a futuristic look to it. Make sure you add it to your project folder if you want to use it. I downloaded the font from dafont.com, which is a great website for finding custom fonts. However, make sure you adhere to the license the font author has put in place.

To use the font, we also need to update the project’s build.settings file. Take a look at the updated build.settings file.

If you test the project now, you should see the text was added to the scene and pulsates as expected.

4. Star Field Generator

To make the game a little more interesting, a moving star field is created in the background. To accomplish this, we do the same as we d >PulsatingText class and create a module. Create a file named starfieldgenerator.lua and add the following to it:

We first create the main table starFieldGenerator and the metatable starFieldGenerator_mt . In the new method, we have a table allStars that will be used to hold a reference to the stars that are created in the for loop. The number of iterations of the for loop is equal to numberOfStars and we use the Display object’s newCircle method to create a white circle.

We position the circle randomly within the game screen bounds and also give it a random size between 2 and 8. We insert each star into the allStars table and place them into the view that was passed in as a parameter, which is the scene’s view.

We set allStars and starSpeed as keys on the temporary table and then assign it as the metatable. We need access to the allStars table and starSpeed properties when we move the stars.

We’ll use two methods to move the stars. The starFieldGenerator:moveStars method does the moving of the stars while the starFieldGenerator:checkStarsOutOfBounds method checks if the stars are out of the screen’s bounds.

If the stars are out of the playing screen area, it generates a random x position for that particular star and sets the y position just above the top of the screen. By doing so, we are able to reuse the stars and it gives the illusion of a never-ending stream of stars.

We call these functions in the starFieldGenerator:enterFrame method. By setting the enterFrame method directly on this object, we can set this object as the context when we add the event listener.

Add the following code block to the scene:create method in start.lua:

Notice that we invoked the starGenerator.new method when we are adding the startButton . The order in which you add things to the scene does matter. If we were to add it after the start button, then some of the stars would have been on top of the button.

If you test the game now, you should see the scene littered with random stars. They are not moving, however. We need to move them in the scene:show method. Add the following to the scene:show method of start.lua.

Here we add the enterFrame event listener, which, if you recall, makes the stars move and checks if they are out of bounds.

Whenever you add an event listener, you should make sure you are also removing it at some point later in the program. The place to do that in this example is when the scene is removed. Add the following to the scene:hide event.

If you test the game now, you should see the stars moving and it will seem like an endless stream of stars. Once we add the player, it will also give the illusion of the player moving through space.

5. Game Level

When you press the startButton button, you are taken to the game level scene, which is a blank screen at the moment. Let’s fix that.

Step 1: Local Variables

Add the below code snippet to gamelevel.lua. You should make sure this code and all code from this point on is above where you are returning the scene object. These are the local variables we need for the game level, most of which are self-explanatory.


Step 2: Adding a Star Field

Like the previous scene, this scene also has a moving star field. Add the following to gamelevel.lua.

We are adding a star field to the scene. As before, we need to make the stars move, which we do in the scene:show method.

We are removing the previous scene and adding the enterFrame event listener. As I mentioned earlier, whenever you add an event listener, you need to make sure you eventually remove it. We do this in the scene:hide method.

Lastly, we should add the listeners for the create , show , and hide methods. If you run the application now, you should have a moving star field.

Step 3: Adding the Player

In this step, we’ll add the player to the scene and get it moving. This game uses the accelerometer to move the player. We will also use an alternative way to move the player in the simulator by adding buttons to the scene. Add the following code snippet to gamelevel.lua.

The player is a SpriteObject instance. By having the player be a sprite instead of a regular image, we can animate it. The player has two separate images, one with the thruster engaged and one with the thruster switched off.

By switching between the two images, we create the illusion of a never-ending thrust. We’ll accomplish this with an image sheet, which is one large image composed of a number of smaller images. By cycling through the different images, you can create an animation.

The options table holds the width , height , and numFrames of the indiv >numFrames variable contains the value of the number of smaller images. The playerSheet is an instance of the ImageSheet object, which takes as parameters the image and the options table.

The sequenceData variable is used by the SpriteObject instance, the start key is the image you wish to start the sequence or animation on while the count key is how many total images there are in the animation. The time key is how long it will take the animation to play and the loopCount key is how many times you wish the animation to play or repeat. By setting loopCount to 0 , it will repeat forever.

Lastly, you create the SpriteObject instance by passing in the ImageSheet instance and sequenceData .

We give the player a name key, which will be used to >x and y coordinates, invoke its play method, and insert it into the scene’s view.

We will be using Corona’s built in physics engine, which uses the popular Box2d engine under the hood, to detect collisions between objects. The default collision detection uses a bounding box method of detecting collisions, which means it places a box around the object and uses that for collision detection. This works fairly well for rectangular objects, or circles by using a radius property, but for oddly shaped objects it does not work out so well. Take a look at the below image to see what I mean.

You will notice that even though the laser is not touching the ship, it still registers as a collision. This is because it is colliding with the bounding box around the image.

To overcome this limitation, you can pass in a shape parameter. The shape parameter is a table of x and y coordinate pairs, with each pair defining a vertex point for the shape. These shape parameter coordinates can be quite difficult to figure out by hand, depending on the complexity of the image. To overcome this, I use a program called PhysicsEditor.

The physicsData variable is the file that was exported from PhysicsEditor. We call the addBody method of the physics engine, passing in the player and the physicsData variable. The result is that the collision detection will use the actual bounds of the spaceship instead of using bounding box collision detection. The below image clarifies this.

You can see that even though the laser is within the bounding box, no collision is triggered. Only when it touches the object’s edge will a collision be registered.

Мастер Йода рекомендует:  Ускоряем Javascript

Lastly, we set gravityScale to 0 on the player since we do not want it to be affected by gravity.

Now, invoke setupPlayer in the scene:create method.

If you run the game now, you should see the player added to the scene with its thruster engaged and activated.

Step 4: Moving the player

As mentioned earlier, we’ll be moving the player using the accelerometer. Add the following code to gamelevel.lua.

The onAccelerate function will be called each time the accelerometer interval is fired. It is set to fire 60 times per second. It’s important to know that the accelerometer can be a big drain on the device’s battery. In other words, if you are not using it for an extended period of time, it would be wise to remove the event listener from it.

If you test on a device, you should be able to move the player by tilting the device. This doesn’t work when testing in the simulator however. To remedy this, we’ll create a few temporary buttons.

Step 5: Debug Buttons

Add the following code to draw the debug buttons to the screen.

This code uses the Display ‘s newRect method to draw two rectangles to the screen. We then add a tap even listener to them that calls the local movePlayer function.

6. Firing Bullets

Step 1: Adding and Moving Bullets

When the user taps the screen, the player’s ship will fire a bullet. We will be limiting how often the user can fire a bullet by using a simple timer. Take a look at the implementation of the firePlayerBullet function.

We first check if the user is able to fire a bullet. We then create a bullet and give it a name property so we can identify it later. We add it as a physics body and give it the type dynamic since it will be moving with a certain velocity.

We set the gravityScale to 0 , because we do not want it to be affected by gravity, set the isBullet property to true , and set it to be sensor for collision detection. Lastly, we call setLinearVelocity to get the bullet moving on vertically. You can find out more about these properties in the documentation for Physics Bodies.

We load and play a sound, and then immediately release the memory associated with that sound. It’s important to release the memory from sound objects when they are no longer in use. We set canFireBullet to false and start a timer that sets it back to true after a short time.

We now need to add the tap listener to the Runtime . This is different from adding a tap listener to an indiv >Runtime listener is fired. This is because the Runtime is the global object for listeners.

We also need to make sure that we remove this event listener when we no longer need it.

If you test the game and tap the screen, a bullet should be added to the screen and move to the top of the device. There is a problem though. Once the bullet moves off-screen, they keep moving forever. This is not very useful for the game’s memory. Imagine having hundreds of bullets off-screen, moving into infinity. It would take up unnecessary resources. We’ll fix this issue in the next step.

Step 2: Removing Bullets

Whenever a bullet is created, it is stored in the playerBullets table. This makes it easy to reference each bullet and check its properties. What we will do is loop through the playerBullets table, check its y property, and, if it is off-screen, remove it from the Display and from the playerBullet table.

An important point to note is that we are looping through the playersBullet table in reverse order. If we were to loop through the table in normal fashion, when we remove an object it would throw the index off and cause a processing error. By looping through the table in reverse order, the object has already been processed. Also important to note is that when you remove an object from the Display , it should be set to nil .

Now we need a place to call this function. The most common way to do this is to create a game loop. If you are unfamiliar with the concept of the game loop, you should read this short article by Michael James Williams. We’ll implement the game loop in the next step.

Step 3: Create the Game Loop

Add the following code to gamelevel.lua to get started.

We need to call this function repeatedly for as long as the game is running. We will do this by using the Runtime ‘s enterFrame event. Add the following in the scene:show function.

We need to make sure we remove this event listener, when we leave this scene. We do this in the scene:hide function.

7. Invaders

Step 1: Adding Invaders

In this step, we will add the invaders. Start by adding the following code block.

Depending on which level the player is on, the rows will contain a different number of invaders. We set how many rows to create when we add the rowsOfInvaders key to the gameData table ( 3 ). The invaderNum is used to keep track of which level we’re on, but it is also used in some calculations.

To get the starting x position for the invader, we subtract half the invader’s w >(invaderNum * invaderSize + 10) is equal to. There is an offset of ten pixels between each invader, which is why we are adding to the invaderSize . That might all seem a little confusing so take your time to understand it.

We determine how many invaders there are per row by taking invaderNum * 2 and adding 1 to it. For example, on the first level invaderNum is 1 so we will have three invaders per row ( 1 * 2 + 1 ). On the second level, there will be five invaders per row, ( 2 * 2 + 1 ), etc.


We use nested for loops to set up the rows and columns respectively. In the second for loop we create the invader. We give it a name property so we can reference it later. If i is equal to the gameData.rowsOfInvaders , then we add the invader to the invadersWhoCanFire table. This ensures all invaders on the bottom row start out as being able to fire bullets. We set the physics up in the same way as the we d >player earlier, and insert the invader into the scene and into the invaders table so we can reference it later.

Step 2: Moving Invaders

In this step, we will move the invaders. We will use the gameLoop to check the invaders’s position and reverse their direction if necessary. Add the following code block to get started.

We loop through the invaders and change their x position by the value stored in the invaderSpeed variable. We see if the invader is out of bounds by checking leftBounds and rightBounds , which we set up earlier.

If an invader is out of bounds, we set changeDirection to true . If changeDirection is set to true , we negate the invaderSpeed variable, move the invaders down on the y axis by 16 pixels, and reset the changeDirection variable to false .

We invoke the moveInvaders function in the gameLoop function.

8. Detecting Collisions

Now that we have some invaders on screen and moving, we can check for collisions between any of the player’s bullets and the invaders. We perform this check in the onCollision function.

There are two ways to do collision detection using Corona’s built-in physics engine. One way is to register for the collision on the objects themselves. The other way is to listen globally. We use the global approach in this tutorial.

In the onCollision method, we check the name properties of the objects, set a small delay, and invoke the removeInvaderAndPlayerBullet function. Because we do not know what event.object1 and event.object2 will point to, we have to check both situations hence the two opposite if statements.

We send along some parameters with the timer so we can >playerBullet and the invader within the removePlayerAndBullet function. Whenever you are modifying an object’s properties in a collision check, you should apply a small delay before doing so. This is the reason for the short timer.

Ins >removeInvaderAndPlayerBullet function, we get a reference to the params key. We then get the index of the invader within the invaders table. Next, we determine how many invaders there are per row. If this number it is greater than invadersPerRow , we determine which invader to add to the invadersWhoCanFire table. The idea is that whichever invader was hit, the invader in the same column one row up can now fire.

We then set the invader to not be visible, remove its body from the physics engine, and remove it from theinvadersWhoCanFire table.

We remove the bullet from the physics engine, remove it from the playerBullets table, remove it from display, and set it to nil to be certain it is marked for garbage collection.

To make all this work, we need to listen for collision events. Add the following code to the scene:show method.

We need to make sure we remove this event listener when we leave the scene. We do this in the scene:hide method.

If you test the game now, you should be able to fire a bullet, hit an invader, and have both the bullet and the invader removed from the scene.

Conclusion

This brings this part of the series to a close. In the next and final part of this series, we will make the invaders fire bullets, make sure the player can die, and handle game over as well as new levels. I hope to see you there.

Создаем игру Space Invaders на HTML5

В этих уроках создадим игру по типу Space Invaders на HTML5 и Javascript с помощью примитивов.

Создаем игру Space Invaders на HTML5 — 1 — Введение

Создаем игру Space Invaders на HTML5 — 2 — Цикл игры

Создаем игру Space Invaders на HTML5 — 3 — Игрок

Создаем игру Space Invaders на HTML5 — 4 — Стрельба

Создаем игру Space Invaders на HTML5 — 5 — Оптимизация

Создаем игру Space Invaders на HTML5 — 6 — Добавляем захватчиков

Создаем игру Space Invaders на HTML5 — 7 — Столкновения

Создаем игру Space Invaders на HTML5 — 8 — Стрельба Врагов

Создаем игру Space Invaders на HTML5 — 8.1 — Правим баг

Создаем игру Space Invaders на HTML5 — 9 — Добавляем звук

Создаем игру Space Invaders на HTML5 — X — Публикуем игру

История видеоигр, часть 8. 1978 год.

Интерфейс кассетного магнитофона для Apple II был медленным, ненадёжным и неудобным. Для его замены вскоре был разработан накопитель «Disk II», который позволял в качестве носителей информации использовать гибкие магнитные диски, помещённые в защитный пластиковый корпус шириной 5,25 дюйма (позже их стали называть «5-дюймовые дискеты»). Однако, стоимость нового устройства составляла $595 — весьма дорого, так что бюджетные магнитофоны и кассеты ещё много лет использовались параллельно с дискетами.

К 1978-му году среди игровых автоматов распространяется мода на «раскрашенную графику», порождённая такими играми, как Circus. Поверх монохромных экранов игровых автоматов клеят разноцветную плёнку, делая игры более приятными для глаз.

Football («Американский футбол») от Atari — это один из первых спортивных симуляторов, если не считать Pong-игры. Здесь каждый игрок управляет квотербеком своей команды. Нападающие (владеющие мячом) — «нолики», обороняющиеся — «крестики». Игру не сложно освоить даже тем, кто не знает правила американского футбола.

Super Breakout от Atari — это один из первых игровых автоматов, использующих микропроцессор. Суть игры в целом такая же, как в оригинальной версии, но здесь блоки медленно опускаются навстречу игроку.

В этом году Taito выпускает новый игровой автомат Space Invaders («Космические захватчики»). Здесь игрок управляет установкой системы ПВО, отбиваясь от орды прилетевших из космоса монстров.

Как и Super Breakout, Space Invaders тоже использует микропроцессор. Правда, разработчику пришлось поломать голову над тем, что при большом количестве спрайтов на экране процессор работает с предельной нагрузкой и отрисовывает картинку медленно, но по мере их уменьшения (то есть, уничтожения игроком) нагрузка на «железо» падает, и спрайты движутся всё быстрее. В конце концов, было решено оставить всё как есть и сделать вид, что так и было задумано.

Таким образом, поначалу игра оказывается проста в освоении, а отстрел инопланетян кажется пустяковым занятием. Но стоит вам преуспеть, как монстры начинают двигаться всё быстрее, вплоть до совсем уж неприличных скоростей, так что справиться с последними из них оказывается практически нереально.

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

Позже игра была портирована почти на все игровые платформы. После выхода версии Space Invaders для Atari 2600 продажи консоли увеличились в 4 раза. Space Invaders является лучшим игровым автоматом по версии Книги рекордов Гиннесса. Впоследствии стали делать игры с похожим игровым процессом, которые объединяют в жанр под названием «shoot ’em up» («пристрели/расстреляй их!»).

Часто задаваемые вопросы

Corona правда бесплатный движок?

Corona, включая Corona Simulator и Corona Native, совершенно бесплатный. Мы также предлагаем ассортимент плагинов, расширяющих базовый функционал движка — большинство из них бесплатные, но некоторые нужно покупать, например Splash Screen Contol. Более того, в Маркетплейсе есть более 100 сторонних плагинов — многие из них также бесплатны, но на некоторых установлена цена, заданная их разработчиками.

Внимание: у Apple, Google и Amazon есть требования о наличии сертификата разработчика, чтобы публиковать приложения в их магазинах. Такие сертификаты вы оплачиваете сами.

Как удалить или изменить заставку Corona Labs?

Эта заставка включена по умолчанию — убрать или изменить ее можно купив специальный плагин.

В чем разница между базовым фреймворком Corona и Corona Native?

В базовом фреймворке Corona вы пишите код на Lua и используете Corona Simulator, чтобы тестировать и собирать приложения для последующего деплоя в магазины. Вы должны использовать встроенные API движка и плагины, и вам понадобится выход в интернет, чтобы осуществлять сборки для реальных устройств.

Corona Native (доступен разработчикам для Windows и macOS) позволяет интегрировать проекты на Xcode или Android Studio в ваш код на Lua. Вы сможете использовать API и плагины Corona, но также — добавлять библиотеки через Objective-C и Swift для платформ Apple, Java — для Android и C / C++ — для обоих типов платформ. Вы сможете делать сборки в командной строке, и вам не нужен постоянный доступ к интернету.

Как мне получить движок?


Вы просто скачиваете его здесь. После загрузки и установки вы сразу сможете приступить к разработке приложений. Мы не поставляем дисков или других физических объектов.

На каких платформах работает Corona?

Corona работает на macOS и Windows, Corona Native — только на macOS.

Внимание: из-за ограничений Apple вы не можете создавать приложения для iOS, macOS, или tvOS, используя версию Corona для Windows. Но вы сможете использовать код Lua, написанный на машине с Windows, в Mac, если вы хотите работать на платформы Apple.

Мастер Йода рекомендует:  Месячник ошибок в PHP

Для каких платформ я могу создавать приложения?

На данный момент Corona поддерживает разработку приложений для:

  • iOS
  • Android
  • Amazon Kindle
  • Windows desktop
  • macOS desktop
  • Apple TV
  • Android TV
  • Steam
  • HTML5 (BETA)

Почему Corona требуется выход в интернет, чтобы делать сборки?

Потому, что часть сборки выполняется на серверах Corona Labs. Однако мы никогда не видим ваш “исходный” код, изображения, звуки или другие данные. Когда вы запускаете онлайн-сборку, код Lua пре-компилируется в байткод перед отправкой на сервер (убираются комментарии, информация для отладки и т.п.). Сервер вставляет эти данные в движок Corona, но не сохраняет и не архивирует их. Когда сборка завершена — вы получаете приложение или исполняемый файл, как если бы вы использовали нативный SDK.

Что делать, если мне нужны офлайн-сборки?

Как мне рассказать вам о баге?

Пожалуйста, используйте для этого специальную форму. Чтобы мы смогли изолировать и проверить баг, мы просим вас приложить простой тестовый проект, который наглядно иллюстрирует проблему. Такой проект должен содержать файлы config.lua и main.lua, а также — дополнительные ресурсы, необходимые для демонстрации бага.

Внимание: мы не сможем обработать проекты, включающие сторонние продукты, так как именно они могут быть причиной проблемы. Если вам кажется, что так и есть — обратитесь непосредственно к разработчику этого продукта.

Публикует ли Corona Labs мои приложения?

Нет. Вы делаете приложение на фреймворке Corona и самостоятельно отсылаете его на Apple, Google или Amazon через их программы для разработчиков. Но мы работаем с паблишинг-партнерами и можем вам помочь. Если вас это заинтересовало — пишите на publishing@coronalabs.com.

Удерживает ли Corona Labs комиссию от дохода моих приложений?

Нет. Ваши приложения целиком принадлежат вам, и все договоренности по паблишингу заключаются непосредственно между вами и магазинами приложений.

Обеспечивает ли Corona Labs техподдержку?

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

Мы также предлагаем платную техподдержку. Она будет полезна разработчикам, которым требуется:

  • Выявление и решение проблем
  • Примеры кода
  • Отладка
  • Анализ кода

Предлагает ли Corona Labs обучение?

Да, мы предлагаем базовое персональное обучение для разработчиков, которые хотят начать работать с Corona. Перейдите на страницу Техподдержка и Обучение.

Как мне найти разработчика на Corona?

Мы рекомендуем сделать пост в ветке Corona Classifieds Jobs на форуме.

Corona не поддерживает функцию, которая мне нужна. Что делать?

Мы постоянно работаем над добавлением новых функций в движок. Если вам не хватает расширенной базы и плагинов, Corona Native позволяет интегрировать проекты на Xcode или Android Studio в ваш код на Lua. Вы также можете голосовать за нововведения на специальном сайте.

Если я использую Corona, нужно ли мне платить за программы для разработчиков Apple, Google и Amazon?

Да. Вы можете бесплатно использовать Corona для разработки приложений и тестировать их в Corona Simulator, но у Apple, Google и Amazon есть требования о присоединении к программам для разработчиков перед деплоем приложения в их магазинах. Такие программы подразумевают взносы, которые вы оплачиваете сами.

Что такое daily builds?

В дополнение к последним публичным релизам Corona мы также предлагаем ежедневные сборки, которые включают в себя самые актуальные функции и обновления. Многие разработчики спокойно используют эти daily builds, и мы считаем, что работать на них и экспортировать приложения в магазины — это безопасно и надежно. Нужно понимать, что ежедневные сборки могут вызывать непредвиденные проблемы. В этом случае обращайтесь к форуму или другим ресурсам.

игра «Space Invaders». Нужна помощь.

В этой теме 6 ответов, 2 участника, последнее обновление Павел Букреев 3 года/лет, 6 мес. назад.

Не так давно начал прогать на C++/C#, не без помощи универа ��
В общем требуется сделать игру наподобие Space Invaders.
Игра без карты, поэтому надобность в Tiled Map Editor отпадает, игрок просто не может зайти за координаты, а цели при достижении определённых координат просто опускаются вниз и идут в обратную сторону.
Всё делал по примеру из видеоуроков, но пули почему-то не получается сделать, они даже не появляются нигде :C
И ещё наверное было бы неплохо цели как-то вручную в список занести, тк для каждой обновление действительно не совсем удобно и громоздко писать. Сейчас я для теста просто 8 штук сделал, а так их более 20 планируется сделать.
На данный момент имеется прямоугольный черный экран с анимированным корабликом с одной степенью свободы (управляется стрелочками) и 8 целей, которые спускаются зигзагом вниз (пока что бесконечно).

Геймплей по ошибке. Полюбившиеся баги

Как и в любом искусстве, в игрострое порой самые успешные вещи возникают не в результате мозгового штурма разработчиков, а из-за банальных ошибок. Обычное дело — когда целая игра построена вокруг одной конкретной игровой механики. Гораздо удивительней, когда эта самая механика, породившая целую серию, придумана неумышленно, как в случае с Grand Theft Auto.

Grand Theft Auto

За что мы любим GTA? Конечно же, за автомобили и насилие, потолок которого находится так высоко, что борьба с активистами давно прописана в ежедневниках разработчиков. И именно потому первые GTA до сих пор играбельны, несмотря на вид сверху и отсутствие возможностей открытого мира последних частей.

Невероятно то, что фирменной жестокостью игра была наделена не специально. Безумные погони, кровавые перестрелки, ограбления магазинов. Всего этого могло и не быть, как собственно и самой серии в том виде, в каком мы ее знаем.

GTA, которая на первых стадиях разработки имела невинное название Race’N’Chase, готовилась стать неприметной доброй гоночной игрой. Первые же тесты показали, что геймплей в Race’N’Chase невероятно скучен до тех пор, пока не дает о себе знать ошибка в AI полицейских машин. Преследующие игрока копы, вместо того, чтобы аккуратно останавливать преступника, брали его на таран. Тестеры приходили в восторг и спасибо разработчикам, которые обратили на это внимание и тут же сменили фокус разработки.

Очень скоро, уже переименованную в Grand Theft Auto игру, было не узнать. Абсолютно естественным образом безумное поведение полицейских позже вылилось в расстрел невинных горожан, гонки на катерах по чекпоинтам и все то, что мы так любим. В дальнейшем, созданная, можно сказать, по воле случая GTA с каждой новой частью продолжала расширять горизонты для всей игровой индустрии.

Space Invaders

Один из ключевых элементов геймплея практически любой игры — постепенное повышение сложности. Даже самые мудреные паттерны со временем поддаются, а при отсутствии какого-либо вызова игроки быстро теряют азарт. Старт этому фундаментальному игровому элементу положила Space Invaders, не нуждающаяся в представлении игровая классика, по умолчанию вызывающая уважение.

Программист Space Invaders, Томохиро Нишикадо, разрабатывал аркадный автомат, как было заведено в то время, в одиночку. Он больше года пытался заставить начинку автомата работать с нужной скоростью и когда же, наконец, игра была закончена, Нишикадо понял, что у него не получилось. Автомат просто не мог выдержать столько объектов на экране одновременно и в итоге космические корабли надвигались на игрока слишком медленно. Но как только игрок уничтожал большую часть кораблей, количество объектов уже не было проблемой, и пришельцы начинали атаковать игрока с задуманной скоростью.

В тот момент Нишикадо пришел к выводу, что играть в Space Invaders всегда в одном темпе, пожалуй, вообще не имеет смысла. Двадцать лет спустя он все еще прав.

Первое «Пасхальное яйцо»

Во времена процветания Atari 2600 быть геймдизайнером было не так уж здорово. Часто приходилось заниматься проектами в одиночку и в кратчайшие сроки. Последствия были соответствующие и кризис 1983 года тому подтверждение. Ко всему прочему, по непонятным причинам имена этих самых разработчиков-героев не указывались ни в игре, ни на упаковке. Все игры были сделаны by Atari.

С этим не стал мириться Уоррен Робинетт, которому было поручено смастерить игру Adventure, предвестника RPG а-ля Legend of Zelda. Уоррену было хорошо известно о недостатках технологий Atari. Если перегрузить память слишком большим количеством объектов, экран начинал мерцать. Втайне от руководства Atari, Робинетт разместил в одной из локаций Adventure маленький незаметный кубик, который игрок мог перенести на другой уровень и тем самым спровоцировать сбой. В результате начинала мерцать одна из стен, пройдя через которую, игрок попадал в комнату с надписью «CREATED BY WARREN ROBINETT».

К счастью, Atari увидела глитч уже после выпуска Adventure, и после безуспешных попыток убрать текст, сделала вид, что так и было, и что якобы в дальнейшем планируется добавлять секреты в каждую игру. К этому моменту Робинетт уже ушел из компании, как следует отрекламировав свое имя, и, зародив традицию «пасхалок», без которой не обходится, наверное, ни одна современная игра.


Super Mario Bros.

Даже те несчастливые, кто не играл в Mario дальше первого уровня, наверняка помнят ощущения от поедания стимулирующих рост грибов и выбивания головой монет из камней со знаком вопроса. Последнее всегда срабатывает по-разному — иногда монеты не вылетают, а порой вылетает несколько. Такое развитие событий стало сюрпризом, в том числе и для разработчиков. Тем не менее, глитч внес непредсказуемости в геймплей, и в последующих частях добавлялся умышленно.

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

Devil May Cry

До того, как Данте начал резать демонов с невообразимой скоростью и стал лицом одной из самых успешных серий в жанре слэшер, ему предназначалась совсем другая роль. Его звали Тони, и он был задуман как второстепенный персонаж разрабатываемой в 2000-ом году Resident Evil 4. Фирменной способностью Тони должно было стать умение «жонглировать» противниками, нанося по ним все новые удары и не давая тем самым им упасть. Этот элемент в свою очередь разработчики придумали во время создания Onimusha: Warlords.

Чем дальше шла разработка RE4, тем больше Тони начинал выбиваться из общей атмосферы игры. Кончилось тем, что персонаж был убран из серии и сделан главным героем Devil May Cry, с геймплеем, закрученным вокруг жонглирования и других эффектных боевых приемов. Персонажу дали более подходящее и менее американизированное имя Данте и отправили его сражаться со всевозможными дьяволами и другими владыками тьмы.

Поразительно, как одна небольшая идея породила если не сам жанр, то, по крайней мере, видного его представителя. За пятнадцать лет Devil May Cry успела перезапуститься и продалась впечатляющим тиражом более 10 миллионов копий.

Team Fortress

Одним из самых вкусных отличий Team Fortress от других сетевых шутеров является разнообразная и сбалансированная система игровых классов. Не секрет, что TF зародилась в виде домашней модификации Quake, после чего была взята под опеку компанией Valve и в лице второй части стала одной из самых популярных командных шутеров настоящего времени. Один из самых нетипичных классов для подобного жанра — «Шпион», был придуман случайно.

Во время тестов разработчики обратили внимание на глитч, при котором имя одного из игроков было написано цветом команды противников. Этот, казалось, копеечный недочет дал старт идее класса, способного выдавать себя за другого.

Если вы хоть немного увлекаетесь TF2, то вы в курсе, что умелый шпион всегда находится в топе рейтингов, и запросто способен обогнать атакующие классы.

Quake

Уважаемый ветеран Quake, как и многие его наследники, выполненные на движке Quake Engine, также не остались без «одобренных», формирующих жанр глитчей.

Взяв в руки гранатомет, необходимо поймать момент и выстрелить себе под ноги, одновременно подпрыгнув. Результат — вы взлетаете в десятки раз выше обычного, нанося себе незначительные повреждения. Рокет-джамп позволяет передвигаться по карте гораздо быстрей и забираться на, казалось бы, недоступные площадки. Игроки, конечно же, пошли дальше и научились делать двойные и тройные прыжки, отталкиваясь в воздухе от стен тем же способом.

Стоит отметить, что рокет-джамп первый раз был замечен еще до Quake, но именно с ней прием вышел в массы.

Именно благодаря стрейф-джампу появились видео а-ля «Прохождение Half-Life за 1 час». Глитч представляет собой возможность заметно увеличить скорость передвижения игрока за счет прыжка по диагонали с одновременным разворотом мыши в соответствующую сторону. В Quake 3 Arena разработчики попытались от него избавиться, но игровое сообщество взбунтовалось и не позволило это сделать.

Оба элемента быстро вошли в список необходимого минимума, который должен уметь исполнять каждый уважающий себя игрок в Quake.

Street Fighter 2

Невозможно представить ни один файтинг или beat ‘em up без красивых комбо-ударов, на несколько секунд лишающих вашего противника хоть какого-либо сопротивления. Без них любая виртуальная драка рискует потерять весь свой шарм. Кому говорить спасибо? Разработчикам легендарной Street Fighter 2 конечно, а именно дизайнеру Норитака Фунамизу (Noritaka Funamizu). Он обнаружил баг, из-за которого игрок мог успешно прервать анимацию предыдущего удара, нанеся в нужный момент новый.

Норитака наивно посчитал, что игроки не додумаются проводить подобные операции и оставил баг в игре. К его огромному удивлению фанаты были в восторге и в кратчайшее время стали мастерами комбо-серий как будто, так и было задумано. Само собой, в следующих частях баг остался и получил официальное название animation cancelling.

Интересно, что прием Shakunetsu Hadoken персонажей Кена и Рю, ровно как и Yoga Teleport персонажа Дхалсима, также являются результатами ошибок, которые пришлись по вкусу фанатам.

DOTA 2

Подобно Street Fighter, Dota 2 позволяет не дожидаться окончания анимации одного действия и начать следующее. Учитывая динамику игр, секунда, выигранная подобным образом, может запросто спасти всю партию.

Konami Code

Если вы не знакомы с Gradius, то вкратце можно рассказать о ней две вещи. Во-первых, это видный представитель жанра «горизонтальных скролл-шутеров», где вы с видом сбоку летите на космическом корабле, собираете апгрейды и уничтожаете абсолютно все, что попадается вам на пути. Во-вторых, это сложность. Серьезно, чтобы пройти хотя бы половину игры, нужно невероятное количество терпения и выдержки. Большинство игроков очень быстро приходит к мысли, что есть дела и поинтересней.

Первая Gradius была настолько сложна, что довела до отчаяния Кадзухиса Хасимото, программиста который был ответственен за портирование игры на другую платформу и не мог пройти первые уровни, чтобы протестировать игру. В конце концов, нервы Хасимото не выдержали, и он с хитростью программиста прописал возможность ввода специального кода, который наделяет игрока всеми апгрейдами сразу. По закону жанра, код случайным образом остался в игре. Это событие быстро породило целый культ в индустрии, а саму комбинацию «up, up, down, down, left, right, left, right, B, A» прозвали Konami Code.

С тех пор огромное количество игр и даже сайтов использовала Konami Code как дань уважения игровой истории.

«Крипер» в Minecraft, Hummerdin в Diablo 2, несколько фаталити в Mortal Kombat — всего не перечислишь. Даже фирменный огромный бюст Лары Крофт без которого не обходилась ни одна часть серии — результат неверного клика зазевавшегося модельера. Некоторые баги не улучшали геймплей, но позволяли игрокам легче проходить хардкорные места, как, например, в Mega Man нажатие паузы в нужное время наносило дополнительный урон врагам.

В любом случае, подобные моменты не раздражают, а скорей наоборот, добавляют играм харизмы. И быть первым нашедшим такой «клад» считается привилегией.

Сыграйте в Space Invaders, олдскульную игру, в терминале Linux

Joshua Kormik

Read more posts by this author.

Joshua Kormik

Существует бессчетное количество терминальных игрушек на Linux. Да, иногда просто необходимо отстраниться от файлов конфигурации, средств мониторинга и т.д. — привести свой разум в порядок и немного поиграть в терминале. Даже на работе.

В этой статье мы расскажем вам, как играть в Space invaders терминале Linux; в бесплатную терминальную версию широкоизвестной GUI игры Space Invaders с открытым кодом.

Мастер Йода рекомендует:  Создана новая международная комиссия по проблемам развития интернета

Основная задача — защитить Землю от космических захватчиков (огромного количества пришельцев), управляя боевыми кораблями с Земли (нижняя часть экрана). До того как играть, Space Invaders нужно сначала установить ее с помощью терминала простым вводом данных команд (обратите внимание, что у вас должен быть включен universe репозиторий):

После установки в игру можно сыграть с помощью команды:

При запуске вы увидите интерфейс, как на картинке ниже. Нажмите Пробел для начала игры.

Используйте стрелки Влево и Вправо для передвижения боевого корабля. Стреляйте с помощью клавиши Пробел . От спускающихся кораблей можно просто уклониться или спрятаться за большими неподвижными блоками (зеленого цвета). Задача — убить всех пришельцев.

Вас может заинтересовать:

Вот и все! В этой статье мы рассмотрели, как играть в Sapce Invaders в командной строке Linux. Известны ли вам какие-нибудь интересные игры в терминале, в которые можно было бы поиграть для разнообразия на работе? Расскажите другим в комментариях!

Дмитрий Лопатин

Перевод статьи «Writing your first Android game using the Corona SDK«, за авторством Gary Sims, опубликованной 13 июля 2015 года на сайте «Android Authority«.

Самой популярной категорией в Google Play Store всегда были Игры. Несмотря на то, что, вероятно, все мы используем полезные рабочие приложения как веб-браузер, почтовый клиент, и приложение мгновенного обмена сообщениями, игры всё ещё остаются важной частью мобильной жизни. Таким образом неудивительно, что много людей, которые хотят учиться разрабатывать под Andro >

Официальным языком Android является Java, а официальной средой разработки — Android Studio. Если Вы хотите изучить Java тогда, я предлагаю наше учебное руководство по основам Java [ перевод здесь ], и если Вы хотите изучить, как написать приложение с помощью Android Studio тогда, я предлагаю, чтобы Вы прочитали наше учебное руководство о разраотке Вашего первого приложения для Android [ перевод здесь ]. Однако, Java и Android Studio не являются единственными способами разработки под Android. Вы можете найти обзор доступных языков и SDK в нашем руководстве: Я хочу разработать приложения для Android — Какие языки я должен изучить? [ перевод здесь ].

Одним из SDK, упомянутых в обзоре по языкам программирования, является Corona, сторонний SDK, разработанный прежде всего для создания игр. Вместо Java, Corona использует Lua, быстрый язык сценариев, который и прост для изучения, и достаточно мощный. Однако, Corona не является единственным SDK для мобильных игр, который использует Lua, другие известные примеры включают: Cocos2d-X , Marmalade , и Gideros .

Загрузка и установка

Для начала работы с Corona, Вам следует загрузить и установить SDK. Перейти к веб-сайту Corona и нажмите кнопку загрузки. Кстати, Вам необходимо создать аккаунт, прежде чем Вы сможете что-либо загружать. Если Вы захотите создать реальный .apk файл вместо того, чтобы просто выполнить Вашу программу в эмуляторе, Вам придётся установить Java 7. Однако, Вам не обязательно устанавливать Android SDK. Для установки комплекта разработчика Java 7 переходят к веб-сайту Oracle , найдите раздел, названный “Java Development Kit 7u79 SE ″, и загрузите версию для ПК.

После установки Corona, его необходимо активировать. Это — разовый процесс, который бесплатен. Запустите Corona Simulator и согласитесь с условиями лицензии. Введите адрес электронной почты и пароль, которые Вы использовали для загрузки, и нажмите Login.

Начало проекта

Внутри Corona Simulator кликните по «New Project». Введите имя для своего приложения в поле «Application Name» и оставьте остальные установоки с их значениями по умолчанию. Нажмите «OK».


Теперь появятся три окна. Первые два это Corona Simulator и Corona Simulator Output. Corona также откроет окно проводника, показывающее файлы Вашего проекта.

Большинство файлов (около 23) в каталоге проекта — для значка приложения! Самый важный файл для нас прямо сейчас является main.lua, как это — то, где мы запишем код для нашего приложения.

Введение в Lua

Прежде чем мы приступим к записи кода, мы должны бегло ознакомиться с Lua. Интерпретатор Lua (помните, это язык сценариев, а не компилируемый язык) доступен для Windows, OS X и Linux. Однако, он встроен в Corona, таким образом, Вы не должны устанавливать ничего дополнительно. Самый простой способ знакомства с Lua — побаловаться с онлайновой живой демонстрацией .

Вот маленькая программа на Lua, которая покажет Вам некоторые особенности языка:

Код выше демонстрирует три важных конструкции Lua: функции, циклы, и условия. Функция doubleIt() очень проста, она просто удваивает переданное в параметре x.

Большая часть кода это цикл от 1 до 10. Он вызывает doubleIt() на каждой итерации. Если возвращаемое значение равняется 10 (т.е. когда i равно 5) — код распечатывает «ten» (англ. «десять»), иначе — просто результат doubleIt().

Если у Вас имеется опыт разработки тогда, этот образец кода должен быть легко читаем. Если Вы всё ещё чувствуете необходимость в изучении базовых приёмов программирования тогда, я предлагаю, чтобы Вы обратились к ресурсам, упомянутым выше.

Написание игры

Написание простых программ в Corona очень легко. Вы должны интересоваться только одним файлом, main.lua, и позволить Corona взять остальное на себя. Игра, которую мы собираемся создать, является простой игрой на «тапы». Воздушные шары и бомбы падают вниз экрана. Если игрок касается (тапает) воздушного шара, он зарабатывает очко, когда касаются бомбы — счет делится на 2, в качестве штрафа. Для написания кода, Вы должны отредактировать main.lua. Вы можете делать это в любом текстовом редакторе.

Corona SDK имеет встроенный движок 2D физики, который делает создание игр очень простым. Первый шаг в написании игры должен инициализировать механизм физики:

Код довольно очевиден. Модуль физики загружается и инициализируется, он присваивается переменной physics. Включается движок вызовом physics.start().

Затем мы создаем несколько полезных переменных, которые будут использованы не только для этой простой игры, но и для более сложных игр. halfW и halfH содержат значения для половины ширины экрана и половины высоты экрана:

Объект display является предопределенным объектом, который Corona делает глобально доступным.

Теперь наступает время первого шага, который наконец заставляет что-то происходить на экране:

Как и свойства contentHeight и contentWidth , объект display также имеет много полезных функций. Функция newImage() считывает файл изображения (в этом случае .png) и выводит его на экран. Объекты на экране представлены в слоях, следовательно так как это изображение — первое которое мы вывели на экран, значит оно всегда будет фоном (если это не будет позднее изменено в коде явно). Параметры halfW и halfH говорят Corona поместить изображение посередине.

Сейчсас Вы уже можете выполнить этот код в эмуляторе и увидеть фоновое изображение. Если Вы сохраните файл тогда, эмулятор заметит, что файл изменился и предложит его перезапуск. Если это не происходит тогда сделайте это сами через меню File-> Relaunch.

Так как пользователь зарабатывает очки тапая по воздушным шарам, мы должны инициализировать переменную счета и вывести счет на экране:

Счет будет сохранен в ассоциативно именованной переменной score, и scoreText будет объектом, который выводит счёт на экран. Как и newImage(), newText() помещает что-то на экран, в этом случае — текст. Так как scoreText — глобальная переменная, мы можем изменить текст в любом месте. И скоро мы дойдём до этого.

Вы можете повторно запустить эмулятор и увидеть счет 0 отображаемый наверху экрана.

Теперь наступает пора чего-то немного более хитрого, но не волнуйтесь, я объясню всё строка за строкой:

Код выше определяет функцию, вызванную balloonTouched(), которая будет вызвана каждый раз, при тапе на воздушный шар. Мы еще не сказали Corona вызывать эту функцию каждый раз, при тапе по воздушному шару, мы сделаем это немного позже, но когда мы сделаем это — вот функция, которая будет вызываться.

События прикосновений или тапов имеют несколько этапов, многие — для поддержки перетаскивания. Пользователь кладёт палец на объект, это, «began» (англ. «начальная») фаза. Если он двигает палец в каком-либо направлении, это является фазой «moved» (англ. «перемещения»). Когда пользователь поднимает палец от экрана, это является «ended» (англ. «окончательной») фазой.

Первая строка balloonTouched() проверяет, что мы находимся в «began» фазе. Мы хотим удалить воздушный шар и увеличить счет, так быстро как только возможно. Если функция вызвана снова для других фаз, например «ended» тогда она ничего не делает.

Внутри определения if четыре строки кода. Давайте сначала рассмотрим последние две, т.к они наиболее просты. score = score + 1 просто увеличиваем счет на единицу и scoreText.text = score изменяем текст счета на экране для отражения нового счета. Помните, как я сказал, что scoreText это глобальная переменная и может быть изменена где угодно, вот именно это мы здесь и делаем.

Теперь, первые две строки. Когда воздушный шар или бомба падает за нижнюю часть экрана они всё ещё существуют в памяти приложения, просто Вы не видите их. По мере продолжения игрового процесса, число этих внеэкранных объектов будет постоянно увеличиваться. Поэтому, у нас должен быть механизм, который удаляет объекты, как только они выпадают из поля зрения. Мы сделаем это в функции, названной offscreen (англ. «вне экрана»), которую ещё не написали. Эта функция будет вызываться один раз на каждый кадр во время игры. При тапе на воздушный шар, мы должны удалить его и убрать вызов проверки, вышел ли воздушный шар из экрана.

Строка event.target:removeSelf() удаляет воздушный шар. Когда происходит прикосновение, один из параметров функции определяет необхоимое событие. Он говорит функции о событии и какое это событие, например, event.phase. Он также говорит нам, к какому воздушному шару прикоснулись, например, event.target. Функция removeSelf() (англ. «самоудаление») делает то, что говорит — этот объект (в этом случае воздушный шар) удаляется.

Предыдущая строка убирает функцию «enterFrame» , которая вызывается каждый кадр, чтобы проверить, выпал ли воздушный шар за экран. Мы рассмотрим это более подробно, когда дойдём до написания функции offscreen.

Так, для резюме. balloonTouched() проверяет, что это — начало сенсорной последовательности. Удаляет функцию «enterframe», вызваемую каждый кадр, для проверки, выпал ли воздушный шар с экрана. И удаляет воздушный шар, постепенно увеличивает счет и выводит новое значение счёта на экран.

Всё это было для воздушных шаров, теперь нам нужно что-то подобное и для бомб:

Как Вы можете видеть, код практически такой же, за исключением того, что вместо того, чтобы постепенно увеличить счет, счет умножен на 0,5 (т.е. разделен на 2). Функция math.floor() округляет счёт в меньшую сторону до самого близкого целого числа. Таким образом, если бы игрок имел счет 3 и коснулся бомбы, то новый счет был бы 1, а не 1.5.

Я упоминал функцию offscreen() ранее. Эта функция будет вызываться каждый кадр, чтобы проверять, ушел ли объект за экран. Вот её код:

В вычислениях существует ситуация, известная как состояние конкуренции. Когда могут произойти два события, и ситуация может развиваться так, что одно из событий произойдёт первым, но также всё может пойти и таким образом, что первым произойдёт другое событие. Это — гонка. Некоторые условия состязания неочевидны, потому что кажется, что одно событие будет всегда происходить сначала, это может вызвать интересные ошибки однажды при «правильных» условиях, другая вещь происходит сначала и затем отлаженая, казалось бы, система рушится!

Состояние конкуренции присутствует и в этой простой игре, потому что две вещи могут произойти очень близко друг к другу: тап по шару и вызов offscreen(). В результате, будет вызван код удаления воздушного шара и следом offscreen() (которая вызывая 30 раз в секунду) которая снова попытается его удалить. Для обхождения этой нежеланной последовательности событий, функция offscreen() должна проверять, является ли значение объекта y нулем (null — т.е. не цифрой «0», а отсутствием значения) или нет. Если оно — нуль тогда, это означает, что объект уже был удален, и удалять его второй раз можно не пытаться.

Но если объект всё ещё находится в игре, то проверить его позицию, и если он прошёл на 50 пикселей за экран — удалить его и удалить его проверку, чтобы offscreen() не вызывалась для него снова. Код, чтобы удостовериться, что offscreen() вызывается каждый кадр, содержится в следующем разделе.

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

Первая строка функции решает, где по оси x будет брошен воздушный шар. Если воздушные шары или бомбы будут всегда отбрасываться посередине, игра не будет интересной! Таким образом, startX является случайным числом между 10 и 90 процентами ширины экрана.

Затем случайное число выбирается между 1 и 5. Если число будет равняться 1 тогда бомба будет сброшена. Если это 2, 3, 4 или 5 тогда воздушный шар будет сброшен. Это означает, что бомбы будут сброшены приблизительно в 20 процентов случаев.

Код для бомбы и код для воздушного шара довольно похожи. Сначала изображение (или бомба или воздушный шар) выводится на экран с помощью newImage(). Его позиция на оси x определяется переменной startX, в то время как позиция по оси y установлена в -300, т.е. за вершиной экрана. Причина этого состоит в том, что мы хотим чтобы объект упал извне области экрана в видимую область и затем выпал за нижнюю грань. Так как мы используем механизм 2D физики, следует дать объекту что-то вроде разгонного расстояния до падения, таким образом, чтобы он мог получить некоторую скорость.

Обращение к physics.addBody() берет изображение, загруженное newImage(), и превращает его в объект для физического движка. Это очень мощно. Любой файл изображения может быть превращен в тело которое реагирует на силу тяжести и столкновения только путем вызова physics.addBody() .

Последние три строки кода для бомбы или воздушного шара устанавливают слушателей событий. Установление свойства enterFrame говорит Corona, какую функцию вызывать каждый кадр, и вызов к Runtime:addEventListener() устанавливает её. Наконец вызов к balloon:addEventListener() говорит Corona, которую функцию вызвать, если бомба или воздушный шар тронуты.

И теперь игра почти готова. Нам нужны всего лишь еще две строки кода:

Первая строка заставляет самую первую бомбу или воздушный шар упасть путем явного вызова addNewBalloonOrBomb(). Вторая строка устанавливает таймер, который вызовет addNewBalloonOrBomb() каждую половину секунды (500 миллисекунд). Это означает, что новый воздушный шар или бомба будет падать каждые пол-секунды.

Теперь Вы можете запустить игру в эмуляторе.

Вот полное содержание main.lua, полный проектный исходный код для этой игры может быть найден на GitHub .

Следующие шаги

Следующий шаг — поиграть в игру на реальном устройстве на базе Android. Для создания .apk файла щелкните по File-> Build for Android… и заполните поля. Результатом будет .apk файл, который Вы можете скопировать на свое устройство и затем установить. Вам потребуется настроить устройство для разрешения установки приложения из неизвестных источников. Amazon имеет некоторую хорошую документацию относительно этого , поскольку Вам это необходимо, чтобы устанавливать Amazon Appstore. Corona также имеет руководство о том, как подписать, создать, и протестировать Ваше приложение на устройствах на базе Android .

После успоешной установки и запуска на Вашем устройстве игры, следующая вещь которую следует сделать — улучшить игру. Например, почему бы не попытаться добавить звуки «лопания» или «бабаха» когда воздушного шара или бомбы касается игрок. Corona имеет API для этого: media.playEventSound() .

Или почему, не попробовать добавить третий тип объекта, скажем супер бонус, который удваивает текущий счет, или как насчет музыкального фона?

Закругляемся

Разработка игр с Corona довольно прямолинейна, потому что SDK берёт вещи как OpenGL на себя, и включает в себя встроенный 2D механизм физики. Также Lua просто изучить и он не должен быть слишком сложен ни для кого с даже минимумом опыта программирования. Веб-сайт Coronalabs имеет много документации включая большое количество руководств и учебные руководства .

Меньше чем в 100 строках кода у нас есть рабочая игра. Хорошо, она не собирается бить рекорды, однако, это показывает силу и гибкость Corona SDK.

Добавить комментарий