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

在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版本为准