Upload files to "/"
This commit is contained in:
parent
3a493c1485
commit
a0bda5cdac
3 changed files with 149 additions and 97 deletions
181
player.cpp
181
player.cpp
|
|
@ -1,99 +1,140 @@
|
||||||
#include "player.hpp" // Включаємо заголовок класу Player, щоб компілятор знав про його методи та змінні.
|
#include "player.hpp"
|
||||||
|
#include <iostream>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
// Конструктор класу Player. Він автоматично викликається при створенні об'єкта Player.
|
|
||||||
|
|
||||||
Player::Player()
|
Player::Player()
|
||||||
: shape(sf::Vector2f(50.f, 50.f)), // тут лише "чисте" створення
|
: shape(sf::Vector2f(60.f, 60.f)),
|
||||||
speed(500.f), //швидкість
|
speed(500.f),
|
||||||
velocityY(0.f),
|
velocityY(0.f),
|
||||||
jumpStrength(700.f), // пиржок
|
jumpStrength(700.f),
|
||||||
onGround(true),
|
onGround(true),
|
||||||
gravity(1500.f),
|
gravity(1500.f),
|
||||||
groundLevel(1040.f)
|
groundLevel(1040.f),
|
||||||
|
facingRight(true),
|
||||||
|
runFrames(),
|
||||||
|
idleFrame(),
|
||||||
|
sprite(),
|
||||||
|
currentFrame(0),
|
||||||
|
animationTimer(0.f),
|
||||||
|
animationSpeed(0.1f),
|
||||||
|
isMoving(false)
|
||||||
{
|
{
|
||||||
// А тут уже викликаємо методи, які налаштовують shape
|
|
||||||
shape.setFillColor(sf::Color::Green);
|
shape.setFillColor(sf::Color::Green);
|
||||||
shape.setPosition(50.f, 1040.f);
|
shape.setPosition(50.f, groundLevel);
|
||||||
|
|
||||||
|
loadIdleFrame();
|
||||||
|
loadRunAnimation();
|
||||||
|
|
||||||
|
sprite.setTexture(idleFrame);
|
||||||
|
sprite.setOrigin(idleFrame.getSize().x / 2.f, idleFrame.getSize().y / 2.f);
|
||||||
|
|
||||||
|
float scaleX = shape.getSize().x / idleFrame.getSize().x;
|
||||||
|
float scaleY = shape.getSize().y / idleFrame.getSize().y;
|
||||||
|
|
||||||
|
// Початкове віддзеркалення: PNG дивиться вліво, потрібно вправо
|
||||||
|
sprite.setScale(-scaleX, scaleY);
|
||||||
|
|
||||||
|
sprite.setPosition(
|
||||||
|
shape.getPosition().x + shape.getSize().x / 2.f,
|
||||||
|
shape.getPosition().y + shape.getSize().y / 2.f
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::loadIdleFrame() {
|
||||||
|
if (!idleFrame.loadFromFile("img/FA_PENGUIN_Idle_000.png")) {
|
||||||
|
cout << "Cannot load idle frame\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Player::loadRunAnimation() {
|
||||||
|
runFrames.clear();
|
||||||
|
for (size_t i = 0; i < 10; ++i) { // припустимо 10 кадрів
|
||||||
|
sf::Texture tex;
|
||||||
|
string filename = "img/04-Run/FA_PENGUIN_Run_00" + to_string(i) + ".png";
|
||||||
|
if (!tex.loadFromFile(filename)) {
|
||||||
|
cout << "Cannot load " << filename << "\n";
|
||||||
|
} else {
|
||||||
|
runFrames.push_back(tex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Закоментований метод `update` (робота на потім).
|
void Player::update(float deltaTime, const std::vector<Platform>& platforms) {
|
||||||
// Він призначений для оновлення логіки гравця у кожному кадрі гри.
|
|
||||||
// Усередині цього методу, ви будете обробляти рух, зіткнення, анімацію тощо.
|
|
||||||
// `deltaTime` — це час, що минув з попереднього кадру, і він забезпечує плавний рух незалежно від швидкості комп'ютера.
|
|
||||||
void Player::update(float deltaTime, const std::vector<Platform>& platforms) { // Тут буде логіка руху гравця
|
|
||||||
float moveX = 0.f;
|
float moveX = 0.f;
|
||||||
|
isMoving = false;
|
||||||
|
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
|
||||||
|
moveX -= speed * deltaTime;
|
||||||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
|
facingRight = false;
|
||||||
moveX -= speed * deltaTime;} //рух вліво
|
isMoving = true;
|
||||||
|
}
|
||||||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)){
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
|
||||||
moveX += speed * deltaTime;} //рух вправо
|
moveX += speed * deltaTime;
|
||||||
|
facingRight = true;
|
||||||
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && onGround==true) {
|
isMoving = true;
|
||||||
|
}
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && onGround)
|
||||||
velocityY = -jumpStrength;
|
velocityY = -jumpStrength;
|
||||||
}
|
|
||||||
velocityY += gravity * deltaTime;
|
velocityY += gravity * deltaTime;
|
||||||
|
|
||||||
shape.move(moveX, 0.f);
|
shape.move(moveX, 0.f);
|
||||||
shape.move(0.f , velocityY * deltaTime);
|
shape.move(0.f, velocityY * deltaTime);
|
||||||
|
|
||||||
//перевірка чи є земля та обмеження щоб фігура не вилитіла
|
// Земля
|
||||||
|
if (shape.getPosition().y + shape.getSize().y >= groundLevel) {
|
||||||
if(shape.getPosition().y + shape.getSize().y >= groundLevel){
|
shape.setPosition(shape.getPosition().x, groundLevel - shape.getSize().y);
|
||||||
shape.setPosition(shape.getPosition().x, groundLevel -shape.getSize().y);
|
|
||||||
velocityY = 0;
|
|
||||||
onGround = true;
|
|
||||||
}else{
|
|
||||||
onGround = false;
|
|
||||||
}
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
sf::FloatRect playerBounds = shape.getGlobalBounds();
|
|
||||||
|
|
||||||
for (const auto& platform : platforms) {
|
|
||||||
sf::FloatRect platformBounds = platform.getBounds();
|
|
||||||
if (playerBounds.intersects(platformBounds)){
|
|
||||||
if (playerBounds.intersects(platformBounds)) {
|
|
||||||
// Додатковий if — перевіряємо, чи гравець зверху
|
|
||||||
if (playerBounds.top + playerBounds.height <= platformBounds.top + 20.f) {
|
|
||||||
shape.setPosition(shape.getPosition().x, platformBounds.top - shape.getSize().y);
|
|
||||||
velocityY = 0.f;
|
velocityY = 0.f;
|
||||||
onGround = true;
|
onGround = true;
|
||||||
}else if(playerBounds.top> platformBounds.top){shape.setPosition(shape.getPosition().x, platformBounds.top +platformBounds.height);
|
} else onGround = false;
|
||||||
velocityY =0.f;}
|
|
||||||
|
// Колізії з платформами
|
||||||
|
for (const auto& platform : platforms) {
|
||||||
|
sf::FloatRect playerBounds = shape.getGlobalBounds();
|
||||||
|
sf::FloatRect platBounds = platform.getBounds();
|
||||||
|
if (playerBounds.intersects(platBounds)) {
|
||||||
|
if (playerBounds.top + playerBounds.height <= platBounds.top + 20.f) {
|
||||||
|
shape.setPosition(shape.getPosition().x, platBounds.top - shape.getSize().y);
|
||||||
|
velocityY = 0.f;
|
||||||
|
onGround = true;
|
||||||
|
} else if (playerBounds.top > platBounds.top) {
|
||||||
|
shape.setPosition(shape.getPosition().x, platBounds.top + platBounds.height);
|
||||||
|
velocityY = 0.f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Межі екрану
|
||||||
|
if (shape.getPosition().x < 0.f) shape.setPosition(0.f, shape.getPosition().y);
|
||||||
|
if (shape.getPosition().x + shape.getSize().x > 1925.f)
|
||||||
|
shape.setPosition(1925.f - shape.getSize().x, shape.getPosition().y);
|
||||||
|
|
||||||
|
// Анімація
|
||||||
|
animationTimer += deltaTime;
|
||||||
|
if (isMoving && !runFrames.empty()) {
|
||||||
/////////////////////////////////////////////////////
|
if (animationTimer >= animationSpeed) {
|
||||||
|
animationTimer = 0.f;
|
||||||
if(shape.getPosition().x < 0.f)
|
currentFrame = (currentFrame + 1) % runFrames.size();
|
||||||
shape.setPosition(0.f, shape.getPosition().y);
|
sprite.setTexture(runFrames[currentFrame]);
|
||||||
|
}
|
||||||
if(shape.getPosition().x+shape.getSize().x>1925.f)
|
} else {
|
||||||
shape.setPosition(1925.f - shape.getSize().x ,shape.getPosition().y);
|
sprite.setTexture(idleFrame);
|
||||||
|
|
||||||
|
|
||||||
if(shape.getPosition().y < 0.f)
|
|
||||||
shape.setPosition(shape.getPosition().x,0.f);
|
|
||||||
|
|
||||||
if(shape.getPosition().y+shape.getSize().y>1200.f)
|
|
||||||
shape.setPosition(shape.getPosition().x, 1200.f - shape.getSize().y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Центруємо спрайт по хітбоксу
|
||||||
|
sprite.setOrigin(sprite.getTexture()->getSize().x / 2.f,
|
||||||
|
sprite.getTexture()->getSize().y / 2.f);
|
||||||
|
|
||||||
// Метод `draw` для відмальовування гравця на екрані.
|
sprite.setPosition(shape.getPosition().x + shape.getSize().x / 2.f,
|
||||||
// Приймає посилання на вікно, щоб знати, де малювати.
|
shape.getPosition().y + shape.getSize().y / 2.f);
|
||||||
void Player::draw(sf::RenderWindow& window)
|
|
||||||
{
|
float scaleX = shape.getSize().x / sprite.getTexture()->getSize().x;
|
||||||
// Викликаємо метод `draw` вікна, щоб намалювати наш об'єкт `shape`.
|
float scaleY = shape.getSize().y / sprite.getTexture()->getSize().y;
|
||||||
window.draw(shape);
|
|
||||||
|
// Віддзеркалення за напрямком погляду
|
||||||
|
sprite.setScale(facingRight ? -scaleX : scaleX, scaleY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::draw(sf::RenderWindow& window) {
|
||||||
|
window.draw(sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
48
player.hpp
48
player.hpp
|
|
@ -1,33 +1,45 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "platform.hpp"
|
#include "platform.hpp"
|
||||||
|
|
||||||
|
|
||||||
//float velocityY;
|
|
||||||
//float gravity;
|
|
||||||
//float jumpStrength;
|
|
||||||
//bool isOnGround;
|
|
||||||
|
|
||||||
|
|
||||||
class Player {
|
class Player {
|
||||||
|
sf::RectangleShape shape;
|
||||||
|
float speed;
|
||||||
|
float velocityY;
|
||||||
|
float jumpStrength;
|
||||||
|
bool onGround;
|
||||||
|
float gravity;
|
||||||
|
float groundLevel;
|
||||||
|
bool facingRight;
|
||||||
|
|
||||||
private:
|
std::vector<sf::Texture> runFrames;
|
||||||
sf::RectangleShape shape; // форма гравця
|
sf::Texture idleFrame;
|
||||||
float speed; //швидкість гравця
|
sf::Sprite sprite;
|
||||||
float velocityY; // швидкість по вертикалі
|
|
||||||
float jumpStrength; // сила стрибка
|
|
||||||
bool onGround; //чи стоїть на землі
|
|
||||||
float gravity; // сила гравітації
|
|
||||||
float groundLevel; // висота "землі"
|
|
||||||
|
|
||||||
|
size_t currentFrame;
|
||||||
|
float animationTimer;
|
||||||
|
float animationSpeed;
|
||||||
|
bool isMoving;
|
||||||
|
|
||||||
|
void loadRunAnimation();
|
||||||
|
void loadIdleFrame();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Player(); // порожній конструктор
|
Player();
|
||||||
void update(float deltaTime, const std::vector<Platform>& platforms);
|
|
||||||
|
|
||||||
|
void update(float deltaTime, const std::vector<Platform>& platforms);
|
||||||
void draw(sf::RenderWindow& window);
|
void draw(sf::RenderWindow& window);
|
||||||
|
|
||||||
|
// Геттери
|
||||||
|
sf::RectangleShape& getShape() { return shape; }
|
||||||
|
float getVelocityY() const { return velocityY; }
|
||||||
|
bool isOnGround() const { return onGround; }
|
||||||
|
|
||||||
|
// Сеттери
|
||||||
|
void setPosition(const sf::Vector2f& pos) { shape.setPosition(pos); }
|
||||||
|
void setVelocityY(float v) { velocityY = v; }
|
||||||
|
void setOnGround(bool val) { onGround = val; }
|
||||||
|
|
||||||
|
bool isFacingRight() const { return facingRight; }
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,3 @@
|
||||||
#include "platform.hpp"
|
#include "platform.hpp"
|
||||||
#include "bullet.hpp"
|
#include "bullet.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue