用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移动速度慢下来的办法呢?
不知道你这个问题是否已经解决, 如果还没有解决的话: