Отрисовка уровня и экран загрузки в нашей игре-стратегии — Стратежка

Автор: | 02.08.2019

Как создать игру в жанре стратегии

Общее описание игры и архив с игрой можно найти на страницах Как создать свою игру в жанре стратегии — Visual Basic 6 и Общее описание игры и игровая экономика — Стратежка.

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

Выглядит всё сначала так:

После нажатия кнопки «Загрузить» появляется шкала заполнения, это и есть генерация карты, а после того как генерация закончится, появляется кнопка «Начать» (сейчас отобразил сразу обе кнопки для удобства):

По кнопке «Начать» уже начинается игра, скриншоты самой игры я уже показывал:

Что будет дальше, мы разберем позже, а вот что происходит между нажатиями «Загрузить» и «Начать» расскажу здесь. И так, сначала выведу весь код формы, затем вкратце расскажу, как и что работает.

Option Explicit

Private Type progbar
Max As Integer
Value As Single
OdinShag As Single
End Type

Dim Loading As progbar
Dim Tex As String
Dim NumSim As Integer

Private Sub Command1_Click()
Form1.Timer1.Enabled = True
Form1.Zaslonka.Visible = True
Tex = «»
Label1 = «»
TextTmr.Enabled = False
‘If Trim(Nick.Text) <> «» And Level = 1 Then plaYer = Trim(Nick.Text)
‘If Trim(Nick.Text) = «» Then plaYer = «Player1»
Form1.Show
Unload Form2
If connect = True Then Form1.picture1.Left = Form1.picture1.Left — Form1.Baza(601).Left: Form1.picture1.Top = Form1.picture1.Top — Form1.Baza(601).Top: PosOfMapX = Form1.Baza(601).Left — 170: PosOfMapY = Form1.Baza(601).Top — 150
End Sub

Private Sub Command2_Click()
ObBar.Visible = True
Label2.Visible = True
PrBar.Visible = True
LoadingTmr.Enabled = True
Timer2.Enabled = True
‘Label3.Visible = True
Command2.Visible = False
End Sub

Public Sub Paint()
If Level = 1 Then
Loading.Value = 0
Loading.Max = 10
For RendX = 0 To Form1.picture1.Width Step 600
Loading.Value = Loading.Value + 1
Label2 = Loading.Value
For RendY = 0 To Form1.picture1.Height Step 600
Form1.picture1.PaintPicture Form1.Piclevel1.Picture, RendX, RendY
Next
Next
ElseIf Level = 2 Then
Loading.Value = 0
Loading.Max = 10
Form2.Command1.Visible = True
Form2.Command1.Top = Form2.Command1.Top + Form2.Command1.Height
For RendX = 0 To Form1.picture1.Width Step 600
Loading.Value = Loading.Value + 1
For RendY = 0 To Form1.picture1.Height Step 600
Form1.picture1.PaintPicture Form1.Piclevel2.Picture, RendX, RendY
Next
Next
End If
End Sub

Private Sub Command3_Click()
End
End Sub

Private Sub Form_Load()
Loading.Max = 1
Load Form1
TextTmr.Enabled = False
NumSim = 0
TimeLoading = 0
Label1 = «»
Tex = «»
Command1.Left = ScreenShir / 2 — Command1.Width / 2
Command1.Top = ScreenVys / 2 — Command1.Height / 2 + Command2.Height + 120
If Level = 1 Then Tex = «Милорд! Королевство нуждается в Вашей помощи! Нам нужны ресурсы! Ваше задание будет очень простым, но из-за этого не менее важным! Итак. Цели миссии: Собрать по 10000 единиц каждого из трех ресурсов. Места для строительства Мы можем выделить для Вас очень мало, но должно хватить… Если Вы покажете Себя с лучшей стороны, то Мы продолжим с Вами сотрудничать. Удачи, Командир! Посмотрим, что у Вас получится…»
If Level = 2 Then Tex = «Что, расслабились? Рановато почивать на лаврах! Вы успешно справились с первым заданием! А посему, как лучшего Командующего Королевства, придется Вас сразу бросить в пекло Войны… Враг не дремлет и находится рядом с Королевством. Ваша база должна быть отстроена на границе. Задача же такова: Уничтожить подступающего к Королевству противника! Да так, чтобы он больше никогда не захотел делать попытку откусить лакомый кусочек от нашей Славной Державы! Покажите ему Кузькину мать!!!»
TextTmr.Enabled = True
Label1.Width = ScreenShir
Label1.Height = 400
Label1.Top = 100

Command2.Left = ScreenShir / 2 — Command2.Width / 2
Command2.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command2.Height / 2 + Command2.Height
Command3.Left = Command2.Left ‘ ScreenShir / 2 — Command2.Width / 2
Command3.Top = Screen.Height / Screen.TwipsPerPixelX — Command3.Height

Nick.Left = ScreenShir / 2 — Nick.Width / 2
Nick.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Nick.Height / 2 + Nick.Height + 40
LblNick.Left = ScreenShir / 2 — LblNick.Width / 2
LblNick.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — LblNick.Height / 2 + LblNick.Height + 10

ObBar.Left = ScreenShir / 2 — ObBar.Width / 2
ObBar.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command2.Height / 2
PrBar.Left = ObBar.Left
PrBar.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command2.Height / 2
Label2.Left = ObBar.Left
Label2.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command2.Height / 2
Label3.Left = ScreenShir / 2 — Label3.Width / 2
Label3.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Label3.Height / 2 + Command2.Height + Label3.Height
Loading.Value = 0
RendX = 0
RendY = 0

Form1.picture1.Cls
‘Command2_Click
End Sub

Private Sub TextTmr_Timer()
NumSim = NumSim + 1
If NumSim <= Len(Tex) Then
Label1 = Left(Tex, NumSim)
If Left(Label1, 2) = «: » Or Left(Label1, 2) = «? » Or Left(Label1, 2) = «! » Or Left(Label1, 2) = «. » Then Sleep 500
If Left(Label1, 1) <> » » Then
PlaySound App.Path + «\klac.smus», 1, 1
‘PlaySound App.Path + «\clicking.smus», 1, 1
Else
‘PlaySound App.Path + «\probel.smus», 1, 1
End If
Else
TextTmr.Enabled = False
PlaySound App.Path + «\endwrite.smus», 1, 1
End If
End Sub

Private Sub Timer1_Timer()
Loading.OdinShag = ObBar.Width / Loading.Max
If Loading.Value <= Loading.Max Then PrBar.Width = Loading.OdinShag * Loading.Value
If Loading.Value >= Loading.Max Then
Label2.ForeColor = vbBlue
PrBar.BackColor = vbYellow
If Level = 1 Then
LblNick.Visible = True
Nick.Visible = True
End If
End If
End Sub

Private Sub LoadingTmr_Timer()
If plaYer = «» Then plaYer = «Player1″
If Procents <= 100 Then Label2 = Procents & » %» Else Loading.Value = Loading.Max: Label2 = «100 %»: PrBar.Width = Loading.OdinShag * Loading.Max
help = Loading.Max & «…..» & Loading.Value

If Level = 1 Then
Loading.Max = Round(Form1.picture1.Width / Form1.Piclevel1.ScaleWidth) * Round(Form1.picture1.Height / Form1.Piclevel1.ScaleHeight)
Procents = Int(Loading.Value / Loading.Max * 100)
If RendX < Form1.picture1.Width And RendY < Form1.picture1.Height Then
Form1.picture1.PaintPicture Form1.Piclevel1.Picture, RendX, RendY
Loading.Value = Loading.Value + 1
End If
If RendX < Form1.picture1.Width Then RendX = RendX + Form1.Piclevel1.ScaleWidth Else: RendX = 0: RendY = RendY + Form1.Piclevel1.ScaleHeight
If RendY > Form1.picture1.Height Then
Timer2.Enabled = False
Form1.Image1.Picture = Form1.picture1.Image
LoadingTmr.Enabled = False
‘plaYer = Trim(InputBox(«Какой вы хотите иметь ник в игре?», «Ваш ник?», «Player1»))
Command1.Visible = True
If plaYer = «» Then plaYer = «Player1″
End If
End If

If Level = 2 Or Level = 100 Then
Loading.Max = Round(Form1.picture1.Width / Form1.Piclevel2.ScaleWidth) * Round(Form1.picture1.Height / Form1.Piclevel2.ScaleHeight)

Procents = Int(Loading.Value / Loading.Max * 100)
If RendX < Form1.picture1.Width And RendY < Form1.picture1.Height Then
Form1.picture1.PaintPicture Form1.Piclevel2.Picture, RendX, RendY
Loading.Value = Loading.Value + 1
End If
If RendX < Form1.picture1.Width Then RendX = RendX + Form1.Piclevel2.ScaleWidth Else: RendX = 0: RendY = RendY + Form1.Piclevel2.ScaleHeight
If RendY > Form1.picture1.Height Then
Form1.Image1.Picture = Form1.picture1.Image
LoadingTmr.Enabled = False
Command1.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command1.Height / 2 + Command1.Height

Command1.Visible = True
End If
End If

If Level = 3 Then
Loading.Max = Round(Form1.picture1.Width / Form1.Piclevel3.ScaleWidth) * Round(Form1.picture1.Height / Form1.Piclevel3.ScaleHeight)

Procents = Int(Loading.Value / Loading.Max * 100)
If RendX < Form1.picture1.Width And RendY < Form1.picture1.Height Then
Form1.picture1.PaintPicture Form1.Piclevel3.Picture, RendX, RendY
Loading.Value = Loading.Value + 1
End If
If RendX < Form1.picture1.Width Then RendX = RendX + Form1.Piclevel3.ScaleWidth Else: RendX = 0: RendY = RendY + Form1.Piclevel3.ScaleHeight
If RendY > Form1.picture1.Width Then
Form1.Image1.Picture = Form1.picture1.Image
LoadingTmr.Enabled = False
Command1.Top = Screen.Height / Screen.TwipsPerPixelX / 2 — Command1.Height / 2 + Command1.Height

Command1.Visible = True
End If
End If
End Sub

Private Sub Timer2_Timer()
TimeLoading = TimeLoading + 1
Label3 = TimeLoading & » мс»
End Sub

 

Сначала включается таймер Timer1, который запускает написание брифингового текста в зависимости от текущего уровня, на первом это: «Милорд! Королевство нуждается в Вашей помощи!…«, он весь отпечатывается по 1 букве под звуки печатающей машинки, дальше по нажатии кнопки «Загрузить» запускается генерацию карты и отображается шкала заполнения Zaslonka. Кстати, перед первым уровнем еще спрашивается ник игрока после заполнения шкалы. Это используется чтобы обращаться к игроку по имени, а также в сетевой игре (правда у меня сетевая игра просто закончилась обычным чатом внутри игры, остальное лень было делать — но и это работало, что тоже было небольшим счастьем :)).

Перейдем к самой генерации карты Public Sub Paint(). Она весьма проста: берется бесшовная текстура чего-нибудь и много много раз дублируется циклом по всей игровой площади, сначала до конца вправо с шагом ширины текстуры

For RendX = 0 To Form1.picture1.Width Step 600

(600 пикселей это ширина текстуры), потом перешагивает ниже по высоте текстуры(те же 600 пкс), и так до конца игрового поля

For RendY = 0 To Form1.picture1.Height Step 600

Отрисовка происходит через Form1.picture1.PaintPicture Form1.Piclevel1.Picture, RendX, RendY .

Собственно ничего сложного в таком простом варианте. После этого можно будет отрисовывать другие текстуры поверх основной (например, горы, озера и прочее), что я тоже в дальнейшем хотел сделать, но руки уже не дотянулись. Так как я хотел сделать добычу металла и дерева в строго определенных для этого местах на карте, как это было сделано в Аннигиляции, но в итоге не стал заморачиваться.

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

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

Дальше хочу написать про передвижения просматриваемой области (рабочей зоны) по большой карте с отображением маленькой копии справа сверху (радара), это тоже было довольно интересным решением и тоже может кому-то пригодиться.

 

Серия статей по созданию игры в жанре стратегии — Стратежка:

  1. Как создать свою игру в жанре стратегии (введение).
  2. Общее описание игры и игровая экономика.
  3. Отрисовка уровня и экран загрузки в нашей игре-стратегии (эта статья).
  4. Передвижения рабочей зоны с отображением на радаре (в разработке).

 

Ссылки на скачивание игры:

Strategy (Full Version) ( Скачали: 459377 чел. ) 

Strategy (Light Version) ( Скачали: 480128 чел. ) 













Комментарии:

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

Ваш e-mail не будет опубликован.