<>导语

上次居然仅仅只做到了第三步,这样的速度让我不敢相信!我的编程工作已经做到了第七步了(目前因为技术问题卡住了…)接下来我会加快脚步了。(文章接下来会贴更多的代码,并且每个代码块之间间隔很短,请谅解)
这些文章建议没有读过的从头阅读,否则你可能不知道我在干什么
最近我一直在看Appgamekit的官方文档,一直没有更新,惭愧不已,马上肝出来了这篇文章!让我们开始吧,Link start!!!

<>代码 4.实现随机生成1个或者2个可拖动的数字格子

这算是很简单的一步了。
照例打开Appgamkekit

<>准备工作

首先我们知道,要随机生成一个或两个数字格子,所以我们会需要一个随机变量。当它为1的时候,生成1个格子,当它为2的时候,生成两个格子。那么首先在main.agc文件里定义一个名为ORT的变量。

另外,我们曾经在第一篇文章中定义了一个名为sprite1的变量,可能会有人好奇为什么要有一个1,这里就是答案。它指这是第一个格子。当我们需要两个格子的时候,我们不能只是用1,2来代表它们,所以我们还需要定义个sprite2.
ORT as integer sprite1=1 sprite2=2
<>主要编程

这里暂时不用给ORT赋值。来到Load.agc文件里开始操作。在ORT为1的时候,代码不变。当ORT为2的时候添加如下代码
LOAD2: ORT=random(1,2) //给ORT随机赋值,1或2 CreateImageColor(1,0,255,255,255)
CreateImageColor(255,255,255,0,255)//当需要创建两个格子的时候,我们会需要两个不同颜色的格子 if ORT=2
CreateSprite(sprite1,1) CreateSprite(sprite2,255) SetSpriteSize(sprite1,50,50)
SetSpriteSize(sprite2,50,50) SetSpritePosition(sprite1,blockX/2-30,blockY)
//设置两个格子的位置 SetSpritePosition(sprite2,blockX/2+30,blockY) endif if ORT=1
CreateSprite(sprite1,1) //这些是原本的代码 SetSpriteSize(sprite1,50,50)
SetSpritePosition(sprite1,blockX/2,blockY) endif return
注意在这里开头出现了一个“LOAD2:”,也就是说在结尾需要一个return,并且在LOAD2里不要包含上次生成25个可放置区块的代码。

在这个时候如果编译运行的话会报错,为什么呢?因为在我们生成25个可放置区块的时候,我们是从2号开始创建的

所以这里我们要修改一下,把i的值从2修改为3,把循环至26修改为27
for i=3 to 27
这个时候运行就会成功了。如果ORT的值为2的话那么会有这样的运行情况‘

<>代码 5.实现使用鼠标同时拖动两个数字格子

这个挺复杂的。具体情况你们可以看下图(这是我的Movesprite.agc文件,可能和你们的不同)

不过不用担心,一点一点地渗透这里还是挺简单的。当你成功地写出这些代码的时候你会感到无比的骄傲的。

废话不多说,开始编程。

首先在Movesprite.agc文件里定义如下变量(换个颜色换个心情)
mouseX1 as float mouseY1 as float mouseX2 as float mouseY2 as float jiange =
GetSpriteX(4)-GetSpriteX(3)-GetSpriteWidth(3)

上面4个变量很好懂,两个数字格子的XY坐标,这里需要和一个格子的情况区分开来,不然后面会混的。最后一个jiange是什么意思也很好懂,两个数字格子之间的间隔嘛(汉语拼音…)

得到这些变量之后,我们会需要修改一下之前的代码,之前我们曾在Movesprite.agc里写过移动一个格子的代码,这里我们在上面套一个if语句来检测目前是否生成了一个格子(如果生成的是两个格子这里的代码就失效了)
if GetRawMouseLeftState()=1 if ORT = 1 if GetRawMouseX()>=getspriteX(sprite1)-
20 and GetRawMouseX()<=GetSpriteX(sprite1)+GetSpriteWidth(sprite1)+20 if
GetRawMouseY()>=GetSpriteY(sprite1)-20 and getrawmousey()<=GetSpriteY(sprite1)+
GetSpriteHeight(sprite1)+20 . . . endif endif endif endif /*注意要endif结尾*/
做好这些后,在if
getrawmouseleftstate()=1里面再套一个if语句,不过这个if需要我们自己写。其实用鼠标拖动两个格子的逻辑很简单,不过就是同时更新两个精灵的坐标而已。所以我们在这里需要写下…
. . . if ORT = 2 if GetRawMouseX()>=getspriteX(sprite1)-20 and GetRawMouseX()<=
GetSpriteX(sprite2)+GetSpriteWidth(sprite2)+20 if GetRawMouseY()>=GetSpriteY(
sprite1)-20 and getrawmousey()<=GetSpriteY(sprite1)+GetSpriteHeight(sprite1)+20
/*注意,这里的检测语句和一个格子的情况不一样,所以不要复制粘贴*/ mouseX1 = getrawmouseX() - jiange /*
更新坐标,使用到了之前定义的jiange变量*/ mouseY1 = getrawmouseY() - GetSpriteHeight(sprite1)/2
mouseX2 = getrawmouseX() + jiange mouseY2 = getrawmouseY() - GetSpriteHeight(
sprite1)/2 if mouseX2 > blockX /*边框*/ mouseX2 =blockX endif if mouseY1 >blockY
mouseY1 =blockY endif if mouseX1 < 0 mouseX1 = 0 endif if mouseY2<0 mouseY2=0
endif setspriteposition(sprite1,mouseX1,mouseY1)/*更新坐标*/ setspriteposition(
sprite2,mouseX2,mouseY2) endif . . .
如果程序没有任何问题的话,那么点击运行后,可以看到当生成了两个格子之后,我们可以拖着它们到处跑了!!!这是一个大成功!!

不过在写好之后可能有人会发现,我贴的图片上的代码要比这里的多,其实多出来的代码就是我这两天一直在官方文档看的东西了,这些东西是动画,链动画(我喜欢这样子叫它)。

在现在的代码写好之后可以发现,不管是单个还是两个格子,在拖动它(们)的时候总是会瞬移(也就是在鼠标左键按下的一瞬间把格子的定位到了我们设定的坐标,这很不好。)我一直在寻求解决方法可以过渡一下,如果使用inc
命令或者是for语句来递增坐标的话那么运算量会爆掉的,如果使用直接的动画那么制作成本又很高,所以我找到了这个,链动画!

由于这个涉及的东西比较多,有兴趣的可以自己去翻翻官方文档(在Appgamekit按F1)我这里就只讲我用到的。

要使用链动画的话,首先得创建一个链。我们在load.agc里创建它
chain = createtweenchain()
CreateTweenChain() //创建一个chain,也就是链

请注意,这里我说的链动画并不是它真实的名称,这只是我自己看官方文档的翻译而已。

创建过链之后,我们还会需要创建Tween精灵(使用动画的精灵)
同样在Load.agc里,在我们创建格子的地方,添加如下一系列代码
. . . if ORT=2 CreateSprite(sprite1,1) CreateSprite(sprite2,255) SetSpriteSize(
sprite1,50,50) SetSpriteSize(sprite2,50,50) SetSpritePosition(sprite1,blockX/2-
30,blockY) SetSpritePosition(sprite2,blockX/2+30,blockY) CreateTweenSprite(
sprite1#,sprite1)//这是我添加的代码 CreateTweenSprite(sprite2#,sprite2) endif if ORT=1
CreateSprite(sprite1,1) SetSpriteSize(sprite1,50,50) SetSpritePosition(sprite1,
blockX/2,blockY) CreateTweenSprite(sprite1#,sprite1)//同上 endif . . .

可以看到,创建Tween精灵函数的使用方法和创建普通精灵的方法一样,但是这里我们用到了两个新的变量sprite1#和sprite2#,所以我们在main.agc函数里定义它(其实不用定义也可以)
sprite1#=1 sprite2#=2
我们有了Tween,也有了链,接下来在Movesprite.agc里用上它们

来到Movesprite.agc里,在这里我们得删除一些东西,也就是setspriteposition()函数,我们不再爱它了TAT!然后把它换成新的SetTweenSpriteX()和SetTweenSpriteY()。写下如下代码…
. . . if ORT = 1 . . . SetTweenSpriteX(sprite1#,GetSpriteX(sprite1),mouseX,0.1)
//后面的0.1是指动画时间,0.1秒 SetTweenSpriteY(sprite1#,GetSpriteY(sprite1),mouseY,0.1)
//SetSpritePosition(sprite1,mouseX,mouseY) PlayTweenSprite(sprite1#,sprite1,0.1)
//开始播放动画,时间为0.1秒 AddTweenChainSprite(chain,sprite1#,sprite1,0)
//把Tween赋给普通精灵,并增加到链中,时间为0秒 PlayTweenChain(chain) //开始播放链 UpdateAllTweens(
GetFrameTime())//更新Tween精灵 sync() endif . . if ORT = 2 . . . SetTweenSpriteX(
sprite1#,GetSpriteX(sprite1),mouseX1,0.1) SetTweenSpriteY(sprite1#,GetSpriteY(
sprite1),mouseY1,0.1) SetTweenSpriteX(sprite2#,GetSpriteX(sprite2),mouseX2,0.1)
SetTweenSpriteY(sprite2#,GetSpriteY(sprite2),mouseY2,0.1)
//SetSpritePosition(sprite1,mouseX1,mouseY1)
//SetSpritePosition(sprite2,mouseX2,mouseY2) PlayTweenSprite(sprite1#,sprite1,
0.1) PlayTweenSprite(sprite2#,sprite2,0.1) AddTweenChainSprite(chain,sprite1#,
sprite1,0) addtweenchainsprite(chain,sprite2#,sprite2,1)//后面的数字也是指动画时间,1秒和0秒
PlayTweenChain(chain) //SetSpritePosition(sprite1,mouseX1,mouseY1)
//PlayTweenChain(chain) UpdateAllTweens(GetFrameTime())
//SetSpritePosition(sprite2,mouseX2,mouseY2) sync() endif . . .
在这一切都做好之后,就可以编译并运行了。运行之后就可以发现现在拖动色块不再像之前那样瞬移式移动了,它现在会有一个过渡动画。就像这样

<>结语

接下来将会是很难的部分。需要坚持走下去,如果只是三分钟热度的话是不行的,我已经出了3篇文章了,但一直没有涉及到真正的主体编程部分。

最近快开学了,我还是学生呢。开学之后可能更新的频率就会小了,可能一月一更,但是不会断更的,无论是什么情况我都是不会断更的!等这个消消乐游戏做完之后我可能会去做虚幻4的文章,但是我对虚幻4的了解非常少,希望各位不会耻笑了。

我是XresKing Howard!

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信