easy库加上绘图函数后仍在频闪

用easyx库写游戏,加上了BeginBatchDraw();以及EndBatchDraw();但还是在频闪,想问一下是什么原因以及如何解决呢?
作图在193行开始

#include
#include
#include
#include<Windows.h>
using namespace std;

//图片地址的定义
#define startbackaddress "./startbackground.png"
#define backgroundaddress "./background.jpg"
#define blockaddress "./block.png"
#define playeraddress "./player.png"
#define enemyoneaddress "./enemy1.png"
#define enemytwoaddress "./enemy2.png"
#define dragondoorupaddress "./newdragonup.png"
#define dragondoordownaddress "./newdragondown.png"
#define winbackground "./winground.jpg"
enum DIR {
    up,
    down,
    left,
    right,
};
//函数的声明
void startback();
void setblock();
void setscreen();
bool startgame();
void drawbackground();
void playerwalking();
bool inthestartbox(int x, int y);
bool inthehelpbox(int x, int y);
bool failure();
int win(int score);
void winground();
void enemymove();

class Point {
public:
    int x;
    int y;
};
class OBJECT {
public:
    virtual int eat(int score = 0) = 0;
};
class BLOCK :public Point {
public:
    const int height = 40;
    IMAGE blockpicture;
};
class PLAYER :public Point {
public:
    IMAGE playerimage;
    const int height = 40;
    PLAYER()
    {
        x = 920;
        y = 560;
        loadimage(&playerimage, playeraddress,height, height);
    }
};
PLAYER player;
class ENEMY:public Point,public OBJECT {
public:
    const int height = 40;
    IMAGE enemyimage;
    int leftdirection=0;
    ENEMY(int x, int y,int mode)
    {
        this->x = x;
        this->y = y;
        if(mode==1) loadimage(&enemyimage, enemyoneaddress, height,height);
        else loadimage(&enemyimage, enemytwoaddress, height, height);
        if (mode == 2)leftdirection = 1;
    }
    int eat(int score)
    {
        if ((player.x >= x && player.x <= (x + 40)
            && player.y >= y && player.y <= (y + 40))
            || ((player.x + 40) >= x && (player.x + 40) <= (x + 40)
                && (player.y + 40) >= y && (player.y + 40) <= (y + 40))
            || ((player.x + 40) >= x && (player.x + 40) <= (x + 40)
                && player.y >= y && player.y <= (y + 40))
            || (player.x >= x && player.x <= (x + 40)
                && (player.y + 40) >= y && (player.y + 40) <= (y + 40))) failure();
        return 0;
    }
};
class DRAGONDOOR :public Point,public OBJECT {
public:
    const int height = 40;
    IMAGE doorimage;
    bool exist;
    DRAGONDOOR(int x,int y,int dir)
    {
        exist = true;
        this->x = x;
        this->y = y;
        if(dir==0)
        loadimage(&doorimage, dragondoorupaddress, height, height);
        else loadimage(&doorimage, dragondoordownaddress, height, height);
    }
    int eat(int score)
    {
        if ((player.x >= x && player.x <= (x + 40)
            && player.y >= y && player.y <= (y + 40))
            || ((player.x + 40) >= x && (player.x + 40) <= (x + 40)
                && (player.y + 40) >= y && (player.y + 40) <= (y + 40))
            || ((player.x + 40) >= x && (player.x + 40) <= (x + 40)
                && player.y >= y && player.y <= (y + 40))
            || (player.x >= x && player.x <= (x + 40)
                && (player.y + 40) >= y && (player.y + 40) <= (y + 40)))
        {
            score++;
            return score;
        
        }
        else return 0;
        
    }
};
//利用函数模板判断player碰墙
template T>
bool collision(T* t, PLAYER player, char dir)
{
    if(dir=='w')
    {
        for (int i = 0; i < 218; i++)
        {
            if (player.x > t[i].x && player.x < (t[i].x + t[i].height) && (player.y - 5)>t[i].y && (player.y - 5) <  (t[i].y + t[i].height)
                || (player.x + player.height) > t[i].x && (player.x + player.height) < (t[i].x + t[i].height) && (player.y - 5) > t[i].y && (player.y - 5) < (t[i].y + t[i].height)
                ||player.x==t[i].x && (player.y - 5) > t[i].y && (player.y - 5) < (t[i].y + t[i].height))
                return false;
        }
    }
    if (dir == 's')
    {
        for (int i = 0; i < 218; i++)
        {
            if (player.x > t[i].x && player.x < (t[i].x + t[i].height) && (player.y + 5+player.height)> t[i].y && (player.y +5 + player.height) <(t[i].y + t[i].height)
                || (player.x + player.height) > t[i].x && (player.x + player.height) < t[i].x + t[i].height && (player.y + 5 + player.height) > t[i].y && (player.y + 5 + player.height) < (t[i].y + t[i].height)
                || player.x == t[i].x && (player.y + 5 + player.height) > t[i].y && (player.y + 5 + player.height) < (t[i].y + t[i].height))
                return false;
        }
    }
    if (dir == 'a')
    {
        for (int i = 0; i < 218; i++)
        {
            if ((player.x - 5) > t[i].x && (player.x-5) < (t[i].x + t[i].height) && (player.y) > t[i].y && (player.y ) < (t[i].y + t[i].height)
                || (player.x - 5) > t[i].x && (player.x - 5) < (t[i].x + t[i].height) && (player.y + player.height) > t[i].y && (player.y + player.height) < (t[i].y + t[i].height)
                ||player.y==t[i].y && (player.x - 5) > t[i].x && (player.x - 5) < (t[i].x + t[i].height))
                return false;
        }
    }
    if (dir == 'd')
    {
        for (int i = 0; i < 218; i++)
        {
            if ((player.x + 5 + player.height) > t[i].x && (player.x + 5 + player.height) < (t[i].x + t[i].height) && (player.y) > t[i].y && (player.y) <  (t[i].y + t[i].height)
                || (player.x + 5 + player.height) > t[i].x && (player.x + 5 + player.height) < (t[i].x + t[i].height) && (player.y + player.height) > t[i].y && (player.y + player.height) < (t[i].y + t[i].height)
                ||player.y==t[i].y && (player.x + 5 + player.height) > t[i].x && (player.x + 5 + player.height) < (t[i].x + t[i].height))
                return false;
        }
    }
    return true;
}
//定义类型
const int screenlength = 1000;
const int screenwidth = 640;
BLOCK block[220];
IMAGE background;
ENEMY enemy[4] = {ENEMY(40,160,1),ENEMY(120,320,2),ENEMY(560,120,0),ENEMY(920,200,1)};
DRAGONDOOR    dragonleft(40, 40, 0);
DRAGONDOOR    dragonright(920, 40, 0);
DRAGONDOOR    dragondown(40, 560, 1);
bool direction[4] = { true,true,true,true };

//主函数
int main()
{

    int score = 0;
    initgraph(1000, 640);
    cleardevice();
    startback();
    while (startgame());
    setscreen();
    while (1)
    {
        cleardevice();
        //游戏画面的建立
        BeginBatchDraw();
        drawbackground();
        for (int i = 0; i < 4; i++) putimage(enemy[i].x, enemy[i].y, &enemy[i].enemyimage);
        putimage(player.x, player.y, &player.playerimage);
        if(dragonleft.exist) putimage(dragonleft.x, dragonleft.y, &dragonleft.doorimage);
        if(dragonright.exist) putimage(dragonright.x, dragonright.y, &dragonright.doorimage);
        if(dragondown.exist)putimage(dragondown.x, dragondown.y, &dragondown.doorimage);
        EndBatchDraw();
        //进行人物移动的判断
        if (_kbhit()) playerwalking();
        //跃龙门得分的判断
        score = win(score);
        if (score == 3)
        {
            winground();
            system("pause");
            break;
        }
        //敌人移动
        enemymove();
        //player死亡的判断

    }
    return 0;
}

void startback()
{
    IMAGE startback;
    loadimage(&startback,startbackaddress, 1000, 640);
    putimage(0, 0, &startback);
}
bool startgame()
{
    ExMessage msg;
    if (peekmessage(&msg, EX_MOUSE))
    {
        switch (msg.message)
        {
        case WM_LBUTTONDOWN:
            if(inthestartbox(msg.x,msg.y))
            {
                cleardevice();
                return false;
                break;
            }
        default:
            return true;
            break;
        }
    }
    return true;
}
bool inthestartbox(int x,int y)
{
    if (x > 340 && x < 630 && y>350 && y < 430)return true;
    else return false;
}
bool inthehelpbox(int x, int y)
{
    if (x > 340 && x < 630 && y>455 && y < 530)return true;
    else return false;
}
void setscreen() {
    //设置背景
    loadimage(&background, backgroundaddress, screenlength, screenwidth);
    putimage(0, 0, &background);
    //设定砖块初始值
    setblock();
}
void setblock()
{
    int i = 0;
    //左壁
    for (i = 0; i < 16; i++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 0;
        block[i].y = block[i].height * i;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //右壁
    for (int j = 0; j < 16; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = screenlength - 40;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //上壁
    for (int j = 1; j < 24; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 0;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //下壁
    for (int j = 1; j < 24; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = screenwidth - block[i].height;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //1
    for (int j = 1; j < 8; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 160;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
    block[i].x = 40;
    block[i].y = block[i].height * 3;
    putimage(block[i].x, block[i].y, &block[i].blockpicture);
    i++;
    //2
    for (int j = 3; j < 9; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 80;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //3
    for (int j = 12; j < 15; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 80;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //4
    for (int j = 2; j < 7; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 360;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //5
    for (int j = 2; j < 7; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 440;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //6
    for (int j = 5; j < 10; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 280;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //7
    for (int j = 5; j < 8; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 520;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //8
    for (int j = 12; j < 14; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 160;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //9
    for (int j = 9; j < 14; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 320;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //10
    for (int j = 9; j < 15; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 400;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //11
    for (int j = 1, k = 0, m = 0; j < 6; i++, j++, k++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = (400 - m * 40);
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        if (k % 4 == 0)
        {
            m++;
            j--;
        }
    }
    //12
    for (int j = 1; j < 5; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 240;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
    block[i].x = 280;
    block[i].y = block[i].height * 2;
    putimage(block[i].x, block[i].y, &block[i].blockpicture);
    i++;

    //13
    for (int j = 1; j < 14; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 480;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //14
    for (int j = 3; j < 6; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 440;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //15
    for (int j = 14; j < 24; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 80;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //16
    for (int j = 4; j < 16; i++, j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 640;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //17
    for (int j = 20; j < 24; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 160;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //18
    for (int j = 17, k = 0, m = 0; j < 23; i++, j++, k++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = (440 - m * 40);
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        if (k % 4 == 0)
        {
            m++;
            j--;
        }
    }
    //19
    for (int j = 20; j < 24; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 520;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
    //20
    for (int j = 13; j < 16; i++, j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 720;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //21
    for (int j = 11; j < 14; i++, j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 880;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //22
    for (int j = 5; j < 16; i++, j += 2)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 600;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //23
    for (int j = 4; j < 14; i++, j += 3)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 520;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //24
    for (int j = 3; j < 9; i++, j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = 720;
        block[i].y = block[i].height * j;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
    }
    //25
    for (int j = 19; j < 23; j++)
    {
        loadimage(&block[i].blockpicture, blockaddress, block[i].height, block[i].height);
        block[i].x = block[i].height * j;
        block[i].y = 240;
        putimage(block[i].x, block[i].y, &block[i].blockpicture);
        i++;
    }
}
void drawbackground()
{
    putimage(0, 0, &background);
    for (int i = 0; i < 218; i++)
        putimage(block[i].x, block[i].y, &block[i]. blockpicture);
}
void playerwalking()
{
    switch (_getch())
    {
    case 'w':
    case 72:
        if (collision(block, player, 'w'))
            player.y -= 5;
        break;
    case 's':
    case 80:
        if (collision(block, player, 's'))
            player.y += 5;
        break;
    case 'd':
    case 77:
        if (collision(block, player, 'd'))
            player.x += 5;
        break;
    case 'a':
    case 75:
        if (collision(block, player, 'a'))
            player.x -= 5;
        break;
    }
}

int win(int score)
{
    if (dragonleft.eat(score)&&dragonleft.exist) 
    {
        dragonleft.exist = false;
        score++;
    }
    else if(dragonright.eat(score)&&dragonright.exist)
    {
        dragonright.exist = false;
        score++;
    }
    else if (dragondown.eat(score)&&dragondown.exist)
    {
        dragondown.exist = false;
        score++;
    }
    return score;
}
void winground()
{
    IMAGE winground;
    loadimage(&winground, winbackground, screenlength, screenwidth);
    putimage(0, 0, &winground);
}
void enemymove()
{
    
    if (direction[0])
    {
        if (enemy[0].y < 515)enemy[0].y += 2;
        else direction[0] = false;
    }
    else
    {
        if (enemy[0].y > 155)enemy[0].y -=2;
        else direction[0] = true;
    }
    if (direction[1])
    {
        if (enemy[1].x < 435)enemy[1].x += 2;
        else direction[1] = false;
    }
    else
    {
        if (enemy[1].x > 125)enemy[1].x -= 2;
        else direction[1] = true;
    }
    if (direction[2])
    {
        if (enemy[2].y < 555)enemy[2].y += 2;
        else direction[2] = false;
    }
    else
    {
        if (enemy[2].y > 115)enemy[2].y -= 2;
        else direction[2] = true;
    }
    if (direction[3])
    {
        if (enemy[3].y < 475)enemy[3].y += 2;
        else direction[3] = false;
    }
    else
    {
        if (enemy[3].y > 195)enemy[3].y -= 2;
        else direction[3] = true;
    }
    Sleep(10);
}
bool failure()
{
    return true;
}

641行加入sleep后频闪的特别快,不加的时候虽然也会闪但是闪的频率没有那么高,但是不加sleep的话enemy移动速度会特别快,想问一下有没有解决频闪或者不用sleep让enemy移动速度慢下来的办法呢?

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^