c++小游戏制作03:打砖块

先看效果图:

首先需要先下载安装SFML安装包,这里我下载的是64位的

 然后解压放在一个文件夹下,记好路径

然后要在VS中加入路径

在VC++目录中配置包含目录和库目录

包含目录的路径:D:\SFML-2.5.1\include

库目录的路径:D:\SFML-2.5.1\lib

然后在链接器-输入-添加依赖项中配置以下几个:

sfml-window-d.lib

sfml-system-d.lib

sfml-graphics-d.lib

sfml-audio-d.lib

 

 运行代码时弹出报错

由于找不到sfml-window-d-2.dll,无法继续执行代码。重新安装程序可能会解决此问题。

 这时候我们要把解压的sfml的bin文件夹下的内容,拷贝到当前代码程序的x64/Debug中去。

 再次运行就会发现可以了。

完整代码如下:

#include<SFML/Graphics.hpp>
#include<time.h>

using namespace sf;

bool isCollide(Sprite s1, Sprite s2)
{
	return s1.getGlobalBounds().intersects(s2.getGlobalBounds());
}


int main()
{
	srand(time(0));

	RenderWindow app(VideoMode(520, 450), "Arkanoid Game!");
	app.setFramerateLimit(60);

	Texture t1, t2, t3, t4;
	t1.loadFromFile("./images/block01.png");
	t2.loadFromFile("./images/background.jpg");
	t3.loadFromFile("./images/ball.png");
	t4.loadFromFile("./images/paddle.png");


	Sprite sBackground(t2), sBall(t3), sPaddle(t4);
	sPaddle.setPosition(300, 440);
	sBall.setPosition(300, 300);

	Sprite block[1000];

	int n = 0;
	for (int i = 1; i < 10; i++)
	{
		for (int j = 1; j <= 10; j++)
		{
			block[n].setTexture(t1);
			block[n].setPosition(i * 43, j * 20);
			n++;
		}
	}

	float dx = 6;
	float dy = 5;

	while (app.isOpen())
	{
		Event e;
		while (app.pollEvent(e))
		{
			if (e.type == Event::Closed)
			{
				app.close();
			}
		}

		sBall.move(dx, 0);
		for (int i = 0; i < n; i++)
		{
			if (isCollide(sBall, block[i]))
			{
				block[i].setPosition(-100, 0);
				dx = -dx;
			}
		}
		sBall.move(0, dy);
		for (int i = 0; i < n; i++)
		{
			if (isCollide(sBall, block[i]))
			{
				block[i].setPosition(-100, 0);
				dy = -dy;
			}
		}


		Vector2f b = sBall.getPosition();
		if (b.x < 0 || b.x > 520)
		{
			dx = -dx;
		}
		if (b.y < 0 || b.y > 450)
		{
			dy = -dy;
		}

		if (Keyboard::isKeyPressed(Keyboard::Right))
		{
			sPaddle.move(6, 0);
		}
		if (Keyboard::isKeyPressed(Keyboard::Left))
		{
			sPaddle.move(-6, 0);
		}
		if (isCollide(sPaddle, sBall))
		{
			dy = -(rand() % 5 + 2);
		}


		app.clear();
		app.draw(sBackground);
		app.draw(sBall);
		app.draw(sPaddle);

		for (int i = 0; i < n; i++)
		{
			app.draw(block[i]);
		}
		app.display();

	}

	return 0;
}

首先是界面的显示代码,这里用到了砖块block、背景background、小球ball、踏板paddle。

#include<SFML/Graphics.hpp>
#include<time.h>

using namespace sf;


int main()
{
    srand(time(0));

    RenderWindow app(VideoMode(520, 450), "Arkanoid Game!");
    app.setFramerateLimit(60);

    Texture t1, t2, t3, t4;
    t1.loadFromFile("./images/block01.png");
    t2.loadFromFile("./images/background.jpg");
    t3.loadFromFile("./images/ball.png");
    t4.loadFromFile("./images/paddle.png");


    Sprite sBackground(t2), sBall(t3), sPaddle(t4);
    sPaddle.setPosition(300, 440);
    sBall.setPosition(300, 300);

    Sprite block[1000];

    int n = 0;
    for (int i = 1; i < 10; i++)
    {
        for (int j = 1; j <= 10; j++)
        {
            block[n].setTexture(t1);
            block[n].setPosition(i * 43, j * 20);
            n++;
        }
    }

    while (app.isOpen())
    {
        Event e;
        while (app.pollEvent(e))
        {
            if (e.type == Event::Closed)
            {
                app.close();
            }
        }

        app.clear();
        app.draw(sBackground);
        app.draw(sBall);
        app.draw(sPaddle);

        for (int i = 0; i < n; i++)
        {
            app.draw(block[i]);
        }
        app.display();

    }

    return 0;
}

 然后实现小球的移动

#include<SFML/Graphics.hpp>
#include<time.h>

using namespace sf;


int main()
{
    srand(time(0));

    RenderWindow app(VideoMode(520, 450), "Arkanoid Game!");
    app.setFramerateLimit(60);

    Texture t1, t2, t3, t4;
    t1.loadFromFile("./images/block01.png");
    t2.loadFromFile("./images/background.jpg");
    t3.loadFromFile("./images/ball.png");
    t4.loadFromFile("./images/paddle.png");


    Sprite sBackground(t2), sBall(t3), sPaddle(t4);
    sPaddle.setPosition(300, 440);
    sBall.setPosition(300, 300);

    Sprite block[1000];

    int n = 0;
    for (int i = 1; i < 10; i++)
    {
        for (int j = 1; j <= 10; j++)
        {
            block[n].setTexture(t1);
            block[n].setPosition(i * 43, j * 20);
            n++;
        }
    }


    float dx = 6;
    float dy = 5;
    while (app.isOpen())
    {
        Event e;
        while (app.pollEvent(e))
        {
            if (e.type == Event::Closed)
            {
                app.close();
            }
        sBall.move(dx, dy);
        
        Vector2f b = sBall.getPosition();
        if (b.x < 0 || b.x>520) dx = -dx;
        if (b.y < 0 || b.x>450) dy = -dy;


        app.clear();
        app.draw(sBackground);
        app.draw(sBall);
        app.draw(sPaddle);

        for (int i = 0; i < n; i++)
        {
            app.draw(block[i]);
        }
        app.display();

    }

    return 0;
}

 最后实现来回弹跳

#include<SFML/Graphics.hpp>
#include<time.h>

using namespace sf;

bool isCollide(Sprite s1, Sprite s2)
{
    return s1.getGlobalBounds().intersects(s2.getGlobalBounds());
}


int main()
{
    srand(time(0));

    RenderWindow app(VideoMode(520, 450), "Arkanoid Game!");
    app.setFramerateLimit(60);

    Texture t1, t2, t3, t4;
    t1.loadFromFile("./images/block01.png");
    t2.loadFromFile("./images/background.jpg");
    t3.loadFromFile("./images/ball.png");
    t4.loadFromFile("./images/paddle.png");


    Sprite sBackground(t2), sBall(t3), sPaddle(t4);
    sPaddle.setPosition(300, 440);
    sBall.setPosition(300, 300);

    Sprite block[1000];

    int n = 0;
    for (int i = 1; i < 10; i++)
    {
        for (int j = 1; j <= 10; j++)
        {
            block[n].setTexture(t1);
            block[n].setPosition(i * 43, j * 20);
            n++;
        }
    }

    float dx = 6;
    float dy = 5;

    while (app.isOpen())
    {
        Event e;
        while (app.pollEvent(e))
        {
            if (e.type == Event::Closed)
            {
                app.close();
            }
        }

        sBall.move(dx, 0);
        for (int i = 0; i < n; i++)
        {
            if (isCollide(sBall, block[i]))
            {
                block[i].setPosition(-100, 0);
                dx = -dx;
            }
        }
        sBall.move(0, dy);
        for (int i = 0; i < n; i++)
        {
            if (isCollide(sBall, block[i]))
            {
                block[i].setPosition(-100, 0);
                dy = -dy;
            }
        }


        Vector2f b = sBall.getPosition();
        if (b.x < 0 || b.x > 520)
        {
            dx = -dx;
        }
        if (b.y < 0 || b.y > 450)
        {
            dy = -dy;
        }

        if (Keyboard::isKeyPressed(Keyboard::Right))
        {
            sPaddle.move(6, 0);
        }
        if (Keyboard::isKeyPressed(Keyboard::Left))
        {
            sPaddle.move(-6, 0);
        }
        if (isCollide(sPaddle, sBall))
        {
            dy = -(rand() % 5 + 2);
        }


        app.clear();
        app.draw(sBackground);
        app.draw(sBall);
        app.draw(sPaddle);

        for (int i = 0; i < n; i++)
        {
            app.draw(block[i]);
        }
        app.display();

    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34904125/article/details/125839855