Я делаю простую игру Bullet Hell в C ++ и SFML, где вы используете мышь для управления игроком и нажимаете на цели, чтобы увеличить счет. Каждый раз, когда на цель нажимают, она должна вызывать пулю в отдаленном от игрока месте со случайным углом перемещения. пули отскакивают от края окна и не go удаляются.
Я действительно застрял в том, как это сделать. Метод, который я мог бы попробовать, - сохранить данные пули в векторе , что я пока не знаю, как именно это сделать, но как я могу обновить позицию каждой отдельной пули, как только она там окажется? Тогда как я могу заставить каждую пулю сталкиваться с игрой?
Вот мой код, я отметил некоторые сомнительные области с комментариями многих вопросительных знаков:
#include <ctime>
#include <sstream>
#include <vector>
using namespace sf;
//?????????????????????
class enemy{
public:
int xpos, ypos, xvel, yvel;
void spawnEnemy(){
CircleShape enemyc(10);
enemyc.setFillColor(Color::Red);
}
};
//?????????????????????
int main(){
RenderWindow window(VideoMode(800, 600), "SFMLbullet", Style::Close);
window.setMouseCursorVisible(false);
window.setFramerateLimit(60);
srand(time(0));
//?????????????????????
std::vector<enemy> enemies;
//?????????????????????
//define target
int targetx = rand() % 580 - 20;
int targety = rand() % 580 - 20;
bool tregen = false;
CircleShape targetc(20);
targetc.setFillColor(Color::Green);
//define player
CircleShape playerc(10);
playerc.setFillColor(Color::Blue);
playerc.setOrigin(10,10);
//define score count
int score = 0;
std::stringstream scoreconv;
Font scorefont;
scorefont.loadFromFile("SLANT.TTF");
Text scorecount;
scorecount.setFont(scorefont);
scorecount.setCharacterSize(50);
scorecount.setFillColor(Color::White);
scoreconv.str("0");
//main Loop
while(window.isOpen()){
//when target is clicked
if(Mouse::isButtonPressed(Mouse::Left) && !tregen && playerc.getGlobalBounds().intersects(targetc.getGlobalBounds())){
//generate new target
targetx = rand() % 780 - 20;
targety = rand() % 580 - 20;
//add score
score++;
scoreconv.str("");
scoreconv << score;
//?????????????????????
enemy bullet;
enemies.push_back(bullet);
//?????????????????????
tregen = true;
}
//don't regenerate target rapidly
if(!Mouse::isButtonPressed(Mouse::Left)){
tregen = false;
}
//window events
Event event;
while(window.pollEvent(event)){
if(event.type == Event::Closed) window.close();
}
window.clear(Color::Black);
//draw target
targetc.setPosition(targetx, targety);
window.draw(targetc);
//draw player
playerc.setPosition(Mouse::getPosition(window).x, Mouse::getPosition(window).y);
window.draw(playerc);
//?????????????????????
//DRAW BULLETS HERE, ideally with enemyc.move()
//?????????????????????
//score count
scorecount.setString(scoreconv.str());
window.draw(scorecount);
window.display();
}
return 0;
}