跳到主要内容

简单攻击

这一期就讲一个简单的攻击

在wave里面新建一个lua,运行攻击的方法就是改encounter文件夹中的encunter.lua里possible_attacks变量,然后在wave您新建的lua里写入:

bullet = CreateProjectile('bullet', 12, 2)
function Update()
end

CreateProjectile就是创建一个子弹,跟上的俩参数是:使用的图片,x,y坐标 Update函数是必不可少的,否则就会报错

Update函数

这个函数就是指每帧做什么事情

i=0
function Update()
bullet = CreateProjectile('bullet', 12,i)
i=i+1
end

这个就可以演示:最开始设置i=0,然后每帧创建一个子弹,y值为i,顺便把i加1(实现从上到下释放子弹...?)

然后是移动子弹(Move方法)

bullet = CreateProjectile('bullet', 12,1)
function Update()
bullet.Move(0,1)
end

你可能会想这么写:

function Update()
bullet = CreateProjectile('bullet', 12,1)
bullet.Move(0,1)
end

但是,木大! 因为每一个只上升了1像素,为什么呢,因为它每次更新的时候都刷掉了以前那个bullet的控制权(?) 正确写法:

bullets={}
function Update()
local bullet = CreateProjectile('bullet', 12,1)
table.insert(bullets, bullet)
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

解释:先创建了一个表,名叫 bullets (注意加了s),然后每次循环创建一个bullet变量,并把它插入到这个表里(因为我加了local 所以每次创建的bullet变量都是不同的),最后根据表长度分别给每给子弹move1

加工一下:

j=-100
bullets={}
function Update()
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
j=j+1
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

无缝攻击玩毛线(雾)

所以每一次生成要随机啊

j=-100
bullets={}
function Update()
if math.random(1,5)==1 then
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
end
j=j+1
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

math.random就是生成随机数的,这里面是生成1到5的数字,如果=1的话就生成子弹(此攻击看欧气,非酋直接爆炸)

定时生成,每30帧生成一次

j=-100
spawn=0
bullets={}
function Update()
if spawn==30 then
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
spawn=0
end
spawn=spawn+1
j=j+1
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

定时转向:

j=-100
addj=1
spawn=0
bullets={}
function Update()
if spawn==30 then
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
spawn=0
end
spawn=spawn+1

if j==50 then
addj=-1
elseif j==-101 then
addj=1
end
j=j+addj
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

随机定时转向:

j=-100
addj=1
spawn=0
bullets={}
function Update()
if spawn==30 then
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
spawn=0
end
spawn=spawn+1
if j>=50 then
addj=math.random(-3,-0.1)
elseif j<=-101 then
addj=math.random(0.1,3)
end
j=j+addj
for i=1,#bullets do
bullets[i].Move(0,1)
end
end

注意13,15行

速度随机:

bullets[i].Move(0,math.random(1,5))

上面错误做法❌
下面正确做法:

j=-100
addj=1
spawn=0
bullets={}
function Update()
if spawn==30 then
local bullet = CreateProjectile('bullet', j,-60)
table.insert(bullets, bullet)
bullet.SetVar("speed",math.random(1,5))
spawn=0
end
spawn=spawn+1

if j>=50 then
addj=math.random(-3,-0.1)
elseif j<=-101 then
addj=math.random(0.1,3)
end
j=j+addj
for i=1,#bullets do
bullets[i].Move(0,bullets[i].GetVar("speed"))
end
end

其中,SetVar和GetVar分别是创建一个属性(简单理解)其中speed就是一个,把每个子弹初始化时都设置一个speed属性为随机(SetVar),每次移动的时候就会用到(GetVar)

CYF教程(入门篇)正式完结,等到了暑假,我会出进阶篇,希望大家那时候多支持!

不过11号后,如果有问题,找我可能也没用(因为我80%不在),而官方文档又看不懂,所以在这里推荐b站用户“ssxzzyy9”发布的CYF0.63汉化文档(下载地址看置顶评论),如果有差异,请以自己的CYF版本为准