개발 일지/윈도우

[Dribble The Spaceship] Day2

Roble 2024. 1. 2. 18:06

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;
}