EasyX图形化学习(三)

news2024/9/29 19:15:30

1.帧率:

即每秒钟界面刷新次数,下面以60帧为例:

1.数据类型 clock_t:

用来保存时间的数据类型。

2.clock( ) 函数:

用于返回程序运行的时间,无需参数。

3.例子:

先定义所需帧率:

const clock_t FPS = 1000 / 60;

然后定义两个变量,用于表示一次循环运行前后的时间,再用Sleep函数休眠即可。

	while (true)
	{
		startTime = clock();
		//balabala
		freamTime = clock() - startTime;

		if (freamTime < FPS)
		{
			Sleep(FPS - freamTime);
		}
	}

2.图片的加载和输出:

1.定义图片变量:

数据类型IMAGE:保存图片的数据类型。

2.加载图片:

1.loadimage函数:

将图片放到图片变量中。

loadimage(&图片变量 , 图片地址,图片宽度,图片高度);

2.图片地址:

(1)绝对路径:

复制图片地址 --- 将所有 / 变为 // 防止转义 

注:如果图片格式不对,打开画图,拖进去后再另存为,选择 jpg 格式即可。

(2)相对路径:(推荐,通用性好)

只要图片所在文件与 vs main.cpp 在一个路径下,即可直接 “所在文件夹 \\ 图片名”。

3.输出图片:

putimage(x , y , &图片变量);

4.透明贴图:

(1)先绘制掩码图:

(2)在putimage函数中添加参数:

掩码图为NOTSRCERASE,原图为SRCERASE。

(3)将原图和掩码图输出到同一位置:

例:

	//透明图贴图
	IMAGE img_plane[2];
	loadimage(img_plane, "assets\\plane_mask.jpg");
	loadimage(img_plane + 1, "assets\\plane.jpg");

	putimage(50, 50, img_plane, NOTSRCERASE);
	putimage(50, 50, img_plane+1, SRCERASE);

5.精灵表动画:

首先需要一张包含全部动画帧的图片:

然后设置切帧的参数:

	int imgSize = 32;//每帧的尺寸
	int frames = 7;//总共有多少帧
	int speed = 200;//多少毫秒切换一张
	int index = 0;//贴哪一张图

putimage函数有重载版本:

void putimage(int dstX, int dstY, int dstWidth, int dstHeight, 
const IMAGE *pSrcImg, int scrX, int scrY)

其中srcX和srcY是图片中坐标,表示你要剪切的图片的左上角坐标。

综上:即可实现动画

	index = (clock() / speed) % frames;
	putimage(250, 250, imgSize, imgSize, &img_sheet, index * imgSize, 0);

3.播放音乐:

1.头文件:

首先需要包含头文件:

#include<stdio.h>
#include<Windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

2.播放:

使用 mciSendString 函数(多媒体控制函数):

我们只需要改变第一个参数,其他置为0或NULL即可:

先open+音频路径,再play+音频路径

	mciSendString("open assets/That-Girl.mp3", NULL, 0, NULL);
	mciSendString("play assets/That-Girl.mp3", NULL, 0, NULL);

3.音频地址起别名:

音频可以用 alias 关键字起别名,加在音频路径的后面:

	mciSendString("open assets/That-Girl.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm", NULL, 0, NULL);

如上面bgm就是别名。

注:如果同时播放两个音乐,不能用同样的别名。

4.调整音量:

将第一个参数改为:

setaudio 音频地址 volume to 音量(范围0-1000)

mciSendString("setaudio bgm volume to 100", NULL, 0, NULL);

5.如果mciSendString调整失败如何查看错误:

mciSendString函数有一个返回值,返回MCIERROR类型,成功返回零,失败返回非0。

mciGetErrorString函数可将错误信息放进一个字符数组里。

	MCIERROR ret = mciSendString("setaudio bgm volume 100", NULL, 0, NULL);
	if (ret != 0)
	{
		char err[100] = { 0 };
		mciGetErrorString(ret, err, sizeof(err));//获取错误信息
		puts(err);//打印错误信息
	}

6.循环播放:

正常播放只播放一次,如果想循环播放:

在 play 的后面加一个 repeat(注:对音乐格式有要求)

mciSendString("play bgm repeat", NULL, 0, NULL);

7.封装音乐播放函数:

void playBackgroundMusic(const char* music,bool isrepeat = false,int volume = -1)
{
	static int i = 0;//防止使用同一别名
	char cmd[100] = { 0 };
	sprintf(cmd, "open %s alias bgm%d", music,i);
	MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
	if (ret != 0)
	{
		char err[100] = { 0 };
		mciGetErrorString(ret, err, sizeof(err));//获取错误信息
		printf("open : %s", err);//打印错误信息
		return;
	}
	sprintf(cmd, "play bgm%d %s",i,isrepeat?"repeat":"");//判断是否循环播放
	ret = mciSendString(cmd, NULL, 0, NULL);
	if (ret != 0)
	{
		char err[100] = { 0 };
		mciGetErrorString(ret, err, sizeof(err));//获取错误信息
		printf("play : %s", err);//打印错误信息
		return;
	}
	if (volume != -1)//修改音量
	{
		sprintf(cmd, "setaudio bgm%d volume to %d", i, volume);
		ret = mciSendString(cmd, NULL, 0, NULL);
		if (ret != 0)
		{
			char err[100] = { 0 };
			mciGetErrorString(ret, err, sizeof(err));//获取错误信息
			printf("setaudio : %s", err);//打印错误信息
			return;
		}
	}
	i++;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 | 11. 盛最多水的容器

双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…

力扣每日一练(24-1-18)

经验一&#xff1a;不要把问题想复杂 Python&#xff1a; min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#&#xff1a; public int MaxProfit(int[] prices) {i…

MySQL(视图,存储函数,存储过程)

作业1&#xff1a; 作业实现&#xff1a; 首先创建学生表&#xff0c;课程表&#xff0c;以及学生选课表。 CREATE TABLE Student (Sno INT PRIMARY KEY,Sname VARCHAR(20) NOT NULL,Ssex CHAR(1) CHECK (Ssex IN (男, 女)),Sage INT,SDept VARCHAR(20) DEFAULT 计算机 );CRE…

AI小程序添加深度合成类目解决办法

基于文言一心和gpt等大模型做了一个ai助理小程序&#xff0c;在提交“一点AI助理”小程序时&#xff0c;审核如下&#xff1a; 失败原因1 审核失败原因 你好&#xff0c;你的小程序涉及提供提供文本深度合成技术 (如: AI问答) 等相关服务&#xff0c;请补充选择&#xff1a;深度…

骨传导蓝牙耳机怎么使用?使用骨传导耳机对人体有没有伤害?

骨传导蓝牙耳机的使用方法和传统的入耳式蓝牙耳机使用方法相差无几&#xff0c;都是通过蓝牙来进行连接使用&#xff0c;但骨传导耳机会自带内存&#xff0c;所以在此前提上可以存储音乐独立使用&#xff0c;比传统的入耳式蓝牙耳机使用更方便一些。 那么使用骨传导耳机会不会对…

【方案】世微AP51656 电流采样降压恒流驱动 60V3A LED灯 SOT89-5

1&#xff0c;方案应用&#xff1a;3A输出 LED灯BOM表 2&#xff0c;方案应用&#xff1a;3A输出 LED灯线路图 3&#xff0c;产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED输入电压范围从 5 V 到 60V&#xff0c;输出电流 可…

17.自主练习

一、建表 1、建库、建表 # 创建数据库 create database mysql_exampleTest; use mysql_exampleTest; # 学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_birth VARCHAR(20) NOT NULL DEFAULT , s_sex VARCHAR(10) NOT NULL…

油猴脚本注入js获取DY作品数据

油猴脚本的执行时机: 元素还未生成 https://bbs.tampermonkey.net.cn/thread-3843-1-1.html 而在控制台执行时, 通常元素已经生成 逻辑就是在网页每次发送请求时, 拦截它请求的响应数据作操作; 所以当用户作品很多时, 也需要一直滚动到全部作品请求加载完成, 触发下载 &#…

数据库经典面试题

习题一 1.1 创建表 ①创建Student表 mysql> create table Student ( -> Sno int primary key, -> Sname varchar(255), -> Ssex varchar(10), -> Sdept varchar(50) -> ); Query OK, 0 rows affected (0.01 sec) ②创建Course表 mysql…

树莓派4B +Ubuntu20.04+ROS1的使用(2)

首先确定一下主机与从机的ip地址&#xff08;非常重要&#xff09; 在这次实验中&#xff0c;主机是一台Ubuntu20.04.03系统的台式机&#xff0c;我们间通过这台准备来远程遥控树莓派上的ros1系统&#xff0c;它的ip地址是192.168.230.181 从机是一台搭载Ubuntu20.04桌面版ro…

项目管理十大知识领域之项目人力资源管理

一、项目人力资源管理的概述 作为项目管理的重要组成部分&#xff0c;项目人力资源管理旨在有效管理和利用项目团队的人力资源&#xff0c;以实现项目目标。它涵盖了对人员的招聘、培训、激励和绩效管理等方面&#xff0c;旨在确保项目团队的高效运转和成员的专业发展。项目人…

录课视频太大怎么办?3种方法一键瘦身~

录制视频是现代人常用的一种记录生活的方式&#xff0c;但是视频文件大小往往会很大&#xff0c;不利于存储和分享。为了解决这个问题&#xff0c;我们需要使用视频压缩软件来压缩视频文件大小&#xff0c;以便更方便地存储和分享。 方法一&#xff1a;嗨格式压缩大师 嗨格式压…

el-tree获取当前选中节点及其所有父节点的id(包含半选中父节点的id)

如下图,我们现在全勾中的有表格管理及其下的子级,而半勾中的有工作台和任务管理及其子级 现在点击保存按钮后,需要将勾中的节点id及该节点对应的父节点,祖先节点的id(包含半选中父节点的id)也都一并传给后端,那这个例子里就应该共传入9个id,我们可以直接将getCheckedK…

【b站咸虾米】chapter4_vue组件_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 四、vue组件 uni-app官网 …

【面试】测试/测开(ING3)

190. 栈和堆在内存管理上的区别 栈 1&#xff09; 栈是由系统自动分配和回收的内存。 2&#xff09;栈的存储地址是由高地址向低地址扩展的。 3&#xff09;栈是一个先进后出的结构。 4&#xff09;栈的空间大小是一个在编译时确定常数&#xff0c;即栈的大小是有限制的&#x…

Windows连接Ubuntu桌面

平时Windows连接Ubuntu服务器都是使用Xshell、FinalShell等工具&#xff0c;但这些连接之后只能通过终端进行操作&#xff0c;无法用桌面方式与服务器交互。 本文介绍如何通过工具&#xff0c;实现Window连接远程Ubuntu服务器&#xff0c;并使用桌面方式交互。 系统版本&#x…

C/C++ BM5 合并K个已排序的链表

文章目录 前言题目1 解决方案一1.1 思路阐述1.2 源码 2 解决方案二2.1 思路阐述2.2 源码 总结 前言 在接触了BM4的两个链表合并的情况&#xff0c;对于k个已排序列表&#xff0c;其实可以用合并的方法来看待问题。 这里第一种方法就是借用BM4的操作&#xff0c;只不过是多个合…

Redis内部数据结构ziplist详解

什么是ziplist Redis官方对于ziplist的定义是&#xff08;出自ziplist.c的文件头部注释&#xff09;&#xff1a; The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores both strings and integer values, where …

three.js 缓动算法.easing(渐入相机动画)

效果&#xff1a;淡入&#xff0c;靠近物体 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div c…

go实现判断20000数据范围内哪些是素数(只能被1和它本身整除的数),采用多协程和管道实现

实现一个并发程序&#xff0c;用于寻找 20000 以内的所有素数。使用了 Goroutines 和 Channels 来分发和处理任务&#xff0c;并通过 WaitGroup&#xff08;实现为 exitChan&#xff09;来同步 Goroutines 的退出。 一.GO代码 package mainimport ("fmt""time…