用c语言写一个撒花动画
时间: 2023-11-16 21:03:49 浏览: 89
用C语言写的小动画
4星 · 用户满意度95%
以下是一个简单的撒花动画的 C 代码,使用了 Windows API 实现:
```c
#include <windows.h>
#define MAX_PARTICLES 1000
typedef struct {
float x, y;
float vx, vy;
int life;
COLORREF color;
} Particle;
Particle particles[MAX_PARTICLES];
void update_particles(int width, int height) {
for (int i = 0; i < MAX_PARTICLES; i++) {
Particle* p = &particles[i];
if (p->life <= 0) {
p->x = (float)(rand() % width);
p->y = (float)(rand() % height);
p->vx = 2.0f * ((float)rand() / RAND_MAX) - 1.0f;
p->vy = 2.0f * ((float)rand() / RAND_MAX) - 1.0f;
p->life = 50 + rand() % 50;
p->color = RGB(rand() % 256, rand() % 256, rand() % 256);
} else {
p->x += p->vx;
p->y += p->vy;
p->vx *= 0.98f;
p->vy *= 0.98f;
p->life--;
}
}
}
void draw_particles(HDC hdc) {
for (int i = 0; i < MAX_PARTICLES; i++) {
Particle* p = &particles[i];
if (p->life > 0) {
HBRUSH brush = CreateSolidBrush(p->color);
SelectObject(hdc, brush);
Ellipse(hdc, p->x - 5, p->y - 5, p->x + 5, p->y + 5);
DeleteObject(brush);
}
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
srand(GetTickCount());
int width = 800;
int height = 600;
HWND hwnd = CreateWindow("STATIC", "撒花动画", WS_VISIBLE | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInstance, NULL);
HDC hdc = GetDC(hwnd);
while (true) {
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
return 0;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
update_particles(width, height);
RECT rect;
GetClientRect(hwnd, &rect);
FillRect(hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
draw_particles(hdc);
Sleep(16);
}
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);
return 0;
}
```
这个程序使用了一个 `Particle` 结构体来表示每个粒子,包含了位置、速度、生命和颜色等信息。在 `update_particles` 函数中,每个粒子会根据当前的位置和速度进行更新,同时减少生命值。如果生命值降低到 0,那么这个粒子就会被重新生成在随机位置,并获得一个新的生命值和颜色。在 `draw_particles` 函数中,每个粒子会被画成一个小圆点。
在主函数中,程序进入一个无限循环,每次循环中都会处理消息队列并调用 `update_particles` 和 `draw_particles` 函数。程序会每秒钟刷新 60 次,因为每次循环中都会调用 `Sleep(16)`,即暂停 16 毫秒,这相当于每秒钟刷新 1000 / 16 = 62.5 次,略微超过了我们的目标。
要编译这个程序,可以使用 Visual Studio 或者 MinGW 等工具,在命令行中输入以下命令:
```
gcc -o sahua.exe sahua.c -lgdi32
```
这个命令会将 `sahua.c` 编译成可执行文件 `sahua.exe`,并链接 Windows GDI 库。运行程序后,你就可以看到一个简单的撒花动画了。
阅读全文