스페이스 바를 누르면 상대적으로 간단한 프로그램을 작성하여 움직이는 캐릭터로부터 작은 발사체를 만듭니다.SFML - 벡터에서 스프라이트를 그릴 때 프로그램이 충돌 함
프로그램을 오류없이 컴파일 (코드 블록)하고 스페이스 바를 누를 때까지 실행됩니다. 발사체를 발사하는 대신 프로그램이 즉시 충돌합니다.
저는 스크린에 발사체를 그려 넣은 선으로 충돌을 격리 할 수 있다고 생각합니다 (83 번). 전후에 줄에 cout 문을 사용했는데 두 번째 문은 표시되지 않았습니다.
for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}
나는이 모든 문제를 해결하기 위해 모든 코드를 필요로하므로 모든 코드를 게시했습니다.
#include <iostream>
#include <SFML/Graphics.hpp>
#include <string.h>
#include <math.h>
#include <vector>
using namespace std;
class Projectile
{
public:
Projectile(int, string);
void moveBullet();
sf::Sprite bulletSprite;
private:
sf::Texture bulletTexture;
int speed;
string bulletTextureString;
};
Projectile::Projectile(int s, string t)
{
speed = s;
bulletTextureString = t;
if(!bulletTexture.loadFromFile((bulletTextureString).c_str()))
{
cout << "error";
}
bulletSprite.setTexture(bulletTexture);
}
void Projectile::moveBullet()
{
bulletSprite.move(speed, 0);
}
class thePlayer
{
public:
void Fire(sf::Time);
void Walk();
void Draw(sf::RenderWindow&);
void Create(string);
sf::Time lastShot;
private:
vector<Projectile> inMotion;
sf::Texture playerTexture;
sf::Sprite playerSprite;
string playerTextureString;
int moveSpeed = 5;
};
void thePlayer::Create(string s)
{
playerTextureString = s;
if(!playerTexture.loadFromFile((playerTextureString).c_str()))
{
cout << "error";
}
playerSprite.setTexture(playerTexture);
}
void thePlayer::Fire(sf::Time time)
{
sf::Time shotDelay = sf::milliseconds(100);
if(time - lastShot >= shotDelay)
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
Projectile bullet(15, "fireball.png");
bullet.bulletSprite.setPosition(playerSprite.getPosition());
inMotion.push_back(bullet);
}
}
for(int ii = 0; ii < inMotion.size(); ii++)
{
inMotion[ii].moveBullet();
}
}
void thePlayer::Draw(sf::RenderWindow& window)
{
for (int ii = 0; ii < inMotion.size(); ii++)
{
window.draw(inMotion[ii].bulletSprite);
}
window.draw(playerSprite);
}
void thePlayer::Walk()//awsd standart movement
{
int x = 0;
int y = 0;
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
x-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
x+= moveSpeed;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
y-= moveSpeed;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
y+= moveSpeed;
}
playerSprite.move(x, y);
}
class Game
{
public:
void Update(sf::RenderWindow&, sf::Time);
void Start(sf::Time);
sf::Clock clock;
thePlayer player;
private:
};
void Game::Start(sf::Time time)
{
player.Create("block.png");
player.lastShot = time;
}
void Game::Update(sf::RenderWindow& window, sf::Time time)
{
player.Fire(time);
player.Walk();
player.Draw(window);
}
int main()
{
sf::RenderWindow window(sf::VideoMode(1000, 1000), "Menu");
window.setFramerateLimit(60);
Game theGame;
sf::Clock clock;
sf::Time startTime = clock.restart();
theGame.Start(startTime);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(sf::Color::White);
sf::Time elapsed = clock.getElapsedTime();
theGame.Update(window, elapsed);
window.display();
}
return 0;
}
도움을 주셔서 대단히 감사합니다.
편집 : 디버거를 사용하여 시도했지만 아무것도 알아낼 수 없습니다. 코드 블럭 디버깅에 대한 훌륭한 기사 링크가 좋습니다.
답변 해 주셔서 감사합니다. 제 코드가 더 잘 작성 될 수 있다는 것에 동의하지만, 제 질문에 대해서는 대답하지 않습니다. 실제로 프로그램을 중단시키는 원인에 대해 더 깊은 통찰력을 얻었습니다. –
네,하지만 (OSX에서) 코드를 시도했습니다 - 컴파일되고, 키에 따라 플레이어가 움직이지만 총알은 작동하지 않습니다. –