2015-07-08 4 views
-1

Ошибка говорит:Ошибка: попытка индекса глобальной «playerBul» (нилъ значение)

game.lua:171: attempt to index global 'playerBul' (a nil value)

Извините, если я слишком много ненужного кода, я просто не знаю, что является причиной этой ошибки.

здесь все файлы для этой игры:

Menu.lua:

local menu = {} 
local bannermenu; 
local selection; 

menu.name = 'Menu' 

local function play() 
mode = require('game') 
mode.load() 
end 

local options = { 
{['text'] = 'Play', ['action'] = play}, 
{['text'] = 'Exit', ['action'] = love.event.quit} 

} 

function menu.load() 
bannermenu = love.graphics.newImage(BANNER) 
selection = 1 
pointer = love.graphics.newImage(POINTER) 
mode = menu 
end 

function menu.update() 
return mode 
end 

function menu.draw() 
love.graphics.draw(bannermenu, 200,10) 
for i = 1,#options do 
    if i == selection then 
     love.graphics.draw(pointer, 300, 200 + i *20) 
    end 
    love.graphics.printf(options[i].text,0,200 + i * 20, love.graphics.getWidth(), 'center') 
end 
end 

function menu.keypressed(key) 
if key == "up" then 
    selection = (selection - 2)%(#options) + 1 
elseif key == "down" then 
    selection = (selection) % (#options) + 1 
elseif key == "return" then 
    options[selection].action() 
elseif key == "escape" then 
    love.event.quit() 
end 
end 

return menu 

main.lua

TITLE = 'Die Aliens Die!' 
PLAYER_BULLET = 'Images/playerbullet.png' 
ENEMY_BULLET = 'Images/enemybullet.png' 
HEALTH_IMG = 'Images/life.png' 
ENEMY_UFO = { 

ENEMY_1 = 'Images/enemy1.png', 
ENEMY_2 = 'Images/enemy2.png', 
ENEMY_3 = 'Images/enemy3.png' 
} 
PLAYER_IMG = 'Images/spaceship.png' 
YOU_WIN = 'Images/win.png' 
BANNER = 'Images/banner.png' 
POINTER = 'Images/pointer.png' 

function love.load() 
love.window.setTitle(TITLE) 
mode = require "menu" 
mode.load() 
end 

function love.draw() 
mode.draw() 
end 

function love.keypressed(key, isrepeat) 
mode.keypressed(key) 
end 

function love.update(dt) 
mode.update(dt) 
end 

game.lua

local game = {} 
local playerShip = {} 
local alienUFO = {} 
local bullets = {} 
local alienBullets = {} 
local playerBullets = {} 
local aliens = {{},{},{},{},{},{},{},{},{},{}} 
local health = 3 
local score = 0 
local level = 1 
local alienMovement = true 
local healthImage; 
local alienQty = 0 
local pause 

--local function gameOver() 

--local function gamwWin() 

local function clearTable(t) 
for i = #t,1,-1 do 
    table.remove(t,i) 
end 
end 

local function clearAliens() 
for i=#aliens,1,-1 do 
    for j = #aliens[i],1,-1 do 
     table.remove(aliens[i],j) 
    end 
end 
end 

local function insertAliens() 
alienQty = 0 
for i=1,4 do 
    for j =1,10 do 
     local alien = {} 
     alien.x = (j-1) *alienUFO.width + 10 
     alien.y = (j-1) *alienUFO.width + 35 
     if level ==2 then 
      alien.life = 2 
     if level == 3 then 
      alien.life = 3 
     end 
     table.insert(aliens[j], alien) 
     alienQty = alienQty + 1 
    end 
end 
end 
end 

local function initGame() 
clearTable(playerBullets) 
clearTable(alienBullets) 
clearAliens() 
insertAliens() 
playerShip.x = love.graphics.getWidth()/2 - playerShip.width /2 
end 

local function playerShoot() 
local bullet = {} 
playerShip.x = playerShip.x + 32 
playerShip.y = playerShip.y + 10 
table.insert(playerBullets, bullet) 
end 

local function AlienShoot(x,y) 
local bullet = {} 
bullet.x = alienUFO.width/2 
bullet.y = y -5 
table.insert(alienBullets, bullet) 
end 

local function playerShots(dt) 
if next(playerBullets) ~= nil then 
    for i = #playerBullets,1,-1 do 
     playerBullets[i].y = playerBullets[i].y - dt*   playerBullets.bulletSpeed 
     if playerBullets[i].y < 0 then 
      table.remove(playerBullets,i) 
     else 
      for j = #aliens, 1,-1 do 
       for k = #aliens[j],1,-1 do 
        if next(playerBullets) ~= nil and playerBullets[i] ~= nil  and 
         aliens[j][k].x <= playerBullets[i].x and aliens[j] [k].x + 50 >= playerBullets[i].x 
         and aliens[j][k].y <= playerBullets[i].y and aliens[j] [k].y + 47 >= playerBullets[i].y then 
         table.remove(playerBullets, i) 
         if level == 2 and aliens[j][k].life > 0 then 
          aliens[j][k].life = aliens[j][k].life - 1 
         if level == 3 and aliens[j][k].life > 0 then 
          aliens[j][k].life = aliens[j][k].life - 1 
         else 
          table.remove(aliens[j], k) 
          alienQty = alienQty - 1 
          score = score + 100 
         end 
         break 
        end 
       end 
      end 
     end 
    end 
end 
end 

local function PlayerShot() 
health = health - 1 
if health == 0 then 
    love.event.quit() -- COME BACK HERE FOR LOSE 
end 
end 

local function AlienShots(dt) 
if next(alienBullets) ~= nil then 
    for i = #alienBullets,1,-1 do 
     alienBullets[i].y = alienBullets[i].y + dt * alienUFO.bulletSpeed 
     if alienBullets[i].y > love.graphics.getHeight() then 
      table.remove(alienBullets, i) 
     elseif playerShip.x <= alienBullets[i].x and playerShip.x + playerShip.width >= alienBullets[i].x 
      and playerShip.y <= alienBullets[i].y and playerShip.y + playerShip.height >- alienBullets[i].y then 
      table.remove(alienBullets, i) 
      PlayerShot() 
     end 
    end 
end 
end 

local function nextLVL() 
level = level + 1 
if level == 2 then 
    alienUFO.image = love.graphics.newImage(alienUFO.ENEMY1) 
    alienUFO.speed = 100 
    alienUFO.shotProb = 20 
    alienUFO.bullet = alienBul.image 
    initGame() 
elseif level == 3 then 
    alienUFO.image = love.graphics.newImage(alienUFO.ENEMY2) 
    initGame() 
elseif level > 3 then 
    love.event.quit() -- COME BACK HERE FOR WIN 
end 
end 


function game.load() 
pause = false 
level = 1 
health = 3 
score = 0 
playerShip.speed = 300 
playerShip.bulletSpeed = 300 
playerShip.width = 75 
playerShip.height = 71 
alienUFO.speed = 70 
alienUFO.width = 50 
alienUFO.height = 47 
alienUFO.ENEMY1 = ENEMY_UFO.ENEMY_1 
alienUFO.ENEMY2 = ENEMY_UFO.ENEMY_2 
alienUFO.ENEMY3 = ENEMY_UFO.ENEMY_3 
alienUFO.bulletSpeed = 300 
alienUFO.image = love.graphics.newImage(alienUFO.ENEMY3) 
playerShip.IMAGE = PLAYER_IMG 
playerShip.image = love.graphics.newImage(playerShip.IMAGE) 
healthImage = love.graphics.newImage(HEALTH_IMG) 
playerShip.x = love.graphics.getWidth()/2 - playerShip.width/2 
playerShip.y = love.graphics.getHeight() - 100 
playerBul.image = love.graphics.newImage(PLAYER_BULLET) 
alienBul.image = love.graphics.newImage(ENEMY_BULLET) 
initGame() 
end 

function game.draw() 
if pause then 
    love.graphics.print('GAME PAUSED',love.graphics.getWidth()/2 - 20,20) 
end 

if next(playerBullets) ~= nil then 
    for i = 1, #playerBullets do 
     love.graphics.draw(playerBul.image, playerBullets[i].x, playerBullets[i].y) 
    end 
end 

if next(alienBullets) ~= nil then 
    for i = 1, #alienBullets do 
     love.graphics.draw(alienBul.image, alienBullets[i].x, alienBullets[i].y) 
    end 
end 

if next(aliens) ~= nil then 
    for i = 1, #aliens do 
     for j = 1, #aliens[i] do 
      love.graphics.draw(alienUFO.image, aliens[i][j].x, aliens[i][j].y) 
     end 
    end 
end 

love.graphics.print('Score: '..score, love.graphics.getWidth() - 100,20) 
love.graphics.draw(playership.image, playership.x, playerShip.y) 
for i = 1, lives do 
    love.graphics.draw(healthImage, 10+ 1 * 15,20) 
end 
end 

function game.update(dt) 
    if not pause then 
     if alienQty == 0 then 
      nextLVL() 
     end 

     if love.keyboard.isDown("right") then 
      playerShip.x = playerShip.x + dt * playerShip.speed 
     elseif love.keyboard.isDown("left") then 
      playerShip.x = playerShip.x - dt * playerShip.speed 
     end 
     if love.keyboard.isDown(" ") then 
      playerShoot() 
     end 
     playerShots(dt) 
     AlienShots(dt) 
     if love.math.random(1,100) < alienUFO.shotProb then 
      local r = love.math.random(1,#aliens) 
      if next(aliens[r]) ~= nil then 
       alienShoot(aliens[r][#aliens[r]].x, aliens[r][#aliens[r]].y) 
      end 
     end 

     if alienMovement then 
      for i = 1, #aliens do 
       for j = 1, #aliens[i] do 
        aliens[i][j].x = aliens[i][j].x + dt * alienUFO.speed 
        if aliens[i][j].x + alienUFO.width + 2 >= love.graphics.getWidth() then 
         alienMovement = false 
        end 
       end 
      end 
     else 
      for i =1, #aliens do 
       for j = 1, #aliens[i] do 
        aliens[i][j].x = aliens[i][j].x - dt * alienUFO.speed 
        if aliens[i][j].x - 2 <= 0 then 
         alienMovement = true 
        end 
       end 
      end 
     end 
     if playerShip.x < 0 then 
      playerShip.x = 0 
      elseif playerShip.x > love.graphics.getWidth() - 75 then 
       playerShip.x = love.graphics.getWidth() -75 
      end 
     end 
    end 
end 

function game.keypressed(key) 
    if key =='p' then 
     pause = not pause 
    end 
end 

return game 
+1

пожалуйста, найти revelant названия – Epitouille

+2

Параметра 'game' таблица не имеет' функции load'. Что вы ожидаете от 'mode.load()'? –

+0

Возвращаемое значение 'require (" game ")' - это таблица 'game', возвращаемая из модуля' game'. Это не имеет функции 'load'. 'menu' имеет функцию' load'. –

ответ

3

Вы не определили функцию load на столе игры, в которой вы возвращаетесь в game.lua. похоже, что вы уже написали логику нагрузки, но написали ее как локальную функцию с именем loadGame. исправить обновления выпуска game.lua экспортировать функцию загрузки и только что это вызов функции загрузки вы уже создали, как это:

function game.load() 
    loadGame() 
end 

где-то, прежде чем вернуть игровой стол в game.lua, скажем, после определения game.keypressed

или в качестве альтернативы может просто изменить local function loadGame() к function game.load(), чтобы удалить локальную функцию и переопределить его как экспортируемую функциональность

+0

Я также попытался изменить его на 'function game.load()' и он возвращается: "menu.lua: 9: попытаться вызвать поле 'load' (значение nil)" – Programmer

+0

@Saksham обновить ваше 'menua. lua' и 'game.lua' в вашем исходном сообщении, чтобы быть тем, что у вас есть в настоящее время, и я посмотрю, что у вас есть. –

+0

@Saksham никаких изменений не требуется для' menu.lua', вам просто нужно было обновить 'игру .lua' включить функцию загрузки. 'game.lua' выглядит корректно сейчас, вы уверены, что у вас не более одного файла' game.lua'? –