Files
Lab9_UNIX/core/ExampleGame.cpp
T
2026-06-05 11:45:04 +03:00

347 lines
6.4 KiB
C++

#include "ExampleGame.h"
#include <cstdlib>
void Bullet::render(PaintDevice& paintDevice)
{
paintDevice.set_char(
m_Position,
'|'
);
}
void Bullet::update(const int dt)
{
m_Lag += dt;
const int quant = 50;
if (m_Lag <= quant)
{
return;
}
m_Lag -= quant;
m_Position.y()--;
}
Gun::Gun()
{
m_Body =
{
Vector2(5, 0),
Vector2(5, 1),
Vector2(4, 2),
Vector2(4, 3),
Vector2(4, 4),
Vector2(6, 2),
Vector2(6, 3),
Vector2(6, 4),
Vector2(3, 5),
Vector2(7, 5),
Vector2(2, 6),
Vector2(5, 6),
Vector2(8, 6),
Vector2(1, 7),
Vector2(5, 7),
Vector2(9, 7),
Vector2(0, 8),
Vector2(1, 8),
Vector2(2, 8),
Vector2(8, 8),
Vector2(9, 8),
Vector2(10, 8),
Vector2(3, 9),
Vector2(7, 9),
Vector2(3, 10),
Vector2(7, 10),
Vector2(4, 11),
Vector2(6, 11),
Vector2(4, 12),
Vector2(5, 12),
Vector2(6, 12)
};
}
std::vector<Bullet> Gun::fire()
{
std::vector<Bullet> bullets;
if (m_CooldownCenter == 0)
{
bullets.push_back(Bullet());
bullets.back().m_Position =
Vector2(
m_Position.x() + 4,
m_Position.y() + 1
);
bullets.push_back(Bullet());
bullets.back().m_Position =
Vector2(
m_Position.x() + 6,
m_Position.y() + 1
);
m_CooldownCenter = 300;
}
if (m_CooldownSide == 0)
{
bullets.push_back(Bullet());
bullets.back().m_Position =
Vector2(
m_Position.x(),
m_Position.y() + 7
);
bullets.push_back(Bullet());
bullets.back().m_Position =
Vector2(
m_Position.x() + 10,
m_Position.y() + 7
);
m_CooldownSide = 150;
}
return bullets;
}
void Gun::update(const int dt)
{
m_CooldownCenter -= dt;
m_CooldownSide -= dt;
if (m_CooldownCenter < 0)
{
m_CooldownCenter = 0;
}
if (m_CooldownSide < 0)
{
m_CooldownSide = 0;
}
}
void Gun::render(PaintDevice& paintDevice)
{
for (const Vector2& point : m_Body)
{
paintDevice.set_char(
Vector2(
m_Position.x() + point.x(),
m_Position.y() + point.y()
),
'#'
);
}
}
void Enemy::render(PaintDevice& paintDevice)
{
for (const Vector2& point : m_Enemys)
{
paintDevice.set_char(
point,
'V'
);
}
}
void Enemy::update(const int dt)
{
m_Lag += dt;
const int quant = 800;
if (m_Lag <= quant)
{
return;
}
m_Lag -= quant;
for (Vector2& point : m_Enemys)
{
point.y()++;
}
for (int i = 0; i < 20; ++i)
{
if (rand() % 2)
{
m_Enemys.push_back(
Vector2(i, 0)
);
}
}
}
bool Enemy::hit(Vector2 point)
{
for (const Vector2& enemy : m_Enemys)
{
if (enemy == point)
{
return true;
}
}
return false;
}
void Enemy::remove(Vector2 point)
{
for (int i = 0; i < m_Enemys.size(); ++i)
{
if (
point.x() == m_Enemys[i].x()
&&
point.y() == m_Enemys[i].y()
)
{
for (int j = i; j < m_Enemys.size() - 1; ++j)
{
m_Enemys[j] = m_Enemys[j + 1];
}
m_Enemys.pop_back();
return;
}
}
}
ExampleGame::ExampleGame()
{
paint_device().resize(
Size(
m_Width,
m_Height
)
);
track_key(KEY_LEFT);
track_key(KEY_RIGHT);
m_Gun.m_Position =
Vector2(
m_Width / 2 - 2,
m_Height - 14
);
}
void ExampleGame::on_button_press(const int button)
{
switch (button)
{
case KEY_LEFT:
{
m_Gun.m_Position.x()--;
if (m_Gun.m_Position.x() < 0)
{
m_Gun.m_Position.x() = 0;
}
break;
}
case KEY_RIGHT:
{
m_Gun.m_Position.x()++;
if (m_Gun.m_Position.x() > m_Width - 11)
{
m_Gun.m_Position.x() = m_Width - 11;
}
break;
}
default:
{
break;
}
}
}
void ExampleGame::update(const int dt)
{
m_Enemy.update(dt);
for (int i = 0; i < m_Bullets.size(); i++)
{
m_Bullets[i].update(dt);
}
for (int i = 0; i < m_Bullets.size(); i++)
{
if (m_Bullets[i].m_Position.y() < 0)
{
for (int j = i; j < m_Bullets.size() - 1; j++)
{
m_Bullets[j] = m_Bullets[j + 1];
}
m_Bullets.pop_back();
}
}
for (int i = 0; i < m_Bullets.size(); i++)
{
if (m_Enemy.hit(m_Bullets[i].m_Position))
{
m_Enemy.remove(
m_Bullets[i].m_Position
);
for (int j = i; j < m_Bullets.size() - 1; ++j)
{
m_Bullets[j] = m_Bullets[j + 1];
}
m_Bullets.pop_back();
}
}
m_Gun.update(dt);
std::vector<Bullet> newBullets =
m_Gun.fire();
m_Bullets.insert(
m_Bullets.end(),
newBullets.begin(),
newBullets.end()
);
}
void ExampleGame::render(PaintDevice& paintDevice)
{
for (Bullet& bullet : m_Bullets)
{
bullet.render(paintDevice);
}
m_Enemy.render(paintDevice);
m_Gun.render(paintDevice);
}