Сфера функций Corona / Lua - PullRequest
       0

Сфера функций Corona / Lua

1 голос
/ 15 февраля 2012

Я новичок в Короне. Я не уверен, как решить эту проблему.

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

В плеере есть функция takeDamage.

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

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

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

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

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

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

1 голос
/ 15 февраля 2012

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

-- 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()
...