1.동적할당과 메모리 누수 확인



2.적우주선이 플레이어를 따라가게 하기
3. 적우주선 위치값을 스택에서 힙메모리로 변환시키기
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__)
#else
#define DBG_NEW new
#endif
#include <SFML/Graphics.hpp>
#include <iostream>
void UpdatePlayerPosition(sf::Vector2f& playerPossition) {
bool dPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::D);
bool aPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::A);
bool wPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::W);
bool sPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::S);
bool rightPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
bool leftPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
bool upPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Up);
bool downPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Down);
if (dPressed || rightPressed) {
playerPossition.x += 0.05f;
}
if (aPressed || leftPressed) {
playerPossition.x -= 0.05f;
}
if (wPressed || upPressed) {
playerPossition.y -= 0.05f;
}
if (sPressed || downPressed) {
playerPossition.y += 0.05f;
}
}
void updateEnemyPosition(float enemySpeed, int enemyCount, float* enemyPositionX, float* enemyPositionY,
sf::Vector2f playerPosition) {
for (int i = 0; i < enemyCount; i++) {
float enemyToPlayerX = playerPosition.x - enemyPositionX[i]; //적과 나의 x차이
float enemyToPlayerY = playerPosition.y - enemyPositionY[i]; //적과 나의 y차이
float length = sqrt(enemyToPlayerX * enemyToPlayerX + enemyToPlayerY * enemyToPlayerY);
//피타고라스정리 이요해서 두 좌표 거리를 구한것 : 루트(x의차이^2 + y의차이^2)
enemyToPlayerX /= length; //플레이어로 향하는 적의 벡터 크기 1짜리를 구한것
enemyToPlayerY /= length;
enemyPositionX[i] += enemyToPlayerX * enemySpeed;
enemyPositionY[i] += enemyToPlayerY * enemySpeed;
}
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(2508); // 누수가 있는 경우 할당 번호로 중단 설정
int screenWidth = 800;
int screenHeight = 450;
sf::RenderWindow window(sf::VideoMode(screenWidth, screenHeight), "Game!");
//player
sf::RectangleShape player;
float rectWidth = 20.0f;
float rectHeight = 20.0f;
sf::Vector2f playerPosition = sf::Vector2f(50.0f, 50.0f);
player.setSize(sf::Vector2f{ rectWidth, rectHeight });
player.setPosition(sf::Vector2f{ playerPosition });
player.setFillColor(sf::Color::Red);
//enemies
const int enemyCount = 10;
float* enemyPositionX = new float[enemyCount];
float* enemyPositionY = new float[enemyCount];
const float enemySize = 10.0f;
float enemySpeed = 0.04f;
const sf::Color enemyColor = sf::Color::Cyan;
sf::CircleShape enemies[enemyCount];
for (int i = 0; i < enemyCount; i++) {
enemyPositionX[i] = screenWidth - 100;
enemyPositionY[i] = rand() % screenHeight;
enemies[i] = sf::CircleShape{ enemySize };
enemies[i].setFillColor(enemyColor);
enemies[i].setOutlineColor(sf::Color::Red);
enemies[i].setOutlineThickness(1.0f);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
//플레이어 이동 로직
UpdatePlayerPosition(playerPosition);
player.setPosition(playerPosition);
//적 이동 로직
updateEnemyPosition(enemySpeed, enemyCount, enemyPositionX, enemyPositionY, playerPosition);
for (int i = 0; i < enemyCount; i++) {
enemies[i].setPosition(sf::Vector2f{ enemyPositionX[i], enemyPositionY[i]});
}
window.clear(); //1)지우기
window.draw(player);//2)그리기
for (int i = 0; i < enemyCount; i++) {
window.draw(enemies[i]);
}
window.display(); //3)표시하기
}
delete[] enemyPositionX;
delete[] enemyPositionY;
}
4. 플레이어 위치값과 적우주선 위치값을 Vector동적할당으로 변환시키기
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__)
#else
#define DBG_NEW new
#endif
#include <SFML/Graphics.hpp>
#include <iostream>
void UpdatePlayerPosition(sf::Vector2f& playerPossition) {
bool dPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::D);
bool aPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::A);
bool wPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::W);
bool sPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::S);
bool rightPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
bool leftPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
bool upPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Up);
bool downPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Down);
if (dPressed || rightPressed) {
playerPossition.x += 0.05f;
}
if (aPressed || leftPressed) {
playerPossition.x -= 0.05f;
}
if (wPressed || upPressed) {
playerPossition.y -= 0.05f;
}
if (sPressed || downPressed) {
playerPossition.y += 0.05f;
}
}
void updateEnemyPosition(float enemySpeed, int enemyCount, sf::Vector2f* enemyPositions, sf::Vector2f playerPosition) {
for (int i = 0; i < enemyCount; i++) {
float enemyToPlayerX = playerPosition.x - enemyPositions[i].x; //적과 나의 x차이
float enemyToPlayerY = playerPosition.y - enemyPositions[i].y; //적과 나의 y차이
float length = sqrt(enemyToPlayerX * enemyToPlayerX + enemyToPlayerY * enemyToPlayerY);
//피타고라스정리 이요해서 두 좌표 거리를 구한것 : 루트(x의차이^2 + y의차이^2)
enemyToPlayerX /= length; //플레이어로 향하는 적의 벡터 크기 1짜리를 구한것
enemyToPlayerY /= length;
enemyPositions[i].x += enemyToPlayerX * enemySpeed;
enemyPositions[i].y += enemyToPlayerY * enemySpeed;
}
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(2508); // 누수가 있는 경우 할당 번호로 중단 설정
int screenWidth = 800;
int screenHeight = 450;
sf::RenderWindow window(sf::VideoMode(screenWidth, screenHeight), "Game!");
//player
sf::RectangleShape player;
float rectWidth = 20.0f;
float rectHeight = 20.0f;
sf::Vector2f playerPosition = sf::Vector2f(50.0f, 50.0f);
player.setSize(sf::Vector2f{ rectWidth, rectHeight });
player.setPosition(sf::Vector2f{ playerPosition });
player.setFillColor(sf::Color::Red);
//enemies
const int enemyCount = 10;
sf::Vector2f* enemyPositions = new sf::Vector2f[enemyCount];
const float enemySize = 10.0f;
float enemySpeed = 0.04f;
const sf::Color enemyColor = sf::Color::Cyan;
sf::CircleShape enemies[enemyCount];
for (int i = 0; i < enemyCount; i++) {
enemyPositions[i].x = screenWidth - 100;
enemyPositions[i].y = rand() % screenHeight;
enemies[i] = sf::CircleShape{ enemySize };
enemies[i].setFillColor(enemyColor);
enemies[i].setOutlineColor(sf::Color::Red);
enemies[i].setOutlineThickness(1.0f);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
//플레이어 이동 로직
UpdatePlayerPosition(playerPosition);
player.setPosition(playerPosition);
//적 이동 로직
updateEnemyPosition(enemySpeed, enemyCount, enemyPositions, playerPosition);
for (int i = 0; i < enemyCount; i++) {
enemies[i].setPosition(sf::Vector2f(enemyPositions[i]));
}
window.clear(); //1)지우기
{
window.draw(player);//2)그리기
for (int i = 0; i < enemyCount; i++) {
window.draw(enemies[i]);
}
}
window.display(); //3)표시하기
}
delete[] enemyPositions;
return 0;
}
'개발 일지 > 윈도우' 카테고리의 다른 글
[Dribble The Spaceship] Day4 (0) | 2024.01.07 |
---|---|
[Dribble The Spaceship] Day3 (0) | 2024.01.03 |
[Dribble The Spaceship] Day1 (0) | 2023.12.31 |
[Dribble The Spaceship] 초안 (0) | 2023.12.31 |
1.동적할당과 메모리 누수 확인



2.적우주선이 플레이어를 따라가게 하기
3. 적우주선 위치값을 스택에서 힙메모리로 변환시키기
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__)
#else
#define DBG_NEW new
#endif
#include <SFML/Graphics.hpp>
#include <iostream>
void UpdatePlayerPosition(sf::Vector2f& playerPossition) {
bool dPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::D);
bool aPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::A);
bool wPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::W);
bool sPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::S);
bool rightPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
bool leftPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
bool upPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Up);
bool downPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Down);
if (dPressed || rightPressed) {
playerPossition.x += 0.05f;
}
if (aPressed || leftPressed) {
playerPossition.x -= 0.05f;
}
if (wPressed || upPressed) {
playerPossition.y -= 0.05f;
}
if (sPressed || downPressed) {
playerPossition.y += 0.05f;
}
}
void updateEnemyPosition(float enemySpeed, int enemyCount, float* enemyPositionX, float* enemyPositionY,
sf::Vector2f playerPosition) {
for (int i = 0; i < enemyCount; i++) {
float enemyToPlayerX = playerPosition.x - enemyPositionX[i]; //적과 나의 x차이
float enemyToPlayerY = playerPosition.y - enemyPositionY[i]; //적과 나의 y차이
float length = sqrt(enemyToPlayerX * enemyToPlayerX + enemyToPlayerY * enemyToPlayerY);
//피타고라스정리 이요해서 두 좌표 거리를 구한것 : 루트(x의차이^2 + y의차이^2)
enemyToPlayerX /= length; //플레이어로 향하는 적의 벡터 크기 1짜리를 구한것
enemyToPlayerY /= length;
enemyPositionX[i] += enemyToPlayerX * enemySpeed;
enemyPositionY[i] += enemyToPlayerY * enemySpeed;
}
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(2508); // 누수가 있는 경우 할당 번호로 중단 설정
int screenWidth = 800;
int screenHeight = 450;
sf::RenderWindow window(sf::VideoMode(screenWidth, screenHeight), "Game!");
//player
sf::RectangleShape player;
float rectWidth = 20.0f;
float rectHeight = 20.0f;
sf::Vector2f playerPosition = sf::Vector2f(50.0f, 50.0f);
player.setSize(sf::Vector2f{ rectWidth, rectHeight });
player.setPosition(sf::Vector2f{ playerPosition });
player.setFillColor(sf::Color::Red);
//enemies
const int enemyCount = 10;
float* enemyPositionX = new float[enemyCount];
float* enemyPositionY = new float[enemyCount];
const float enemySize = 10.0f;
float enemySpeed = 0.04f;
const sf::Color enemyColor = sf::Color::Cyan;
sf::CircleShape enemies[enemyCount];
for (int i = 0; i < enemyCount; i++) {
enemyPositionX[i] = screenWidth - 100;
enemyPositionY[i] = rand() % screenHeight;
enemies[i] = sf::CircleShape{ enemySize };
enemies[i].setFillColor(enemyColor);
enemies[i].setOutlineColor(sf::Color::Red);
enemies[i].setOutlineThickness(1.0f);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
//플레이어 이동 로직
UpdatePlayerPosition(playerPosition);
player.setPosition(playerPosition);
//적 이동 로직
updateEnemyPosition(enemySpeed, enemyCount, enemyPositionX, enemyPositionY, playerPosition);
for (int i = 0; i < enemyCount; i++) {
enemies[i].setPosition(sf::Vector2f{ enemyPositionX[i], enemyPositionY[i]});
}
window.clear(); //1)지우기
window.draw(player);//2)그리기
for (int i = 0; i < enemyCount; i++) {
window.draw(enemies[i]);
}
window.display(); //3)표시하기
}
delete[] enemyPositionX;
delete[] enemyPositionY;
}
4. 플레이어 위치값과 적우주선 위치값을 Vector동적할당으로 변환시키기
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__)
#else
#define DBG_NEW new
#endif
#include <SFML/Graphics.hpp>
#include <iostream>
void UpdatePlayerPosition(sf::Vector2f& playerPossition) {
bool dPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::D);
bool aPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::A);
bool wPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::W);
bool sPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::S);
bool rightPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
bool leftPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
bool upPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Up);
bool downPressed = sf::Keyboard::isKeyPressed(sf::Keyboard::Down);
if (dPressed || rightPressed) {
playerPossition.x += 0.05f;
}
if (aPressed || leftPressed) {
playerPossition.x -= 0.05f;
}
if (wPressed || upPressed) {
playerPossition.y -= 0.05f;
}
if (sPressed || downPressed) {
playerPossition.y += 0.05f;
}
}
void updateEnemyPosition(float enemySpeed, int enemyCount, sf::Vector2f* enemyPositions, sf::Vector2f playerPosition) {
for (int i = 0; i < enemyCount; i++) {
float enemyToPlayerX = playerPosition.x - enemyPositions[i].x; //적과 나의 x차이
float enemyToPlayerY = playerPosition.y - enemyPositions[i].y; //적과 나의 y차이
float length = sqrt(enemyToPlayerX * enemyToPlayerX + enemyToPlayerY * enemyToPlayerY);
//피타고라스정리 이요해서 두 좌표 거리를 구한것 : 루트(x의차이^2 + y의차이^2)
enemyToPlayerX /= length; //플레이어로 향하는 적의 벡터 크기 1짜리를 구한것
enemyToPlayerY /= length;
enemyPositions[i].x += enemyToPlayerX * enemySpeed;
enemyPositions[i].y += enemyToPlayerY * enemySpeed;
}
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(2508); // 누수가 있는 경우 할당 번호로 중단 설정
int screenWidth = 800;
int screenHeight = 450;
sf::RenderWindow window(sf::VideoMode(screenWidth, screenHeight), "Game!");
//player
sf::RectangleShape player;
float rectWidth = 20.0f;
float rectHeight = 20.0f;
sf::Vector2f playerPosition = sf::Vector2f(50.0f, 50.0f);
player.setSize(sf::Vector2f{ rectWidth, rectHeight });
player.setPosition(sf::Vector2f{ playerPosition });
player.setFillColor(sf::Color::Red);
//enemies
const int enemyCount = 10;
sf::Vector2f* enemyPositions = new sf::Vector2f[enemyCount];
const float enemySize = 10.0f;
float enemySpeed = 0.04f;
const sf::Color enemyColor = sf::Color::Cyan;
sf::CircleShape enemies[enemyCount];
for (int i = 0; i < enemyCount; i++) {
enemyPositions[i].x = screenWidth - 100;
enemyPositions[i].y = rand() % screenHeight;
enemies[i] = sf::CircleShape{ enemySize };
enemies[i].setFillColor(enemyColor);
enemies[i].setOutlineColor(sf::Color::Red);
enemies[i].setOutlineThickness(1.0f);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
//플레이어 이동 로직
UpdatePlayerPosition(playerPosition);
player.setPosition(playerPosition);
//적 이동 로직
updateEnemyPosition(enemySpeed, enemyCount, enemyPositions, playerPosition);
for (int i = 0; i < enemyCount; i++) {
enemies[i].setPosition(sf::Vector2f(enemyPositions[i]));
}
window.clear(); //1)지우기
{
window.draw(player);//2)그리기
for (int i = 0; i < enemyCount; i++) {
window.draw(enemies[i]);
}
}
window.display(); //3)표시하기
}
delete[] enemyPositions;
return 0;
}
'개발 일지 > 윈도우' 카테고리의 다른 글
[Dribble The Spaceship] Day4 (0) | 2024.01.07 |
---|---|
[Dribble The Spaceship] Day3 (0) | 2024.01.03 |
[Dribble The Spaceship] Day1 (0) | 2023.12.31 |
[Dribble The Spaceship] 초안 (0) | 2023.12.31 |