who knows

This commit is contained in:
Benjamin Morgan 2025-09-26 09:18:22 -06:00
parent 60d408a37c
commit f43544d15d
19 changed files with 2379 additions and 2063 deletions

View file

@ -1,317 +1,317 @@
//
// Created by benmo on 2/14/2020.
//
#ifndef SFML_TEMPLATE_SPRITE_H
#define SFML_TEMPLATE_SPRITE_H
#include <string>
#include <SFML/Graphics.hpp>
#include <cmath>
using namespace sf;
class MySprite: public sf::Sprite{
protected:
struct Physics {
float velocity, direction, acceleration, maxVelocity, minVelocity;
float rotVelocity, rotAcceleration, maxRotVelocity;
float xPos, yPos;
};
struct Animation {
float frameLength;
unsigned int currframe = 0, columns, height, width, numFrames;
Clock clock;
bool isAnimated = false, isPlayed = false;
IntRect textureRect;
};
Physics spritePhysics{};
Animation spriteAnimation{};
bool toErase = false, circularHitbox = false;
string type = "Sprite";
public:
enum EdgeBehavior {
IGNORE, LOOP, BOUNCE
};
EdgeBehavior edgeBehavior = IGNORE;
constexpr static const double PI = 3.1415926;
static double distance(sf::Vector2f pos1, sf::Vector2f pos2) {
return sqrt(pow(pos2.x - pos1.x, 2) + pow(pos2.y - pos1.y, 2));
}
MySprite() : sf::Sprite() {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
}
explicit MySprite(const sf::Texture &texture) : sf::Sprite(texture) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
}
MySprite(const sf::Texture &texture, float scale) : sf::Sprite(texture) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
setScale(scale/100, scale/100);
}
MySprite(const sf::Texture &texture, const sf::IntRect &rectangle) : sf::Sprite(texture, rectangle) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(rectangle.width/(float)2.0,rectangle.height/(float)2.0);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float direction) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float maxVelocity, float direction, float rotVelocity, float maxRotVelocity) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.rotVelocity = rotVelocity;
spritePhysics.maxVelocity = maxVelocity;
spritePhysics.maxRotVelocity = maxRotVelocity;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float acceleration, float maxVelocity, float direction, float rotVelocity, float rotAcceleration, float maxRotVelocity) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.rotVelocity = rotVelocity;
spritePhysics.maxVelocity = maxVelocity;
spritePhysics.maxRotVelocity = maxRotVelocity;
spritePhysics.acceleration = acceleration;
spritePhysics.rotAcceleration = rotAcceleration;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float maxVelocity, float direction) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.maxVelocity = maxVelocity;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
void makeAnimated(int rows, int columns, float length, int frames = 0) {
spriteAnimation.height = getTexture()->getSize().y/rows;
spriteAnimation.width = getTexture()->getSize().x/columns;
spriteAnimation.frameLength = length;
spriteAnimation.columns = columns;
if (frames == 0) spriteAnimation.numFrames = rows*columns;
else spriteAnimation.numFrames = frames;
spriteAnimation.isAnimated = true;
spriteAnimation.textureRect = IntRect(0, 0, spriteAnimation.width, spriteAnimation.height);
setTextureRect(spriteAnimation.textureRect);
setOrigin(spriteAnimation.width/2.0, spriteAnimation.height/2.0);
}
virtual void update(RenderWindow* window = nullptr) {
spritePhysics.xPos += cos(spritePhysics.direction * (PI/180.0)) * spritePhysics.velocity;
spritePhysics.yPos += -(sin(spritePhysics.direction * (PI/180.0)) * spritePhysics.velocity);
if (edgeBehavior == LOOP) {
if (spritePhysics.xPos <= -getGlobalBounds().width)
spritePhysics.xPos = window->getSize().x + getGlobalBounds().width;
else if (spritePhysics.xPos >= window->getSize().x + getGlobalBounds().width)
spritePhysics.xPos = -getGlobalBounds().width;
if (spritePhysics.yPos <= -getGlobalBounds().height)
spritePhysics.yPos = window->getSize().y + getGlobalBounds().height;
else if (spritePhysics.yPos >= window->getSize().y + getGlobalBounds().height)
spritePhysics.yPos = -getGlobalBounds().height;
} else if (edgeBehavior == IGNORE) {
if (spritePhysics.xPos <= -getGlobalBounds().width ||
spritePhysics.xPos >= window->getSize().x + getGlobalBounds().width ||
spritePhysics.yPos <= -getGlobalBounds().height ||
spritePhysics.yPos >= window->getSize().y + getGlobalBounds().height)
toErase = true;
}
spritePhysics.direction -= spritePhysics.rotVelocity;
spritePhysics.direction = fmod(spritePhysics.direction, 360);
if (spritePhysics.direction < 0)
spritePhysics.direction += 360;
if (spriteAnimation.isAnimated) {
if (spriteAnimation.clock.getElapsedTime().asSeconds() > spriteAnimation.frameLength) {
spriteAnimation.currframe++;
if (spriteAnimation.currframe % spriteAnimation.columns == 0) {
spriteAnimation.textureRect.left = 0;
spriteAnimation.textureRect.top += spriteAnimation.height;
} else
spriteAnimation.textureRect.left += spriteAnimation.height;
setTextureRect(spriteAnimation.textureRect);
spriteAnimation.clock.restart();
if (spriteAnimation.currframe == spriteAnimation.numFrames) {
spriteAnimation.isPlayed = true;
spriteAnimation.currframe = 0;
spriteAnimation.textureRect.left = 0;
spriteAnimation.textureRect.top = 0;
}
spriteAnimation.clock.restart();
}
}
setPosition(spritePhysics.xPos, spritePhysics.yPos);
setRotation(-spritePhysics.direction);
}
void accelerate(float override = 0, bool ignoreMax = false) {
if (override != 0) spritePhysics.velocity += override;
else spritePhysics.velocity += spritePhysics.acceleration;
if (!ignoreMax && spritePhysics.velocity > spritePhysics.maxVelocity) spritePhysics.velocity = spritePhysics.maxVelocity;
if (!ignoreMax && spritePhysics.velocity < spritePhysics.minVelocity) spritePhysics.velocity = spritePhysics.minVelocity;
}
void rotAccel(float override = 0, bool ignoreMax = false) {
if (override != 0) spritePhysics.rotVelocity += override;
else spritePhysics.rotVelocity += spritePhysics.rotAcceleration;
if (!ignoreMax && spritePhysics.rotVelocity > spritePhysics.maxRotVelocity) spritePhysics.rotVelocity = spritePhysics.maxRotVelocity;
else if (!ignoreMax && -spritePhysics.rotVelocity > spritePhysics.maxRotVelocity) spritePhysics.rotVelocity = -spritePhysics.maxRotVelocity;
}
void turn(float degrees) {
spritePhysics.direction -= degrees;
setRotation(-spritePhysics.direction);
}
float getXPos() {
return spritePhysics.xPos;
}
float getYPos() {
return spritePhysics.yPos;
}
void setPosition(float xPos, float yPos) {
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
sf::Sprite::setPosition(sf::Vector2f(xPos, yPos));
}
void setPosition(const sf::Vector2f &vec) {
spritePhysics.xPos = vec.x;
spritePhysics.yPos = vec.y;
sf::Sprite::setPosition(vec);
}
float getDirection() {
return spritePhysics.direction;
}
void setDirection(float angle) {
spritePhysics.direction = angle;
setRotation(-angle);
}
void setVelocity(float velo) {
spritePhysics.velocity = velo;
}
float getVelocity() {
return spritePhysics.velocity;
}
float getRotVelocity() {
return spritePhysics.rotVelocity;
};
void setMaxVelocity(float velo) {
spritePhysics.maxVelocity = velo;
}
void setMinVelocity(float velo) {
spritePhysics.minVelocity = velo;
}
void setMaxRotVelocity(float velo) {
spritePhysics.maxRotVelocity = velo;
}
void setEdgeBehavior(EdgeBehavior behavior) {
edgeBehavior = behavior;
}
bool toBeErased() const {
return toErase;
}
Animation getAnimation() {
return spriteAnimation;
}
string getType() {
return type;
}
void setType(string type) {
this->type = std::move(type);
}
};
#endif //SFML_TEMPLATE_SPRITE_H
//
// Created by benmo on 2/14/2020.
//
#ifndef SFML_TEMPLATE_SPRITE_H
#define SFML_TEMPLATE_SPRITE_H
#include <string>
#include <SFML/Graphics.hpp>
#include <cmath>
using namespace sf;
class MySprite: public sf::Sprite{
protected:
struct Physics {
float velocity, direction, acceleration, maxVelocity, minVelocity;
float rotVelocity, rotAcceleration, maxRotVelocity;
float xPos, yPos;
};
struct Animation {
float frameLength;
unsigned int currframe = 0, columns, height, width, numFrames;
Clock clock;
bool isAnimated = false, isPlayed = false;
IntRect textureRect;
};
Physics spritePhysics{};
Animation spriteAnimation{};
bool toErase = false, circularHitbox = false;
string type = "Sprite";
public:
enum EdgeBehavior {
IGNORE, LOOP, BOUNCE
};
EdgeBehavior edgeBehavior = IGNORE;
constexpr static const double PI = 3.1415926;
static double distance(sf::Vector2f pos1, sf::Vector2f pos2) {
return sqrt(pow(pos2.x - pos1.x, 2) + pow(pos2.y - pos1.y, 2));
}
MySprite() : sf::Sprite() {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
}
explicit MySprite(const sf::Texture &texture) : sf::Sprite(texture) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
}
MySprite(const sf::Texture &texture, float scale) : sf::Sprite(texture) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(getGlobalBounds().width/2,getGlobalBounds().height/2);
setScale(scale/100, scale/100);
}
MySprite(const sf::Texture &texture, const sf::IntRect &rectangle) : sf::Sprite(texture, rectangle) {
spritePhysics.velocity = 0;
spritePhysics.xPos = 0;
spritePhysics.yPos = 0;
spritePhysics.direction = 0;
setOrigin(rectangle.width/(float)2.0,rectangle.height/(float)2.0);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float direction) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float maxVelocity, float direction, float rotVelocity, float maxRotVelocity) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.rotVelocity = rotVelocity;
spritePhysics.maxVelocity = maxVelocity;
spritePhysics.maxRotVelocity = maxRotVelocity;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float acceleration, float maxVelocity, float direction, float rotVelocity, float rotAcceleration, float maxRotVelocity) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.rotVelocity = rotVelocity;
spritePhysics.maxVelocity = maxVelocity;
spritePhysics.maxRotVelocity = maxRotVelocity;
spritePhysics.acceleration = acceleration;
spritePhysics.rotAcceleration = rotAcceleration;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
MySprite(const sf::Texture &texture, float scale, float xPos, float yPos, float velocity, float maxVelocity, float direction) : sf::Sprite(texture) {
spritePhysics.velocity = velocity;
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
spritePhysics.direction = direction;
spritePhysics.maxVelocity = maxVelocity;
setScale(scale/100, scale/100);
setOrigin(getLocalBounds().width/2, getLocalBounds().height/2);
setPosition(spritePhysics.xPos,spritePhysics.yPos);
setRotation(direction);
}
void makeAnimated(int rows, int columns, float length, int frames = 0) {
spriteAnimation.height = getTexture()->getSize().y/rows;
spriteAnimation.width = getTexture()->getSize().x/columns;
spriteAnimation.frameLength = length;
spriteAnimation.columns = columns;
if (frames == 0) spriteAnimation.numFrames = rows*columns;
else spriteAnimation.numFrames = frames;
spriteAnimation.isAnimated = true;
spriteAnimation.textureRect = IntRect(0, 0, spriteAnimation.width, spriteAnimation.height);
setTextureRect(spriteAnimation.textureRect);
setOrigin(spriteAnimation.width/2.0, spriteAnimation.height/2.0);
}
virtual void update(RenderWindow* window = nullptr) {
spritePhysics.xPos += cos(spritePhysics.direction * (PI/180.0)) * spritePhysics.velocity;
spritePhysics.yPos += -(sin(spritePhysics.direction * (PI/180.0)) * spritePhysics.velocity);
if (edgeBehavior == LOOP) {
if (spritePhysics.xPos <= -getGlobalBounds().width)
spritePhysics.xPos = window->getSize().x + getGlobalBounds().width;
else if (spritePhysics.xPos >= window->getSize().x + getGlobalBounds().width)
spritePhysics.xPos = -getGlobalBounds().width;
if (spritePhysics.yPos <= -getGlobalBounds().height)
spritePhysics.yPos = window->getSize().y + getGlobalBounds().height;
else if (spritePhysics.yPos >= window->getSize().y + getGlobalBounds().height)
spritePhysics.yPos = -getGlobalBounds().height;
} else if (edgeBehavior == IGNORE) {
if (spritePhysics.xPos <= -getGlobalBounds().width ||
spritePhysics.xPos >= window->getSize().x + getGlobalBounds().width ||
spritePhysics.yPos <= -getGlobalBounds().height ||
spritePhysics.yPos >= window->getSize().y + getGlobalBounds().height)
toErase = true;
}
spritePhysics.direction -= spritePhysics.rotVelocity;
spritePhysics.direction = fmod(spritePhysics.direction, 360);
if (spritePhysics.direction < 0)
spritePhysics.direction += 360;
if (spriteAnimation.isAnimated) {
if (spriteAnimation.clock.getElapsedTime().asSeconds() > spriteAnimation.frameLength) {
spriteAnimation.currframe++;
if (spriteAnimation.currframe % spriteAnimation.columns == 0) {
spriteAnimation.textureRect.left = 0;
spriteAnimation.textureRect.top += spriteAnimation.height;
} else
spriteAnimation.textureRect.left += spriteAnimation.height;
setTextureRect(spriteAnimation.textureRect);
spriteAnimation.clock.restart();
if (spriteAnimation.currframe == spriteAnimation.numFrames) {
spriteAnimation.isPlayed = true;
spriteAnimation.currframe = 0;
spriteAnimation.textureRect.left = 0;
spriteAnimation.textureRect.top = 0;
}
spriteAnimation.clock.restart();
}
}
setPosition(spritePhysics.xPos, spritePhysics.yPos);
setRotation(-spritePhysics.direction);
}
void accelerate(float override = 0, bool ignoreMax = false) {
if (override != 0) spritePhysics.velocity += override;
else spritePhysics.velocity += spritePhysics.acceleration;
if (!ignoreMax && spritePhysics.velocity > spritePhysics.maxVelocity) spritePhysics.velocity = spritePhysics.maxVelocity;
if (!ignoreMax && spritePhysics.velocity < spritePhysics.minVelocity) spritePhysics.velocity = spritePhysics.minVelocity;
}
void rotAccel(float override = 0, bool ignoreMax = false) {
if (override != 0) spritePhysics.rotVelocity += override;
else spritePhysics.rotVelocity += spritePhysics.rotAcceleration;
if (!ignoreMax && spritePhysics.rotVelocity > spritePhysics.maxRotVelocity) spritePhysics.rotVelocity = spritePhysics.maxRotVelocity;
else if (!ignoreMax && -spritePhysics.rotVelocity > spritePhysics.maxRotVelocity) spritePhysics.rotVelocity = -spritePhysics.maxRotVelocity;
}
void turn(float degrees) {
spritePhysics.direction -= degrees;
setRotation(-spritePhysics.direction);
}
float getXPos() {
return spritePhysics.xPos;
}
float getYPos() {
return spritePhysics.yPos;
}
void setPosition(float xPos, float yPos) {
spritePhysics.xPos = xPos;
spritePhysics.yPos = yPos;
sf::Sprite::setPosition(sf::Vector2f(xPos, yPos));
}
void setPosition(const sf::Vector2f &vec) {
spritePhysics.xPos = vec.x;
spritePhysics.yPos = vec.y;
sf::Sprite::setPosition(vec);
}
float getDirection() {
return spritePhysics.direction;
}
void setDirection(float angle) {
spritePhysics.direction = angle;
setRotation(-angle);
}
void setVelocity(float velo) {
spritePhysics.velocity = velo;
}
float getVelocity() {
return spritePhysics.velocity;
}
float getRotVelocity() {
return spritePhysics.rotVelocity;
};
void setMaxVelocity(float velo) {
spritePhysics.maxVelocity = velo;
}
void setMinVelocity(float velo) {
spritePhysics.minVelocity = velo;
}
void setMaxRotVelocity(float velo) {
spritePhysics.maxRotVelocity = velo;
}
void setEdgeBehavior(EdgeBehavior behavior) {
edgeBehavior = behavior;
}
bool toBeErased() const {
return toErase;
}
Animation getAnimation() {
return spriteAnimation;
}
string getType() {
return type;
}
void setType(string type) {
this->type = std::move(type);
}
};
#endif //SFML_TEMPLATE_SPRITE_H