2012-02-14 16 views
1

Я новичок в Corona. Я не знаю, как это решить.Corona/Lua Область действия

В основном я создаю 2 локальных объекта, игрока и врага.

У игрока есть функция, называемая takeDamage.

Когда я пытаюсь вызвать player.takeDamage изнутри врага, он не может видеть функцию.

Я предполагаю, что это потому, что главное владеет обоими объектами, и они не знают друг о друге.

Как я могу заставить врага вызвать эту функцию, чтобы она могла нанести урон игроку?

main.lua содержит:

-- Create player character 
local player = require("player"); 
player = player.new(); 

-- Create enemy character 
local enemy = require("enemy"); 
enemy = enemy.new(); 

Я думаю, что я мог бы сделать игрок глобальным, но от того, что я знаю, что не будет лучшей практикой.

Любая помощь была бы принята с благодарностью.

+0

не должен быть 'player: takeDamage'? точка с запятой обозначает его как метод экземпляра. –

ответ

1

Если можно с уверенностью предположить, что будет только один экземпляр «игрока», вы получите может сделать его глобальным. В противном случае, вы должны сделать что-то вдоль этих линий:

-- main.lua 
local player = require 'player'.new() 
local enemy = require 'enemy'.new() 
enemy:setPlayer(player) 

-- enemy.lua 
... 
function enemy:setPlayer(player) 
    self.player = player 
end 

А потом использовать self.player в коде противника, чтобы ссылаться на игрока. Обратите внимание, что это будет потреблять память, потому что ссылка игрока будет скопирована на каждый вражеский экземпляр.

Одностороннее примечание, я не считаю полезным назвать модуль и экземпляр одинаковым, то есть player. Позднее это станет неясным, если вы имеете в виду модуль или экземпляр. Безопасный способ будет вызывать модули, как Player и Enemy, и код будет выглядеть следующим образом:

Player = require 'Player' 
local player = Player.new() 
+0

Спасибо, Михал. В этой игре есть только один игрок. Все остальное будет либо статическим объектом, с которым можно взаимодействовать, либо врагом. Я вижу, что вы здесь делаете, давая врагу ссылку на игрока. Вы бы сказали, что лучше, чем сделать игрока глобальным? Спасибо за разъяснение соглашения об именах. Я согласен с тем, что имена должны быть ограничены по-разному для ясности. – Kenny

+0

Я лично создавал бы 'игрока', используя глобальную переменную.Одна из причин заключается в том, что он будет доступен везде, и вам не придется разрабатывать сложные схемы, подобные тому, который я написал. Другая причина - память - у вас есть только одна ссылка на игрока, а не N (количество врагов). Один из последних подходов - иметь глобальный «gameState», который будет содержать игрока и другое необходимое игровое состояние. –

+0

Я забыл упомянуть, что врагам также может потребоваться взаимодействие друг с другом, поэтому я не уверен, что тогда будет глобальный вариант. Мы не хотим, чтобы все объекты были глобальными, не так ли? – Kenny

1

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

local player = make_player() 
local enemy = make_enemy() 

--game loop - in a real game this isn't a busy while 
while true do 

    local move = player.move() 
    local result = validate_move(move) 
    if result.is_valid then 
     update_position(player, result) 
    end 

    move = enemy.move() 
    result = validate_move(move) 
    if result.is_valid then 
     update_position(enemy, result) 
    end 

    local attack = player.attack() 
    local attack_result = validate_attack(attack) 
    if attack_result.hit then 
     update_health(enemy, attack_result) 
    end 

    -- more game logic here 

    render(player) 
    render(enemy) 
end 

В реальной игре, изменение состояния будет движимый events - события касания, drawing events и т.д. Моей занята петлей (while true do) иллюстрирует общую идею.

Вам также придется использовать свое воображение для отсутствия реализации.

Существует множество способов моделирования игры. Я не предлагаю, чтобы это было лучше всего. Он, однако, показывает один из способов развязывания взаимодействующих элементов.

+0

Спасибо, что ответили Корбину. Является ли модель, которую вы показываете здесь больше для игр на основе поворота, или применима ли она к любому? Я не уверен, что это то, что я ищу, но я подумаю об этом и посмотрю, смогу ли я понять, как это будет соответствовать тому, что я пытаюсь сделать. – Kenny

+0

@ Kenny - Он работает для игры в режиме реального времени или в реальном времени. Замените цикл 'while' на действия события - UI (поворот или в реальном времени) или событие кадра (только в режиме реального времени). Ключевой характеристикой является контроллер/брокер/менеджер, который координирует действия между элементами, которые могут взаимодействовать и связывать эти элементы с прямыми ссылками. Охрана их отстранения может облегчить рассуждение об их действиях и обязанностях. –

+0

Хорошо, спасибо за то, что это яснее Corbin. : О) – Kenny

Смежные вопросы