放大镜-第14届蓝桥杯省赛Scratch中级组真题第3题

文章介绍了如何使用Scratch编程实现一个放大镜功能,当文字出现在放大镜内时,文字会自动放大。文章详细讲解了编程思路,包括角色准备、放大镜跟随鼠标移动以及文字放大效果的实现,并提供了两种文字检测方法。文章强调了细节处理和问题分析的重要性,并提供了相关素材和源码的获取途径。
摘要由CSDN通过智能技术生成

 [导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第138讲。

放大镜,本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第3题,题目要求编程创作一个放大镜作品。当任意一个文字出现在放大镜中时, 字体变大,放大镜离开文字后字体恢复原来大小。

先来看看题目的要求吧。

一.题目说明

编程实现:

放大镜。

具体要求:

1). 点击绿旗,角色、背景如图所示(文字角色请自行创建,放大镜角色请自行调整);

2). 鼠标左键点击一次放大镜,放大镜持续跟随鼠标移动;

3). 当任意一个文字出现在放大镜中时, 字体变大,放大镜离开文字后字体恢复原来大小(字体放大后的效果参照下图所示)。

评判标准:

  • 10分:满足"具体要求"中的1);

  • 15分:满足"具体要求"中的2);

  • 25分,满足"具体要求"中的3)。

二.思路分析

先来看看题目提供的素材,如图所示:

这里只有一个放大镜角色,再结合题目的描述,文字角色请自行创建,放大镜角色请自行调整。所以,蓝桥杯三个字需要分别创建,除此之外,还需要对放大镜进行调整,很多同学可能没有注意到这一点。

如果你仔细观察,会发现上图中的放大镜中间填充了蓝色,而题目描述中的放大镜中间是透明的,因此,需要擦除放大镜的蓝色填充部分。

本题的难点是如何检测文字出现放大镜中,第一个要排除的是碰撞检测,试想一下,如果文字碰到镜柄了,总不能将文字放大吧。

常见的解决方案有两个,第一种方案是增加一个辅助角色,放到镜框的中间,将其虚像设置为100,然后跟随放大镜移动,此时,我们只需要检测文字是否碰到辅助角色。

第二种解决方案是调整放大镜的造型中心,将将框中心点作为放大镜的造型中心,然后使用”到角色的距离“指令检测,如图:

当文字到放大镜的距离小于某个值(比如30),就将文字变大。

很显然,第二种方案更为简单,也是超平老师推荐的方案,接下来,我们进入具体的编程实现环节。

三.编程实现

根据题目描述和思路分析,我们分3步来编写程序:

  • 角色准备

  • 放大镜跟随鼠标移动

  • 文字放大效果

1. 角色准备

首先是调整放大镜角色,主要有两点,一是擦除镜框中间的蓝色,二是调整造型中心,调整后的效果如图所示:

需要注意的是,在使用橡皮擦的时候,可以将橡皮擦的大小设置为100,这样每次擦除的面积会更大一些。

然后再分别创建”蓝“、”桥“、”杯“三个文字角色,如图所示:

2. 放大镜跟随鼠标移动

绿旗点击时,放大镜位于舞台右下角,在被点击后,跟随鼠标移动,切换到放大镜角色,编写代码如下:

代码比较简单,强调一点,在Scratch中,对于只需要判断一次的场景,使用等待条件指令是最简单的方法。

3. 文字放大效果

对于文字而言,只需要检测它和放大镜之间的距离,并改变角色的大小,以”蓝“字角色为例,编写代码如下:

其它两个文字角色的代码基本一样,只是坐标不同,这里就不再列出了。

至此,小猫踩球作品就创作好了,简单吧。

四.总结与思考

本题是中级组编程部分第3题,分数为50分,积木块数量32个左右,涉及到的知识点主要包括:

  • 绘制角色及修改造型;

  • 检测两个角色之间的距离;

  • 等待条件指令的妙用;

  • 设置角色大小;

这是中级组的第3题,难度一般,完成时间10分钟左右。虽然代码不多,但是很多同学忽略了两个细节,一是没有去掉放大镜中的蓝色填充部分,二是直接使用角色碰撞来检测文字是否在镜框中。

这就要求考生在比赛过程中,认真阅读题目要求,仔细分析问题,养成良好的考试习惯,一旦你做到这些,肯定能在众多学生中脱颖而出的。

最后给你留一个小小的思考题,在检测文字到放大镜的距离时,这个距离是怎么计算的呢,你知道吗?

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要素材和源码的,可以移步至“超平的编程课”gzh,或者私信本人。

MFC(Microsoft Foundation Classes)是一种用于开发Windows桌面应用程序的C++框架。如果想要实现鼠标移动放大镜效果,可以按照以下步骤进行操作: 1. 创建一个新的MFC项目。在Visual Studio中,选择“创建新项目”,然后选择“MFC应用程序”模板,可以命名你的项目并选择相应的选项和设置。 2. 在MFC应用程序的主视图类中添加成员变量。打开mainfrm.h文件,在类定义中添加一个CBitmap成员变量和一个标记鼠标状态的布尔变量,例如`CBitmap m_Bitmap;`和`BOOL m_isMouseDown;`。 3. 重写主视图的OnCreate函数。在创建视图时加载一个原始图像作为放大镜的背景图像。在OnCreate函数中,添加以下代码: ```c++ CClientDC dc(this); m_Bitmap.LoadBitmap(IDB_MYBITMAP); // IDB_MYBITMAP代表原始图像资源的ID dc.SelectObject(m_Bitmap); ``` 4. 重写主视图类的OnMouseMove函数。当鼠标移动时,获取鼠标的当前坐标,并计算放大镜的位置和大小。重绘视图以实现放大镜效果。在OnMouseMove函数中,添加以下代码: ```c++ void CMyView::OnMouseMove(UINT nFlags, CPoint point) { if (m_isMouseDown) { CRect rect; GetClientRect(&rect); // 获取视图的客户区矩形 // 计算放大镜的位置和大小 int magnifierWidth = 100; // 放大镜的宽度 int magnifierHeight = 100; // 放大镜的高度 int offsetX = point.x - magnifierWidth / 2; int offsetY = point.y - magnifierHeight / 2; // 裁剪放大镜的位置 if (offsetX < 0) offsetX = 0; if (offsetX > rect.Width() - magnifierWidth) offsetX = rect.Width() - magnifierWidth; if (offsetY < 0) offsetY = 0; if (offsetY > rect.Height() - magnifierHeight) offsetY = rect.Height() - magnifierHeight; // 获取放大镜背景图像的子位图 CBitmap bmp; CDC memDC; memDC.CreateCompatibleDC(&dc); bmp.CreateCompatibleBitmap(&dc, magnifierWidth, magnifierHeight); memDC.SelectObject(&bmp); memDC.BitBlt(0, 0, magnifierWidth, magnifierHeight, &dc, offsetX, offsetY, SRCCOPY); // 放大镜效果的绘制代码 CDC dc; dc.CreateCompatibleDC(pDC); dc.SelectObject(&bmp); CRect destRect(point.x, point.y, point.x + magnifierWidth, point.y + magnifierHeight); pDC->StretchBlt(destRect.left, destRect.top, destRect.Width(), destRect.Height(), &dc, 0, 0, magnifierWidth, magnifierHeight, SRCCOPY); // 清理资源 memDC.DeleteDC(); bmp.DeleteObject(); dc.DeleteDC(); } CView::OnMouseMove(nFlags, point); } ``` 5. 重写主视图类的OnLButtonDown和OnLButtonUp函数。这两个函数用于标记鼠标的按下和抬起状态。在这两个函数中,添加以下代码: ```c++ void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { m_isMouseDown = TRUE; CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { m_isMouseDown = FALSE; CView::OnLButtonUp(nFlags, point); } ``` 通过以上步骤,我们可以实现在MFC应用程序中实现鼠标移动放大镜效果。当鼠标按下并移动时,会在视图中显示一个放大的区域,该区域随着鼠标的移动而变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值