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(); //记录上次的绘图时间 }可以帮我添加功能,让图和图之间不会重合吗
时间: 2024-03-06 07:48:34 浏览: 103
MyPaint_new.rar_GDI 矩形_MyPaint_paint_移动 直线
可以添加一个碰撞检测的功能,当两个图像的位置重合时,将其中一个图像的位置微调一下,使它们不再重合。可以在每次更新图像位置时,通过比较所有图像之间的距离来检测是否有重合,如果有重合,就将其中一个图像的位置向左或向右微调一些像素,使它们不再重合。以下是修改后的代码:
```
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(); //记录上次的绘图时间
}
```
阅读全文