而不是前言
在敖德萨学校,计算机科学课上的八年级学生使用免费的Lazarus跨平台开发环境(
官方网站 ),它看起来和看起来非常像许多Delphi所钟爱的那样,使用了名为Free Pascal的Object Pascal版本,并确实大大简化了进入编程的过程。
但是,孩子们对编写公式F = mg来计算重力的程序并不感兴趣,这对于他们来说仍然是难以理解的。 我尝试教编程的几乎所有孩子都希望从第一堂课开始编写游戏。 幸运的是,Lazarus非常适合编写简单的游戏。
的确,要创建动画精灵,我需要一个组件来显示图像的任意片段(该片段描绘了在不同运动阶段中同一角色的几个不同投影),但是在标准交付中没有这样的组件。 事实证明,自己编写非常容易,我想在本文中谈谈这项技术。
要显示有趣的图形内容,而不是在Lazarus(如Delphi)中使用标准组件的常规版本,请在“附加”选项卡上提供3个组件:
-TImage(显示任意文件中的图片);
-TShape(显示几个预定义图形基元之一);
-TPaintBox(显示可在其上进行编程绘制的画布)。
对于学生来说,最壮观的事情是将一个小的精灵加载到TImage中,并编写一个程序来根据屏幕上的鼠标/键盘事件在循环中自动或根据计时器的事件自动在屏幕上移动它。
一旦开始起作用,学生就会有以下合理问题:是否可以使角色移动? 并可能使他不再不断地看着我们,而是转向与运动方向一致的方向吗?
在网络上,您可以找到大量用于游戏开发的现成图像。 而且许多角色都预先设计了几个投影和几帧动画(例如,
在此站点上 )。
这是一个示例图片,其中精灵以表格的形式排列,其中每一行对应于某个投影,而每一列对应于某个动画阶段:
为什么有这么多照片?要显示这种精灵,只需在屏幕上放置一个简单的组件即可,它不显示整个图像,而只显示其中的一个片段。 然后,更改所选片段在水平和垂直方向上的移动,可以使角色朝不同的方向旋转并进行周期性移动(例如,拍打翅膀或用脚踩脚步)。 此技术通常用于Web开发中:即使是用于业务图形的简单图标集也经常放置在一个文件中,并以不同的偏移量显示在页面上的不同位置,给人不同的印象。
不幸的是,作为标准拉撒路(和Delphi)发行版的一部分的TImage组件不允许显示图像的任意片段:更改其属性,我们可以强制其仅显示整个图像,左上角或其中央部分。 要在两个轴上显示由偏移量和尺寸定义的图像的任意片段,您需要一些其他组件。 但是,事实证明,在拉撒路自己做并不困难!
创建一个新组件
作为创建组件的说明,我使用了
官方指南 。
一切都足够详细地写在那里;重复没有意义。 我只谈几点。
1.标准的“项目向导”不提供创建包的功能,要以某种方式访问编辑器,请选择“新建项目”(俄语版本为“新建项目”)
然后是“应用程序”(俄语版本为“应用程序”):
2.根据说明进一步操作,在“包”菜单中(在俄语版本中为“ Package”),选择上部项目“新包...”(在俄语版本中为“新软件包...”),选择文件名和路径保存。 我将新程序包命名为“ Game”,并将其放在具有相同名称的单独文件夹中:
我创建了一个单独的Lazarus / Cmp文件夹,期望我可能有几个带有组件的软件包,并且已经在该文件夹中创建了“ Game”文件夹。
如果正确完成所有操作,则屏幕上应出现一个新的(到目前为止为空)软件包的窗口。
3.根据说明再次进行操作,以在包窗口中创建一个新组件,单击“添加”按钮(在俄语版本中为“添加”),然后在下拉列表中选择“新组件”(在俄语版本中为“新组件”):
我们将TCustomImage指定为祖先类-该类实际上用于实现TImage组件,但与之不同之处在于它不包含已发布的属性,并允许我们确定设计器中可用于该组件的属性集。
什么是已发布的属性?对于那些不知道这些的人,我要澄清一下,发布是类的一部分(如public),它描述了新的或仅指示继承的属性,这些属性应该在程序开发阶段在视觉属性编辑器中可用。 中间类在本节中未声明任何内容,从而使程序员有机会展示自己认为合适的内容。 因此,TImage类不添加任何功能,而仅将许多从TCustomImage父级继承的属性放在已发布的部分中。 我们需要隐藏其中一些属性,因此我们还将从TCustomImage继承我们的新组件,并仅显示与已发布组件的逻辑不矛盾的内容。
组件的图标(图标)为每个新组件绘制一个个人图标将是一种很好的样式,但是由于我们的任务是显示它的简单性,我们将该字段留空,这将导致工具栏上所有自制组件在Lazarus / Delphi中使用的标准图标。
顺便说一句,上述说明包含一个单独的部分,关于为组件创建图标-适用于不满意“默认”图标的用户。
填写所有字段后,单击“创建新组件”按钮(在俄语版本中为“创建新组件”)。
将代码添加到新组件。
创建新组件后,其源代码立即如下所示:
unit ImageFragment; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs; type TImageFragment = class(TCustomImage) private protected public published end; procedure Register; implementation procedure Register; begin RegisterComponents('Game', [TImageFragment]); end; end.
不出所料,类声明完全为空,并且根本没有实现。 这就是“游戏”选项卡上的组件注册功能。
我们需要添加几个继承的已发布属性,创建我们自己的两个,并重新定义一个虚拟函数。 让我们开始吧!
0.在导入部分,我们需要两个附加模块:ExtCtrls和LCLProc-将它们添加到uses部分:
uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLProc;
1.添加一个与TImage组件完全相似的已发布属性列表,除了一些允许您更改图像的比例和位置的属性:
published property AntialiasingMode; property Align; property Anchors;
为了说服力,我没有删除,而是注释掉了TImage组件中的那些属性,但是会干扰我们新的TImageFragment组件。
2.在类声明中添加两个新属性,以设置水平和垂直图像偏移量:
private FOffsetX: Integer; FOffsetY: Integer; procedure SetOffsetX(AValue: Integer); procedure SetOffsetY(AValue: Integer); published property OffsetX: Integer read FOffsetX write SetOffsetX default 0; property OffsetY: Integer read FOffsetY write SetOffsetY default 0;
并且不要忘记在类的实现中添加两个声明的过程:
implementation procedure TImageFragment.SetOffsetX(AValue: Integer); begin if FOffsetX = AValue then exit; FOffsetX := AValue; PictureChanged(Self); end; procedure TImageFragment.SetOffsetY(AValue: Integer); begin if FOffsetY = AValue then exit; FOffsetY := AValue; PictureChanged(Self); end;
3.我们重新定义虚拟函数DestRect:
public function DestRect: TRect; override;
并将其实现添加到该类的实现中:
function TImageFragment.DestRect: TRect; begin Result := inherited DestRect(); if (FOffsetX <> 0) or (FOffsetY <> 0) then LCLProc.OffsetRect(Result, -FOffsetX, -FOffsetY); end;
编译软件包并重建Lazarus
1.在软件包窗口中,单击“编译”按钮(在俄语版本中为“编译”)。 如果正确完成所有操作,则消息窗口中将显示绿色消息,表示编译成功;否则,该消息将为黄色或红色。
2.在同一窗口中,单击“使用”按钮(在俄语版本中为“使用”),然后在下拉菜单中选择第二项“安装”(在俄语版本中为“安装”)。 该程序将提供重建和重新启动IDE的权限-我们同意:

3.重新启动后,工具栏上将出现一个新的“游戏”选项卡,该选项卡上是我们新组件的图标。
而不是后记
在
Lazarus的下一篇文章中
-使用TImageFragment组件的简单动画,我讨论了如何使用该组件-在5分钟内创建一个窗口,在该窗口中,动画角色将沿不同方向移动并沿移动方向旋转。
如果这个主题对读者来说很有趣,那么我可以在该系列文章的后面补充一篇文章,介绍花了更多时间后如何通过几个键盘控制的足球运动员来制作一个足球场。
如果有足够的时间和愿望-我将尝试编写不同的角色控制算法(例如足球运动员)并安排它们之间的比赛!