我正在使用SFML进行2D游戏。我相信你知道那场比赛。这场比赛有2个盖帽和1个球,你必须把球击回敌人。你只能用那个挡块上下移动。但是我遇到了很多问题。我希望我的球能够表现得真实(物理上),特别是当它碰到阻挡时。
第二个问题是我不知道如何解决敌人阻挡的运动,因为我想对抗计算机。暂时我已经解决了这个问题:
if ball is above block:
move block up
if ball is under block:
move block down
第三个是我不知道如何检查球是否击中阻挡。我已经尝试过SFML页面中的代码,但它根本不起作用。
int main()
{
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
float rychlost=5.0f;
float rychlostKruhX=5.0f;
float rychlostKruhY=5.0f;
int okraj=28;
int vyskaBloku,sirkaBloku;
const int polomerKruhu=20;
const int FPS=60;
const int sirkaOkna=800;
const int vyskaOkna=600;
int blockX,blockY;
RenderWindow window(VideoMode(sirkaOkna, vyskaOkna), "SFML works!",sf::Style::Default, settings);
window.setFramerateLimit(FPS);
Texture pozadie;
if (!pozadie.loadFromFile("background.jpg")){
return EXIT_FAILURE;
}
Sprite pozadieSprite(pozadie);
Texture block;
if (!block.loadFromFile("block.jpg")){
return EXIT_FAILURE;
}
//ball
CircleShape kruh(polomerKruhu);
kruh.setFillColor(Color::White);
kruh.setPosition(sirkaOkna/2-polomerKruhu/2,vyskaOkna/2-polomerKruhu/2);
vyskaBloku=block.getSize().y;
sirkaBloku=block.getSize().x;
Sprite blockSpriteLeft(block);
Sprite blockSpriteRight(block);
//pozicia blokov
blockSpriteLeft.setPosition(okraj,vyskaOkna/2-vyskaBloku/2);
blockSpriteRight.setPosition(sirkaOkna-(okraj*2),vyskaOkna/2-vyskaBloku/2);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}
window.clear();
window.draw(pozadieSprite);
//UP
if (Keyboard::isKeyPressed(Keyboard::Up))
{
blockSpriteLeft.move(0, -rychlost);
blockY=blockSpriteLeft.getPosition().y;
//ak ide mimo okna
if (blockY<0){
blockSpriteLeft.setPosition(okraj,0);
}
}
//DOWN
if (Keyboard::isKeyPressed(Keyboard::Down))
{
blockSpriteLeft.move(0, rychlost);
blockY=blockSpriteLeft.getPosition().y;
//if block is out of window
if (blockY>vyskaOkna-vyskaBloku){
blockSpriteLeft.setPosition(okraj,vyskaOkna-vyskaBloku);
}
}
//movement of ball
kruh.move(-rychlostKruhX,rychlostKruhY);
//if ball goes out of window
if (kruh.getPosition().y<0){rychlostKruhY=-rychlostKruhY;}
if (kruh.getPosition().y>vyskaOkna-polomerKruhu*2){rychlostKruhY=-rychlostKruhY;}
//if the ball is behind the block
if (kruh.getPosition().x < okraj) {break;}
if (kruh.getPosition().x > sirkaOkna-2*okraj) {break;}
//movement of right block (PC)
if (kruh.getPosition().y > blockSpriteRight.getPosition().y) {blockSpriteRight.move(0,rychlost);}
if (kruh.getPosition().y < blockSpriteRight.getPosition().y) {blockSpriteRight.move(0,-rychlost);}
//if right block goes out of window
if (blockSpriteRight.getPosition().y < 0 ) { blockSpriteRight.setPosition(sirkaOkna-2*okraj,0);}
if ((blockSpriteRight.getPosition().y + vyskaBloku )> vyskaOkna ) { blockSpriteRight.setPosition(sirkaOkna-2*okraj,vyskaOkna-vyskaBloku);}
window.draw(kruh);
window.draw(blockSpriteLeft);
window.draw(blockSpriteRight);
window.display();
}
return 0;
}