如何覆盖原来的图片?

0

我写了一个迷宫游戏,画图代码如下

void show()
{
	BeginBatchDraw();
 	for (int i = 0; i < 8; i++)
	{		
		for (int j = 0; j < 8; j++) {
			if (a[i][j] == 1)
				putimage(i * 75, j * 75, &kg, NOTSRCERASE);
			else if (a[i][j] == 0)
			 	putimage(i * 75, j * 75, &kk, NOTSRCERASE);
			else if(a[i][j]== 5)
				putimage(i * 75, j * 75, &people, NOTSRCERASE);
			FlushBatchDraw();
		}
		
	}	
	EndBatchDraw();
	Sleep(100);
}

这段代码我想实现的是,当人移动时,原来那个图片会被覆盖住,可是运行结果似乎是随机的,有时能覆盖住,有时不能,这样到达终点后,有好几个关于人的图片,不是我想要的,该如何解决?


还有几个小问题请教
1,屏幕仍然会闪烁,可是我加了flush,end这些函数啊?
2,按键控制移动的时候,按一下,会走好几下,这个该怎么办?
3,不贴图,直接打印出数(1,0,5)来表达迷宫的时候,运行是正确的,说明移动函数应该没有问题,但我发现不贴图和贴图之后,方向键反了,原本控制上下的变成了左右键,控制左右的变成了上下键,这是为什么?

以下是完整代码:

#include<iostream>
#include<stack>
#include<stdlib.h>
#define  _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<conio.h>
# include<math.h>
# include< stdio.h>
#include<windows.h>
#include<time.h>
# pragma comment(lib,"Winmm.lib")
#define High 600          //游戏画面尺寸
#define Width 600

IMAGE kg, kk;        //障碍和通路图片
IMAGE people;		//人的图片
int a[8][8] = { {1,1,1,1,1,1,1,1},{1,5,0,1,0,0,1,1},{1,0,0,1,0,0,0,1},{1,1,0,0,0,1,0,1},{1,0,0,1,1,1,0,1},{1,0,0,0,0,0,1,1},{1,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1} };
int x=1, y=1;
void show();
void updateWithInput();
void starup();
int main() {
	starup();
	x = 1;
	y = 1;
	a[x][y] = 5;//设置起点,"5"表示人,"1"表示障碍,"0"表示通路
	show();//显示画面 
	while (x!=6||y!=6)//终点为(6,6) 
	{	 
		updateWithInput();//按键控制
	}
	Sleep(5000);
	EndBatchDraw();
	closegraph();	
}
void updateWithInput()
{			
	if ((GetAsyncKeyState(VK_LEFT) & 0x8000))	//左方向键
	{
		if (a[x][y-1] != 1) {
			a[x][y] = 0;
			a[x ][y-1] = 5;
			y--; 
			show();
			show();
		}
	}

	if ((GetAsyncKeyState(VK_RIGHT) & 0x8000))//右方向键
	{
		if (a[x][y+1] != 1) {
			a[x][y] = 0;
			a[x ][y+1] = 5;
			y++;
			show();
			show();
		}
	}

	if ((GetAsyncKeyState(VK_UP) & 0x8000))//上方向键
	{
		if (a[x-1][y ] != 1) {
			a[x][y] = 0;
			a[x-1][y ] = 5;
			x--;
			show();
			show();
		}
	}

	if ((GetAsyncKeyState(VK_DOWN) & 0x8000))//下方向键
	{
		if (a[x+1][y] != 1) {
			a[x][y] = 0;
			a[x+1][y] = 5;
			x++;
			show();
			show();
		}
	}
}

		

void show()
{	
 	for (int i = 0; i < 8; i++)
	{		
		for (int j = 0; j < 8; j++) {
			if (a[i][j] == 1)
				putimage(i * 75, j * 75, &kg, NOTSRCERASE);
			else if (a[i][j] == 0)
			 	putimage(i * 75, j * 75, &kk, NOTSRCERASE);
			else if(a[i][j]== 5)
				putimage(i * 75, j * 75, &people, NOTSRCERASE);
		}
	}
	FlushBatchDraw();
}
void starup() {
	initgraph(Width, High);
	BeginBatchDraw();
	HWND hwnd = GetHWnd();
	SetWindowText(hwnd, "迷宫游戏");
	
	loadimage(&kk, ".\\kk.jpg");;
	loadimage(&kg, ".\\kg.jpg");

	loadimage(&people, ".\\people.jpg");
	
}
ava
大侠

2020-12-13

0

BeginBatchDraw() 只在 initgraph 后面执行一次就好,EndBatchDraw() 在 closegraph 前面执行一次。不要放到函数里反复执行。

FlushBatchDraw() 不要放到循环里面。等所有的都绘制完毕之后,再调用一次 FlushBatchDraw() 进行显示刷新。

你这个游戏没必要很高的刷新率,你的主循环里面最好加上 Sleep 延时,帧率控制在 60fps 足够。

ava
慢羊羊

2020-12-14

@慢羊羊 解决了,非常感谢 - 大侠 2020-12-19
@大侠 看我修改后的答案。 - 慢羊羊 2020-12-15
更准确地说是二维数组的行、列互换了,比如我先打印数字,再贴图,可以发现它们行、列互换了,运行图片:https://www.cnblogs.com/ningfan/p/14141513.html - 大侠 2020-12-19
@慢羊羊 已经修改,现在只差多个人影的问题无法解决了 - 大侠 2020-12-18
@慢羊羊 谢谢,经过我思考,我发现程序和我想的不一样,我想的是按键才刷新,而原来的程序是一直在刷新,所以我改了一下,把show函数放到了按键控制里面去了。 - 大侠 2020-12-15
@慢羊羊 虽然已经解决了,但我还是问按键为什么会相反,不然写BFS这样的自动寻路的时候,会很反常识,写起来会很绕。 - 大侠 2020-12-19
非常感谢,我按照您说的进行了修改,但似乎还是闪烁。所有功能代码已经贴上,show函数的注释表示的是用数来表示迷宫的情况,希望您能帮我解答,谢谢。 - 大侠 2020-12-14
@慢羊羊 但产生了另一个问题,就是按一下,会黑屏,再按一下,才会出现画面,但移动是移动了二下,另外多个人影的问题还是没有解决,由于我不知道如何在这里发图片,我把运行图片发到了这里https://www.cnblogs.com/ningfan/p/14141513.html - 大侠 2020-12-15
再一次感谢您,希望能够得到解答 - 大侠 2020-12-15
搞明白了,是我把putimage的前二个参数,搞反了,非常感谢 - 大侠 2020-12-19
@大侠 putimage 的时候 去掉最后一个参数 NOTSRCERASE 试试。 - 慢羊羊 2020-12-19
@大侠 你的代码格式很乱,至少你应该把缩进写对。 - 慢羊羊 2020-12-18