void MyPaint(HDC hdc) { SelectObject(bufdc, bg); BitBlt(mdc, 0, 0, 640, 480, bufdc, 0, 0, SRCCOPY); //重贴背景,没有残影 // 生成5-10之间的随机数 SelectObject(bufdc, res[index[1]]); static int j=0; MyTransparentBlt(mdc, x[1] , y[1], 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255)); SelectObject(bufdc, res[index[2]]); MyTransparentBlt(mdc, x[2] , y[2], 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255)); SelectObject(bufdc, res[index[0]]); MyTransparentBlt(mdc, x[0] , y[0], 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255)); j = j + 100; if (j >= 1500) j = 0; BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY); for(int i=0;i<3;i++){ if(y[i]>250&&flag[i]==0) { x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动 vy = vy -gy+1; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度) y[i] += vy; } else{ flag[i]=1; x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动 vy = vy +gm-1; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度) y[i] += vy; } if(y[i]>400&&flag[i]==1){ srand(time(NULL)); vx=rand()%3-3; vy=0; gy=rand()%3+2; gm=rand()%4+3; for(int m=0;m<3;m++){ x[m]=rand()%210+230; y[m]=rand()%20+250; index[i]=rand()%8; } flag[i]=0; } } //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动 tPre = GetTickCount(); //记录上次的绘图时间 }
时间: 2024-04-27 17:19:23 浏览: 10
这是一个使用C++语言编写的绘图函数,主要功能是绘制一个动态的图像,并且实现了重力加速度、碰撞反弹、随机位置和图片等功能。函数首先选择一个背景图像,然后根据一些参数和数学公式计算出三个物体在屏幕上的位置和速度,并将它们绘制在内存缓冲区中。最后,将内存缓冲区的内容复制到屏幕上,完成图像的绘制。具体细节和实现方法可以结合上下文和代码注释进行理解和分析。
相关问题
void MyPaint(HDC hdc) { SelectObject(bufdc, bg); BitBlt(mdc, 0, 0, 800, 600, bufdc, 0, 0, SRCCOPY); //重贴背景,没有残影 // 随机生成水果的总数 static int j=0; for (int i = 0; i < num; i++) { // 随机生成水果的位置和贴图 SelectObject(bufdc, res[index[i]]); MyTransparentBlt(mdc, x[i], y[i], 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255)); } j = j + 100; if (j >= 1500) j = 0; BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY); for(int i=0;i<3;i++){ if(y[i]>300&&flag[i]==0) { x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动 vy = vy -gy; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度) y[i] += vy; } else{ flag[i]=1; x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动 vy = vy +gm; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度) y[i] += vy; } if(y[i]>550&&flag[i]==1){ num = rand() % 5 + 1; srand(time(NULL)); for(int m=0;m<3;m++){ x[m]=rand()%500+80; y[m]=rand()%50+650; index[m]=rand()%8; } vx=3; vy=0; gy=1.4; gm=1.4; flag[i]=0; } } //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动 tPre = GetTickCount(); //记录上次的绘图时间 }可以帮我添加功能,让图和图之间不会重合吗
可以添加一个碰撞检测的功能,当两个图像的位置重合时,将其中一个图像的位置微调一下,使它们不再重合。可以在每次更新图像位置时,通过比较所有图像之间的距离来检测是否有重合,如果有重合,就将其中一个图像的位置向左或向右微调一些像素,使它们不再重合。以下是修改后的代码:
```
void MyPaint(HDC hdc) {
SelectObject(bufdc, bg);
BitBlt(mdc, 0, 0, 800, 600, bufdc, 0, 0, SRCCOPY); //重贴背景,没有残影
// 随机生成水果的总数
static int j = 0;
for (int i = 0; i < num; i++) {
// 随机生成水果的位置和贴图
SelectObject(bufdc, res[index[i]]);
MyTransparentBlt(mdc, x[i], y[i], 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255));
}
// 检测图像之间是否有重合
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
int dx = abs(x[i] - x[j]);
int dy = abs(y[i] - y[j]);
if (dx < 100 && dy < 100) {
if (x[i] < x[j]) {
x[i] -= 5;
x[j] += 5;
} else {
x[i] += 5;
x[j] -= 5;
}
}
}
}
j = j + 100;
if (j >= 1500)
j = 0;
BitBlt(hdc, 0, 0, 800, 600, mdc, 0, 0, SRCCOPY);
for (int i = 0; i < 3; i++) {
if (y[i] > 300 && flag[i] == 0) {
x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动
vy = vy - gy; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度)
y[i] += vy; //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动
} else {
flag[i] = 1;
x[i] += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动
vy = vy + gm; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度)
y[i] += vy; //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动
}
if (y[i] > 550 && flag[i] == 1) {
num = rand() % 5 + 1;
srand(time(NULL));
for (int m = 0; m < 3; m++) {
x[m] = rand() % 500 + 80;
y[m] = rand() % 50 + 650;
index[m] = rand() % 8;
}
vx = 3;
vy = 0;
gy = 1.4;
gm = 1.4;
flag[i] = 0;
}
}
tPre = GetTickCount(); //记录上次的绘图时间
}
```
nt fruitNum = rand() % 5 + 1;应该写在哪里
这行代码应该写在MyPaint()函数中,用于随机生成当前帧需要绘制的水果数量。具体来说,可以在绘制完背景后,根据这个随机数循环绘制对应数量的水果。下面是修改后的代码片段:
```
void MyPaint(HDC hdc) {
// 绘制背景
SelectObject(bufdc, bg);
BitBlt(mdc, 0, 0, 800, 600, bufdc, 0, 0, SRCCOPY);
// 随机生成水果数量
int fruitNum = rand() % 5 + 1;
// 循环绘制水果
for (int i = 0; i < fruitNum; i++) {
// 随机生成水果的位置和贴图
int index = rand() % 8;
int x = rand() % 600 + 80;
int y = rand() % 50 + 550;
MyTransparentBlt(mdc, x, y, 100, 100, bufdc, 0, j, 100, 100, RGB(255, 0, 255));
}
// 绘制物体等其他代码...
...
}
```
这样就可以在每次调用MyPaint()函数时随机生成不同数量的水果,并且将它们绘制到内存DC中。