2015-01-10 55 views
2
function PedsPrepareConversation(ped1,ped2,distance,walkSpeed) 
PlayerSetPunishmentPoints(0) 
  if PedGetWeapon(gPlayer) == 437 then 
    PedSetWeapon(gPlayer,-1) 
  end 
  if PedIsInAnyVehicle(gPlayer) then 
    PedWarpOutOfCar(gPlayer) 
  end 
  PedStop(ped2) 
  local x,y,z = PedGetPosXYZ(ped2) 
  PedMoveToXYZ(ped1,walkSpeed,x,y,z) 
  local r1 = x + distance 
  local r2 = y + distance 
  local r3 = x - distance 
  local r4 = y - distance 
  x,y,z = PedGetPosXYZ(ped1) 
  PedFaceXYZ(ped2,x,y,z) 
  repeat 
Wait(0) 
  until PedInRectangle(ped1,r1,r2,r3,r4) 
  PedStop(ped1) 
  x,y,z = PedGetPosXYZ(ped2) 
  PedFaceXYZ(ped1,x,y,z) 
  x,y,z = PedGetPosXYZ(ped1) 
  PedFaceXYZ(ped2,x,y,z) 
end 

我在Lua編程,在變量聲明時我有點困惑。由於「局部」已經在x,y,z的一個實例上聲明,然後x,y,z的另一個實例在下面進行了聲明,這是否意味着它們是不同的變量或它們是否相同?Lua - 如果局部x,y,z和x,y,z已被聲明,它們是相同還是不同?

謝謝。

回答

1

在您顯示的代碼中x,y,z僅聲明一次(如本地),然後多次分配新值。另一個x,y,z與局部x,y,z都在同一個範圍內,並在聲明後出現。下面是一些例子

do -- new scope 
    local x,y,z = 'a','b','c' -- declared local 
    print(x, y, z) -- prints a b c 
    do 
    x,y,z = 1,2,3 -- new scope, but still referring to the local x, y, z (higher scope) 
    print(x, y, z) -- prints 1 2 3 
    end 
    print(x, y, z) -- prints 1 2 3 (modified the original) 
end -- end local x, y, z scope (now they are garbage) 
-- global scope, no x, y, z is defined here 
print(x, y, z) -- prints nil nil nil 

範圍是一個很大的概念更徹底的討論,因此,請檢查Scope Tutorial

+0

謝謝你清理它:-)。 –

+0

我想問問爲什麼你添加了兩個do-ends,但是你爲什麼要這樣做?如果你離開它會有所作爲嗎? –

+0

do-end對創建一個新的範圍。由於x,y,z是局部的,它們在它們被創建的do-end對中是局部的,並且一旦我們到達結束對,它們就會變成垃圾。 – ryanpattison

0

這在PIL的第4.2節中詳細討論。因爲您的local x,y,zx,y,z=...位於相同的「代碼塊」中,它們是相同的。

相關問題