Статьи

Сборка игры в покер в Corona: настройка интерфейса

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

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

Интерфейс игры

Игральные карты не включены в загружаемые файлы. Если вы хотите следовать, вы можете приобрести набор карт на Graphic River или использовать другой набор карт . Размеры каждой карты 75px x 105px , что соответствует 150px x 210px для размера @2x .

Если вы хотите запустить демонстрационное приложение из этого руководства, вам нужно добавить карту в каталог проекта. Изображения для карточек должны начинаться с h , c , d или s , с цифрой, добавленной к букве (от d1.png до d12.png , от h1.png до h13.png и т. Д.).

Если вы хотите работать с оригинальными векторными файлами, графика для покерного автомата была создана Андреем Мариусом и доступна на VectorTuts + . Не стесняйтесь загружать их от Vectortuts +.

Откройте Corona Simulator, нажмите « Новый проект» и настройте проект, как показано ниже, введите следующие данные. Выберите место для сохранения вашего проекта и нажмите ОК . Это создаст папку с несколькими значками и тремя важными для нас файлами: main.lua , config.lua и build.settings . Мы рассмотрим каждый файл в следующие несколько шагов.

Настройка проекта

Файл build.settings отвечает за свойства времени сборки проекта. Откройте этот файл, удалите его содержимое и заполните его следующим фрагментом кода.

01
02
03
04
05
06
07
08
09
10
11
settings =
{
    orientation =
    {
        default =»landscapeRight»,
        supported =
        {
          «landscapeLeft»,»landscapeRight»
        },
    },
}

В build.settings мы устанавливаем ориентацию по умолчанию и ограничиваем приложение только поддержкой альбомной ориентации. Вы можете узнать, какие другие настройки вы можете включить в build.settings, изучив Документацию Corona .

Файлы config.lua обрабатывают конфигурацию приложения. Как и в случае с build.settings, откройте этот файл, удалите его содержимое и добавьте следующий код.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
application =
{
    content =
    {
      width = 768,
      height = 1024,
      scale = «letterbox»,
      fps = 30,
      imageSuffix =
      {
        [«@2x»] = 2, — images with «@2x» appended will be used for iPad 3
      }
    }
}

Это устанавливает ширину и высоту экрана по умолчанию, использует почтовый ящик для масштабирования изображений, устанавливает 30 кадров в секунду и использует настройку imageSuffix для динамического выбора изображения. Файлы загрузки для этого руководства включают два файла для каждого изображения: imageName.png и imageName@2x.png . iPad с дисплеем Retina будет использовать изображения @ 2x , в то время как iPad 1 и 2 будут использовать обычные изображения.

Вы можете узнать, какие другие свойства вы можете установить в config.lua, ознакомившись с документацией Corona .

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

Мы не хотим, чтобы строка состояния отображалась в нашем приложении. Для этого добавьте следующую строку в main.lua .

1
display.setStatusBar(display.HiddenStatusBar)

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
local pokerMachine = display.newImage(«cardsBG.png»,true)
pokerMachine.anchorX, pokerMachine.anchorY = 0,0 — Sets the images anchors it uses the new Graphics 2.0
local suits = {«h»,»d»,»c»,»s»};
local deck;
local playerHand = {} —Holds the Players Cards
local cashOutButton
local betMaxButton
local betButton
local dealButton
local holdButtons = {} —Holds the «Hold» buttons
local isNewGame = true
local MAXBETAMOUNT = 15 — Max amount player can bet
local instructionsText
local betAmount = 0 — How much the player has bet so far
local creditText
local betText
local winText
local gamesText
local gameData = {} — This will hold game data — The credits and number of games played

Функция setup используется для настройки игровых активов и запуска игры.

1
2
3
function setup()
 
end

Эта функция настраивает кнопки в игре.

1
2
3
function setupButtons()
 
end

Эта функция устанавливает текстовое поле, используемое в приложении.

1
2
3
function setupTextFields()
 
end

Как видно из названия, эта функция активирует кнопку сделки.

1
2
3
function enableDealButton()
 
end

Эта функция отключает кнопку сделки.

1
2
3
function disableDealButton()
 
end

Эта функция включает кнопки ставок.

1
2
3
function enableBetButtons()
 
end

Эта функция отключает кнопки ставок.

1
2
3
function disableBetButtons()
 
end

Эта функция включает кнопки удержания.

1
2
3
function enableHoldButtons()
 
end

Эта функция включает кнопки удержания.

1
2
3
function disableHoldButtons()
 
end

Эта функция создает колоду карт.

1
2
3
function createDeck()
 
end

Эта функция проходит через руку игрока и определяет, какие карты хранятся.

1
2
3
function holdCard(event)
 
end

Эта функция вызывается, когда игрок ставит максимальную сумму.

1
2
3
function betMax()
 
end

Эта функция вызывается, когда игрок делает реальную ставку.

1
2
3
function bet()
 
end

Эта функция управляет раздачей карт.

1
2
3
function doDeal()
 
end

Эта функция сдает начальную руку.

1
2
3
function dealInitialHand()
 
end

Эта функция имеет дело со второй частью руки.

1
2
3
function dealNewCards()
 
end

Эта функция определяет руку игрока.

1
2
3
function getHand()
 
end

Эта функция сбрасывает все переменные и запускает новую игру.

1
2
3
function newGame()
 
end

Эта функция присуждает игроку выигранные деньги.

1
2
3
function awardWinnings(theHand, theAward)
 
end

Эта функция сбрасывает положение у карт после того, как игрок держит карту.

1
2
3
function resetCardsYPosition()
 
end

Эта функция генерирует случайную карту.

1
2
3
function generateCard()
 
end

Эта функция вызывает getGenerateCard и выводит ее на экран.

1
2
3
function getCard(index)
 
end

Теперь, когда у нас есть все функции, мы начнем их реализовывать. setupButtons как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
function setupButtons()
  cashOutButton = display.newImage(«buttonCashOut.png»,89,572)
  cashOutButton.anchorX, cashOutButton.anchorY = 0,0
  local holdButtonPosition = 186
      for i=1,5 do
    local tempHoldButton = display.newImage(«buttonHold1.png»,holdButtonPosition + (93*(i-1)),572)
    tempHoldButton.buttonNumber = i
    tempHoldButton.anchorX, tempHoldButton.anchorY = 0,0
    table.insert(holdButtons,tempHoldButton)
      end
  betMaxButton = display.newImage(«buttonBetMax.png»,679,572)
  betMaxButton.anchorX, betMaxButton.anchorY = 0,0
  betButton = display.newImage(«buttonBet.png»,775,572)
  betButton.anchorX, betButton.anchorY = 0,0
  dealButton = display.newImage(«buttonDeal.png»,869,572)
  dealButton.anchorX, dealButton.anchorY = 0,0
  instructionsText = display.newText( «», 400,400, native.systemFont, 30)
  instructionsText:setFillColor(0,0,0)
  enableBetButtons()
end

В setupButtons мы инициализируем наши кнопки как новые изображения. Мы храним tempHoldButtons в таблице, чтобы мы могли ссылаться на них, не создавая пять отдельных переменных. Также мы настраиваем instructionsText Text и включаем кнопки ставок. display объект имеет метод с именем newImage , который принимает путь к изображению, а также newImage x и y. Как упомянуто в документации , метод newImage имеет несколько необязательных параметров. В этом уроке мы используем новый класс Graphics 2.0, поэтому мы должны установить изображения anchorX и anchorY . Вы можете узнать больше о переносе старых проектов для использования нового класса Graphics 2.0 в Документации Corona .

Добавьте вызов setup в самый конец main.lua, а затем вызовите setupButtons внутри setup .

1
setup() — Add to end of «main.lua»
1
2
3
function setup()
    setupButtons()
end

Если вы должны были протестировать ваше приложение сейчас, вы должны увидеть интерфейс вместе с кнопками.

В setupTextFields мы настраиваем текстовые поля в приложении. Посмотрите на его реализацию ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function setupTextFields()
  instructionsText = display.newText( «», 400,400, native.systemFont, 30)
  instructionsText:setFillColor(0,0,0)
 
  creditText = display.newText(«»,800,185,native.SystemFont,22)
  creditText.width =150
  creditText.align = «right»
  creditText:setFillColor(255,0,0)
 
  betText = display.newText(«»,800,270,native.SystemFont,22)
  betText.width =150
  betText.align = «right»
  betText:setFillColor(255,0,0)
 
  winText = display.newText(«»,800,355,native.SystemFont,22)
  winText.width =150
  winText.align = «right»
  winText:setFillColor(255,0,0)
 
  gamesText = display.newText(«»,800,440,native.SystemFont,22) gamesText.width =150
  gamesText.align = «right»
  gamesText:setFillColor(255,0,0)
end

display объект имеет метод newText который принимает в качестве своих параметров text , координаты x и y , шрифт и размер шрифта. Метод newText принимает несколько необязательных параметров, которые вы можете изучить в документации . Мы используем новый метод setFillColor из Graphics 2.0, который принимает проценты. В этом примере мы установили для текстовых полей красный цвет. Если установить свойство align right , текст будет выровнен вправо внутри текстового поля. Вы также должны установить свойство width если вы используете align . Вызовите setupTextFields в setup .

1
2
3
4
function setup()
    setupButtons()
    setupTextFields()
end

Если вы запустите приложение еще раз, вы не заметите никаких изменений, так как текстовые поля на данный момент пусты. Они готовы к некоторому тексту все же.

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

1
2
3
4
5
function setup()
    math.randomseed(os.time())
    setupButtons()
    setupTextFields()
end

Реализация функции createDeck не слишком сложна. Мы перебираем таблицу suits и добавляем к ней число от 1 до 13 . Затем мы вставляем его в стол для колод. Изображения для наших карт называются d1.png , h3.png и т. Д. , Где 1 — туз, а 13 — король.

1
2
3
4
5
6
7
8
9
function createDeck()
  deck = {};
  for i=1, 4 do
      for j=1, 13 do
        local tempCard = suits[i]..j
        table.insert(deck,tempCard)
      end
  end
end

Вывод

Это завершает первую часть этого учебника из двух частей. Во второй части мы закончим игру. Я надеюсь увидеть вас там.