2012-06-03 1 views
1

Eh bien j'ai un peu de mal à supprimer un objet du jeu, la chose est que j'ai une classe de joueur (faite d'un métatable), à ​​l'intérieur j'ai une variable appelée sprite qui contient l'adresse pour le sprite de l'image onScreen, donc quand je crée l'objet je ne dessine pas le sprite tout de suite, pour cela j'ai fait une fonction draw (c'est juste pour expliquer ce que j'ai). dans le game.lua je dessine le joueur en appelant cette fonction, et après je veux supprimer mon instance de joueur (de cette façon l'image à l'écran disparaît aussi) ... c'est tout, j'ai essayé le joueur: removeSelf(), affichage. retirer (joueur) et l'un d'entre eux m'a jeté une erreur (tentative d'appeler le champ 'removeSelf' (une valeur nulle) et l'autre fonctionne bien mais cela ne change pas le fait que le joueur est toujours là (je peux accéder il est des fonctions et l'image-objet est toujours affiché à l'écran ... Eh bien voici mon code:Corona SDK comment supprimer un objet?

********************************************************** 
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 

Répondre

2

Après avoir créé l'image-objet à l'aide display.newImage, vous ne le rangez pas dans l'instance self.sprite vient le. valeur de chaîne "assets/char/miner.png"

dans votre fonction draw ajouter

self.spriteObject = sprite 

et dans votre détruire la fonction,

self.spriteObject:removeSelf() 
+0

Omg super qui fonctionne parfaitement bien! ok donc c'est un pas en avant, ce que je voudrais vraiment comprendre, c'est comment puis-je détruire l'instance entière de l'objet? avec ceci je détruis son image mais l'objet reste là, sur un grand projet je ne voudrais pas avoir ces objets instanciés après que je les utilise ... – ershin69

+0

Les données d'image-objet sont stockées dans une table. Ainsi, même après la suppression de l'image-objet, la table qui a stocké l'image-objet aura les valeurs d'origine (à l'exception de certaines valeurs comme x, y qui deviendra nulle). Donc, pour supprimer la table, il suffit d'affecter nil à toutes les variables que la table a été stockée. Dans ce cas 'self.spriteObject = nil' Après que la collecte des ordures de lua fasse le reste. – SatheeshJM

+0

Super, merci satheesh! – ershin69

2

Vous pouvez utiliser une de ces fonctions pour votre objet associé:

  • removeSelf()
  • destroy()