0

我最近开始编码并想尝试 Pico-8。一个使用 Lua 的游戏开发平台。我观看了有关如何创建平台游戏的教程,但我的代码遇到了障碍。代码中的 Spid 是我的主要精灵的名称,我将一些代码组织成几个部分:初始化、更新、绘制、碰撞和播放器。如果有人可以帮助我解决我的错误,请记住,我几乎没有编码经验。

错误信息:

Runtime error line 26 tab 4
If spid.dy>0 then
attempt to index global 'spid' (a nil value)
at line 26 tab 4

购物车代码

pico-8 cartridge // http://www.pico-8.com
version 18
__lua__
--init

function _init()

spid={
 sp=1,
 x=59,
 y=59,
 h=8,
 w=8,
 dx=0,
 dy=0, 
 maxdx=2,
 maxdy=3,
 acc=0.4,
 boost=4,
 anim=0,
 running=false,
 jumping=false,
 falling=false,
 crouching=false,
 flp=false,
 }


 grav=1.2
 friction=0.85



end






-->8
--update

function _update()

 spid.x+=spid.dx
 spid.y+=spid.dy



 spid_update()
 spid_animation()


end
-->8
--draw

function _draw()

cls()
spr(spid.sp,spid.x,spid.y,1,1,spid.flp)
map(0,0)
end
-->8
--collisions

function obj_collision(obj,aim,flag)
 --obj = table and needs x,y,w,h

 local x=obj.x local y=obj.y
 local w=obj.w local h=obj.h

 local x1=0 local y1=0
 local x2=0 local y2=0

 if aim=="left" then
  x1=x-1   y1=y
  x2=x     y2=y+h-1

 elseif aim=="right" then
  x1=x+w   y1=y
  x2=x+w+1 y2=y+h-1

 elseif aim=="up" then
  x1=x+1   y1=y-1
  x2=x+w-1 y2=y

 elseif aim=="down" then
  x1=x     y1=y+h
  x2=x+w   y2=y+h
 end

 -- convert pixels to tiles

 x/=8 y1/=8
 x/=8 y2/=8

 if fget(mget(x1,y1),flag)
 or fget(mget(x1,y2),flag)
 or fget(mget(x2,y1),flag)
 or fget(mget(x2,y2),flag) then
    return true
   else
    return false
  end

end
-->8
--player

function spid_update()

 spid.dy+=grav
 spid.dx*=friction
 end

 if btn(2) then
  spid.dx-=spid.acc
  spid.running=true
  spid.flp=true
  end
 if btn(1) then
  spid.dx+=spid.acc
  spid.running=true
  spid.flp=false
  end

 if btnp(❎)
 and spid.landed then
  spid.dy-=spid.boost
  spid.landed=false
 end

 if spid.dy>0 then
  spid.falling=true
  spid.landed=false
  spid.jumping=false
  end
  if obj_collision(spid,"down",0) then
    spid.landed=true
    spid.falling=false
    spid.dy=0
    spid.y-=(spid.y+spid.h)%8

elseif spid.dy<0 then
  spid.jumping=true
  if obj_collision(spid,up,1) then
   spid.dy=0
 end
end



if spid.dx<0 then
 if obj_collision(spid,"left",1) then
  spid.dx=0
 end


elseif spid.dx>0 then
 if obj_collion(spid,"right",1) then    
  spid.dx=0
  end

end

4

1 回答 1

3

end您在选项卡 4 上的功能中有一个额外的功能,
我假设end后面的行spid.dx*=friction不属于那里。更正此 pico-8 后,抱怨 spid_animation() 不存在,它不在提供的代码中。

function spid_update()

 spid.dy+=grav
 spid.dx*=friction
 end

 if btn(2) then
  spid.dx-=spid.acc
  spid.running=true
  spid.flp=true
  end

我可以建议您将您的 if/end 排列在同一列上以使它们保持直线。通过这种方式,可以更轻松地查看代码的边距并了解 if 语句、函数等的哪一端。

例如,而不是:

 if btn(2) then
  spid.dx-=spid.acc
  spid.running=true
  spid.flp=true
  end

利用:

 if btn(2) then
  spid.dx-=spid.acc
  spid.running=true
  spid.flp=true
 end

这似乎是一件小事,但是当您有很多嵌套代码时,它会使阅读变得容易得多。

Pico-8 文件也可以使用外部编辑器进行编辑。当遇到这样的问题(非显而易见的错误)时,我发现这特别有用。对于一个人,您可以一次查看更多代码,并且他们可以突出显示缺失/额外的结尾。

可执行文件随附的手册中提到了有关使用外部编辑器的信息:https ://www.lexaloffle.com/pico-8.php?page=manual

于 2020-05-12T22:37:48.700 回答