C语言写流星雨代码

目录

需要包含的头文件

图片素材的路径

初始化背景图片

报错怎么解决? 

初始化流星雨

放置流星雨图片

让流星雨动起来

总不能让流星砸到地面吧

是不是应该再来一点背景音乐?

所有代码


需要包含的头文件

IMAGE img;//创建流星雨的图片变量

void load()
{
	loadimage(&img, "./1.jpg", 40, 40);//加载流星雨的图片,大小为40*40
}

在此之前,我们需要包含一些头文件才能正常使程序运行起来

下面是需要的头文件

#include <stdio.h>//不用多说,肯定需要
#include <time.h>//随机函数需要用到
#include <easyx.h>//这是一个图形用户界面,流星雨的展示就依靠这个头文件
#include <conio.h>//这是一个控制台的头文件,不一定需要,但可以根据用户按下的按键来决定程序是否继续运行

在这些头文件中,easyx的头文件不一定所有人的电脑上都会有,所以如果没有的可以去官网下载一个,下面是官网的链接:

EasyX Graphics Library for C++

进去之后,我们点击下载按钮

然后跟着步骤安装就好了

图片素材的路径

这里所有图片素材都是相对路径,如果运行没有画面请检查路径是否正确!!

初始化背景图片

在此之前我们可以先加载一个漂亮的背景图片

就像这样:

IMAGE img_bk;//创建一个名为img_bk的图片变量

int main()
{
	initgraph(1100, 700,1);//初始化一个1100*700的窗口,1表示需要带有控制台
	cleardevice();//防止闪屏
	loadimage(&img_bk, "./bk.jpg", getwidth(), getheight());//加载图片
	putimage(0, 0, &img_bk);//放置图片
	system("pause");
	return 0;
}

报错怎么解决? 

也许你的VS会在写loadimage和putimage的时候报错,此时不要慌,如下是解决办法:

点击项目->最后一个属性,然后出现以下界面 

这样子设置就不会报错了,当然改为未设置也是可以的

所有工作完成之后就可以来运行看看效果了

此时我们已经成功添加了背景图片 

初始化流星雨

定义一个流星雨首先明确数据类型是一个结构体类型

然后是流星雨的坐标,流星雨的速度

所以我们如下定义并初始化一个流星雨

struct meteor
{
	int x;
	int y;
	int speed;
};

void init(meteor* ps,int x,int y,int speed)
{
	ps->x = x;
	ps->y = y;
	ps->speed = speed;//x,y,speed均是需要传进来的参数
}
void draw(meteor* ps)
{
	putimage(ps->x, ps->y, &img, SRCPAINT);//放置流星雨的图片,格式为SRCPAINT
}

放置流星雨图片

 下面我们先来初始化并放置一个流星的图片看看效果

int main()
{
	initgraph(1100, 700,1);//初始化一个1100*700的窗口,1表示需要带有控制台
	cleardevice();//防止闪屏
	load();
	loadimage(&img_bk, "./bk.jpg", getwidth(), getheight());//加载图片
	putimage(0, 0, &img_bk);//放置图片
	meteor m;
	init(&m, 0, 0, 5);
	draw(&m);

	system("pause");
	return 0;
}

这样一个流星雨就放置完成了,不过一个肯定不够,我们可以刚开始就初始化多一点,而且我们可以让其初始化的位置随机

为了让流星雨不要出现得太突兀,我们可以把初始化的坐标放在坐标轴的负半轴,就像这样:

#define NUM 30

for (int i = 0; i < NUM; i++)
{
	init(m+i, rand() % 1100 - 300, rand() % 30 - 20, rand() % 5 + 1);//x和y随机,速度也随机初始化
}
for (int i = 0; i < NUM; i++)
{
	draw(m+i);
}

 这样我们就初始化并放置了30个流星雨的图片,当然这样我们是看不见的,因为大部分流星雨都在屏幕外面,外面还需要让流星雨动起来

让流星雨动起来

下面我们就让流星雨动起来

void move(meteor* ps)
{
	ps->x += ps->speed;
	ps->y += ps->speed;//让两个坐标轴分别加上速度的偏移量就可以使流星雨向斜下方运动了
}
	while (1)//需要一个循环来使图片不停放置和移动,每循环一次可以理解为一帧动画
	{
		cleardevice();
		
		BeginBatchDraw();
		putimage(0, 0, &img_bk);//放置图片
		for (int i = 0; i < NUM; i++)
		{
			draw(m+i);
			move(m+i);
			
		}
		Sleep(100);//睡眠100毫秒,防止流星雨太快
		EndBatchDraw();//使用双缓冲画图,防止闪屏
	}

总不能让流星砸到地面吧

我们可以让流星雨的y坐标达到一定值时把流星再重新初始化一下,就可以让流星雨不停地下落了

void move(meteor* ps)
{
	ps->x += ps->speed;
	ps->y += ps->speed;//让两个坐标轴分别加上速度的偏移量就可以使流星雨向斜下方运动了
	if (ps->y > 430)
	{
		ps->x = rand() % 1100 - 300;
		ps->y = rand() % 30 - 20;//当流星雨的y坐标超过430的时候,我们将其重新初始化
	}
}

是不是应该再来一点背景音乐?

	mciSendString("open ./1.mp3", 0, 0, 0);//加载音乐
	mciSendString("play ./1.mp3 repeat", 0, 0, 0);//循环播放音乐

所有代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>//不用多说,肯定需要
#include <time.h>//随机函数需要用到
#include <easyx.h>//这是一个图形用户界面,流星雨的展示就依靠这个头文件
#include <conio.h>//这是一个控制台的头文件,不一定需要,但可以根据用户按下的按键来决定程序是否继续运行

IMAGE img_bk;//创建一个名为img_bk的图片变量
IMAGE img;//创建流星雨的图片变量

#define NUM 30

void load()
{
	loadimage(&img, "./1.jpg", 40, 40);//加载流星雨的图片,大小为40*40
}

struct meteor
{
	int x;
	int y;
	int speed;
};

void init(meteor* ps,int x,int y,int speed)
{
	ps->x = x;
	ps->y = y;
	ps->speed = speed;//x,y,speed均是需要传进来的参数
}

void draw(meteor* ps)
{
	putimage(ps->x, ps->y, &img, SRCPAINT);//放置流星雨的图片,格式为SRCPAINT
}

void move(meteor* ps)
{
	ps->x += ps->speed;
	ps->y += ps->speed;//让两个坐标轴分别加上速度的偏移量就可以使流星雨向斜下方运动了
	if (ps->y > 430)
	{
		ps->x = rand() % 1100 - 300;
		ps->y = rand() % 30 - 20;//当流星雨的y坐标超过430的时候,我们将其重新初始化
	}
}

int main()
{
	srand(time(NULL));//随机时间函数
	initgraph(1100, 700,1);//初始化一个1100*700的窗口,1表示需要带有控制台
	cleardevice();//防止闪屏
	load();
	loadimage(&img_bk, "./bk.jpg", getwidth(), getheight());//加载图片
	putimage(0, 0, &img_bk);//放置图片
	meteor m[NUM];
	mciSendString("open ./1.mp3", 0, 0, 0);//加载音乐
	mciSendString("play ./1.mp3 repeat", 0, 0, 0);//循环播放音乐
	for (int i = 0; i < NUM; i++)
	{
		init(m+i, rand() % 1100 - 300, rand() % 30 - 20, rand() % 5 + 1);//x和y随机,速度也随机初始化
	}
	while (1)//需要一个循环来使图片不停放置和移动,每循环一次可以理解为一帧动画
	{
		cleardevice();
		
		BeginBatchDraw();
		putimage(0, 0, &img_bk);//放置图片
		for (int i = 0; i < NUM; i++)
		{
			draw(m+i);
			move(m+i);
			
		}
		Sleep(60);//睡眠60毫秒,防止流星雨太快
		EndBatchDraw();//使用双缓冲画图,防止闪屏
	}

	system("pause");
	return 0;
}

运行一下看看效果怎么样呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528506.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种&#xff0c;有多种&#xff0c;需要对这几种进行判断的时候需要使用Bean Shell。 &#xff08;1&#xff09;首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…

DFS:深搜+回溯+剪枝解决排列、子集问题

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、全排列I . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://全局变量vector<vector<int>> ret;vector<int> path;bool check[6];vector<vector<int>> perm…

虚拟网络设备性能优化

在现代网络架构中&#xff0c;虚拟网络设备扮演着越来越重要的角色&#x1f310;&#xff0c;特别是在云计算☁️和容器化技术&#x1f4e6;广泛应用的背景下。虚拟网络设备如虚拟以太网设备&#xff08;veth&#xff09;、虚拟交换机&#xff08;vSwitch&#xff09;、和虚拟路…

YOLOv9综合指南

YOLOv9是YOLO系列中用于实时目标检测的最新进展&#xff0c;引入了可编程梯度信息&#xff08;PGI&#xff09;和通用高效层聚合网络&#xff08;GELAN&#xff09;等新技术来解决信息瓶颈并提高检测精度和效率。 在这篇文章中&#xff0c;我们研究了 YOLOv9 的一些关键优势。 …

Java并发编程: Java线程组(ThreadGroup)

文章目录 一、介绍二、线程组特性1、关联性&#xff08;1&#xff09;一级关联性&#xff08;2&#xff09;多级关联性 2、自动归属属性3、根线程组 三、线程组作用1、统一异常处理机制 一、介绍 Java线程组&#xff08;ThreadGroup&#xff09;是一种用于组织和管理线程的机制…

【计算机毕业设计】在线商品管理系统的设计与实现——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

代码随想录算法训练营第三十四天| LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

一、LeetCode 1005.K次取反后最大化的数组和 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 状态&#xff1a;已解决 1.思路 还是那个…

基于SpringBoot+vue的在线商城系统+论文+免费远程调试

基于SpringBootvue的在线商城系统034(含源码 数据库文档免费送&#xff09; 开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springb…

【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【热力图系列1 R】多特征相关性分析热力图R语言实现 1.环境准备 library(gplots) library(RColorBrewer) 2.数据示例 ###…

MySQL典型示例

目录 1.使用环境 2.设计表 3.创建表 4.准备数据 5.查询 1.使用环境 数据库&#xff1a;MySQL 8.0.30 客户端&#xff1a;Navicat 15.0.12 2.设计表 假设我们已经建好了一个名为test的数据库。我们添加如下几个表&#xff1a;教师、课程、学生、班级、成绩。实体联系图设…

菜狗学前端之JS高级笔记

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) (免费) JS高级笔记https://download.csdn.net/download/m0_58355897/89102910 一些前提概念 一 什么是js高级 js高级是对js基础语法的一个补充说明&#xff0c;本质…

C语言从入门到实战————文件操作

目录 前言 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3. ⼆进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 5. 文…

DSP报错#10099-D</a> program will not fit into available memory

DSP报错#10099-D程序将无法放入可用内存 问题解决方法后续 问题 开发TMS320Fxxxxx出现以下问题&#xff1a; <a href"file:/D:/TI/ti/ccs/tools/compiler/dmed/HTML/10099.html">#10099-D</a> program will not fit into available memory, or the se…

P5200A泰克P5200A高压差分探头

181/2461/8938产品概述&#xff1a; 特点: 1.3 kV差分1 kV至地&#xff08;每个通道&#xff09;50 MHz带宽50倍/500倍衰减UL认证3111-1IEC 1010认证不再不安全地浮动您的范围出色的信号保真度轻松连接IC和汇流条对用户和DUT安全由9 VDC墙壁适配器供电超量程指示器安全认证可…

rhce复习3

DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听的port。DNS使用的是53端口&#x…

SRIO学习(1)SRIO介绍以及IP核详解

文章目录 一、SRIO介绍1.1、概要1.2、RapidIO与传统嵌入互连方式的比较1.3、串行RapidIO协议&#xff08;SRIO&#xff09; 二、RapidIO协议结构及包格式2.1、逻辑层2.2 传输层2.3 物理层 三、IP核详解3.1、逻辑层3.1.1 I/O端口3.1.2 消息&#xff08;Message&#xff09;端口3…

【云呐】工单管理流程,工单管理怎么处理

工单创建  客户或内部员工在系统中创建工单。工单应包括以下信息&#xff1a;  问题的描述  工单的优先级和紧急程度  相关的客户或内部员工信息  工单的类型或类别  相关的附件或文件 工单分配  工单需要分配给适当的人员或团队来解决。分配过程可能涉及到以下步…

龙蜥社区「人人都可以参与开源」—— 走进“龙蜥社区”感受开源魅力

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 开源这个关键字我相信各位开发者们或多或少都听说过&#xff0c;简单来讲开源就是源码开放&#xff0c;但是不意味着使…

【DM8】间隔分区

是范围分区的一个扩展 如果使用了间隔函数做分区&#xff0c;在数据插入的时候&#xff0c;如果没有合适的分区&#xff0c;数据库会自动创建一个新的分区。 –year往后推两年 SELECT SYSDATE numtoyminterval(2,‘YEAR’); –month往后推两年 SELECT SYSDATE numtoyminterv…