• ege demo


    #include <ege.h>
    
    const float base_speed = 0.5f;
    const float randspeed = 1.5f;
    
    //自定义函数,用来返回一个0 - m之间的浮点数
    float myrand(float m)
    {
        return (float)(ege::randomf() * m);
    }
    
    //定义一个AniObj类,这个与前一个除了函数名,和update加了返回值以外没有变化
    class AniObj
    {
    public:
        //初始化,设置坐标,速度方向,透明度,创建IMAGE等
        AniObj()
        {
            _x = myrand((float)ege::getwidth());
            _y = myrand((float)ege::getheight());
            _r = ege::random(20) + 20;
            _dx = myrand(randspeed) + base_speed;
            _dy = myrand(randspeed) + base_speed;
            _dx = _dx * float(ege::random(2) * 2.0 - 1);
            _dy = _dy * float(ege::random(2) * 2.0 - 1);
            _alpha = ege::random(250) + 2;
            _da = ege::random(2) * 2 - 1;
    
            _img = ege::newimage(_r * 2, _r * 2);
    
            ege::setcolor(ege::hsv2rgb(myrand(360.0f), 1.0f, 1.0f), _img);
            ege::setfillcolor(ege::hsv2rgb(myrand(360.0f), 1.0f, 1.0f), _img);
    
            ege::fillellipse(_r, _r, _r, _r, _img);
        }
    
        //释放这个对象时调用
        ~AniObj()
        {
            ege::delimage(_img);
        }
    
        //更新位置等相关属性
        int update()
        {
            // 当前位置 + 速度
            _x += _dx;
            _y += _dy;
            if (_x < 0) _dx = myrand(randspeed) + base_speed; //碰左
            if (_y < 0) _dy = myrand(randspeed) + base_speed; //碰上
            if (_x >= ege::getwidth() - _r * 2) _dx = -(myrand(randspeed) + base_speed); //碰右
            if (_y >= ege::getheight() - _r * 2) _dy = -(myrand(randspeed) + base_speed); //碰下
    
                                                                                          // 改变alpha值
            _alpha += _da;
            if (_alpha <= 0)    _da = 1;
            if (_alpha >= 0xFF) _da = -1;
            return 0;
        }
    
        //根据属性值绘画
        void render()
        {
            ege::putimage_alphatransparent(NULL, _img, (int)_x, (int)_y, ege::BLACK, (unsigned char)_alpha);
        }
    
        void onkey(int key)
        {
            //
        }
    
    private:
        float _x, _y;
        int _r;
        float _dx, _dy;
        int _alpha, _da;
        ege::PIMAGE _img;
    };
    
    class Scene
    {
    public:
        //初始化,参数为对象个数
        Scene(int nAniObj)
        {
            m_cntObj = nAniObj;
            m_pobj = new AniObj[m_cntObj];
            m_pause = 0;
            m_endscene = 0;
        }
        ~Scene()
        {
            delete[] m_pobj;
        }
        int update()
        {
            // 非暂停状态才更新
            if (m_pause == 0)
            {
                for (int n = 0; n < m_cntObj; ++n)
                {
                    m_pobj[n].update();
                }
            }
            return m_endscene;
        }
        void render()
        {
            for (int n = 0; n < m_cntObj; ++n)
            {
                m_pobj[n].render();
            }
        }
        void onkey(int key)
        {
            if (key == 'P' || key == 'p') //按下P键就在播放与暂停之间转换
            {
                m_pause = !m_pause;
            }
            if (key == VK_ESCAPE) //如果是ESC键,就标记为退出场景,VK_ESCAPE是SDK定义的宏
            {
                m_endscene = 1;
            }
        }
    private:
        AniObj* m_pobj;
        int m_cntObj;
        int m_pause;
        int m_endscene;
    };
    
    void mainloop()
    {
        Scene scene(30); //定义场景,初始化参数为30
    
        for (; ege::is_run(); ege::delay_fps(60))
        {
            while (ege::kbhit())
            {
                int key = ege::getch();
                scene.onkey(key); //所有按键消息发送给scene
            }
            if (scene.update()) //如果update返回非0表示场景结束,这时退出主循环
            {
                break;
            }
    
            ege::cleardevice();
            scene.render();
        }
    }
    
    int main(void)
    {
        ege::setinitmode(ege::INIT_ANIMATION);
        // 图形初始化,窗口尺寸640x480
        ege::initgraph(640, 480);
        // 随机数初始化,如果需要使用随机数的话
        ege::randomize();
        // 程序主循环
        mainloop();
        // 关闭绘图设备
        ege::closegraph();
        return 0;
    }
  • 相关阅读:
    Java多线程的两种实现方式
    Java实现验证码的产生和验证
    web前端对上传的文件进行类型大小判断的js自定义函数
    Java前端Rsa公钥加密,后端Rsa私钥解密(支持字符和中文)
    了解火爆的区块链和比特币
    Java中调用JavaScript方法
    Java读取文件的问题
    SpringBoot热部署简介
    Java使用Jetty实现嵌入式Web服务器及Servlet容器
    『安全工具』目录扫描 DirBuster AND 御剑
  • 原文地址:https://www.cnblogs.com/sea-stream/p/10508237.html
Copyright © 2020-2023  润新知