1

ゲームからオブジェクトを削除するのに問題があります。問題は、(メタテーブルから作成された) プレイヤー クラスがあり、その中にスプライトという変数があり、画面上に描画するイメージ スプライトのアドレスを保持しています。そのため、オブジェクトを作成するときにスプライトをすぐに描画しません。そのため、関数描画を作成しました(これは、私が持っているものを説明するためのものです)。game.luaでその関数を呼び出してプレーヤーを描画し、その後、プレーヤーのインスタンスを削除したい(画面上の画像も消えるように)...それだけです。 remove(player) とそれらの1つがエラーをスローし(フィールド 'removeSelf' (nil値)を呼び出そうとしました)、もう1つは正常に動作しますが、プレーヤーがまだそこにあるという事実は変わりません(アクセスできます)それは機能であり、スプライトはまだ画面に表示されています.. . ここに私のコードがあります:

**********************************************************
game.lua:
**********************************************************

---------------------------------------------------------------------------------
-- BEGINNING OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

local _W, _H = display.contentWidth * 0.5, display.contentHeight * 0.5
local background, player, land
local spriteSizeX, spriteSizeY = 60,70

-- Called when the scene's view does not exist:
function scene:createScene( event )
local group = self.view
local BG = display.newGroup()
local stage = display.newGroup()
local foreground = display.newGroup()

group:insert(BG)
group:insert(stage)
group:insert(foreground)

-----------------------------------------------------------------------------

--  CREATE display objects and add them to 'group' here.
--  Example use-case: Restore 'group' from previously saved state.

-----------------------------------------------------------------------------

background = display.newImage("assets/backgrounds/oliveBackground.png", true)
background.x, background.y = _W, _H
BG:insert( background )

player = playerClass.new()
player:draw(15,57.5,foreground)
--player:movePlayer(300,140)

terrain = {}
local m,j = 0,0

for i = 1, 16 do
local l = 1
for k = 3, 10 do
land = landClass.new({posx = i, posy = k})
table.insert(terrain, land)
m = m +1
terrain[m]:draw( spriteSizeX/4 + ((spriteSizeX/2) * j), spriteSizeY/4 + ((spriteSizeY/2) * l) + 5, stage)
l = l + 1
end
j = j+1
end

-- remove an asset doesn't work
--display.remove(terrain[1]:getSprite())
--terrain[1].removeSelf()
-- terrain[1] = nil
player:destroy()

end

**********************************************************
player.lua:
**********************************************************

-- player class

local player = {}
local player_mt = { __index = player }

--[[
-- attributes
local sprite, coins, speed
]]--

function player.new()   -- constructor

local newPlayer = {
sprite = "assets/char/miner.png",
coins = 1000,
speed = 1
}

return setmetatable( newPlayer, player_mt )

end

-- local function, works only when called from inside this class
local function getName()
-- print("")
end

function player:draw(x,y,group)
sprite = display.newImage(self.sprite)
sprite.x, sprite.y = x, y
sprite.xScale, sprite.yScale = 0.5, 0.5
group:insert(sprite)
end

function player:movePlayer(posx,posy)
transition.to(sprite, { x = posx, y = posy, time=500, delay=0, alpha=1.0 })
end

function player:destroy()
-- none of them work
-- self.sprite = nil
-- self.sprite.removeSelf()
end

return player
4

2 に答える 2

3

display.newImage を使用してスプライトを作成した後、インスタンスに保存しませんでした。self.sprite の文字列値は「assets/char/miner.png」だけです

描画関数に追加します

self.spriteObject = sprite

そして、あなたの破棄機能で、

self.spriteObject:removeSelf()
于 2012-06-03T16:24:12.643 に答える
2

関連するオブジェクトに対して、次の関数の1つを使用できます。

  • removeSelf()
  • destroy()
于 2012-12-07T14:10:44.360 に答える