2017-04-24 45 views
0

我使用的是Corona SDK,Sublime Text 3和Lua。我在这个特定程序中的目标是制作一个视觉新颖的应用程序,当玩家点击屏幕底部显示的文本以进入下一个文本输入时,该应用程序会发生变化,因此会继续讲故事。在Lua中使用表来显示文本不起作用?

我为徽标,标题屏幕和其他东西设置了一堆代码,完美地工作。我目前在视觉小说场景中试图做的是使用表格通过改变.TEXT属性来从表格中选择某个值,从而选择文本并制作新的文本,从而绘制文本。基本上,像...(一些虚拟代码下面)

novelText = display.newText (insert the parameters for old text and the old text) 
--the variable used to call the value in the table 
page = 1 
dummy table Novel_pages = { 
[1] = nil, 
[2] = "new text" 
} 

(insert runtime event here that calls this function) 
page = page + 1 
novelText.text = Novel_pages[page] 
display.newText(novelText) 

这只是虚拟代码,所以请不要介意格式。 :)我只是想展示我如何试图从表中调用这些值,并且显示我在做什么,而不必让人们查看我的所有代码。

所以一切工作正常在Corona SDK模拟器,与文本甚至改变只是暂时 - 直到一秒钟后,我得到读取

"mainl.lua:160: bad argument #1 to 'newText' (string expected, got table) 
stack traceback: 
[C]: in function 'NewText' 
main.lua:160: in function <main.lua: 156> 
?: in function <?169>" 

消息现在就是我给你我所有代码的一部分!我希望这不是太多,而且我指出了这个问题。我不明白我在表中的错误,因为它应该只是替换.text而不是所有其他属性?然后用新的文本属性显示,而不必在事后引用表格?也许在显示视觉小说文本之前需要程序处理.text更改时出现问题...

无论如何,请帮助我!我很高兴知道这里出了什么问题,或者正在提出替代方案!并非常感谢你:)

这里的代码 - 一切都从函数sceneVN()开始!请原谅我的激烈对话ingame c:这是一个练习项目!

local store = require("plugin.google.iap.v3") 
local composer = require("composer") 
local scene = composer.newScene() 

display.setStatusBar(display.HiddenStatusBar) -- Removes status bar 
coins = 5 -- variable that defines the number of coins player has in the game.It will be different 
--in a stand alone game, but as a small app meant to demonstrate function, it's necessary to start off 
--with a small, defined number in the beginning. 

local logo = display.newImage("/Images/logo.png", 155, 275) --code for my personal logo, drawn by me. 
--Not actually showcased in the video because of time limit. 
logo.alpha = 0 

local function makeTitleTrue() 
logo:removeSelf() 
print("menu should be TRUE") 
titleScreen() 
end 

local function fadeOut() 
transition.to(logo, {time = 1000, alpha = 0, onComplete = makeTitleTrue}) 
end 

transition.to(logo, {time = 1000, alpha = 1, onComplete = fadeOut}) -- end of logo code 

function titleScreen() -- beginning of title code, which is not managed as a separate scene 
title = true 
titleImg = display.newImage("/Images/vn_bg.png", 155, 275) 
--titleWords = display.newImage("/Images/TitleWords.png", 155, 275) 

--fix to flow towards the upper right corner. 
local flare = display.newImage("/Images/flare2.png", 40, 30) 
flare.xScale = .5 
flare.yScale = .5 
local flare2 = display.newImage("/Images/flare2.png", 400, 70) 
flare2.xScale = .6 
flare2.yScale = .6 
local flare3 = display.newImage("/Images/flare2.png", -30, 100) 
flare3.xScale = .4 
flare3.yScale = .4 
local flare4 = display.newImage("/Images/flare2.png", 100, 400) 
flare4.xScale = .4 
flare4.yScale = .4 
local flare5 = display.newImage("/Images/flare2.png", 400, 400) 
flare5.xScale = .3 
flare5.yScale = .3 
local flare6 = display.newImage("/Images/flare2.png", 250, 200) 
flare6.xScale = .3 
flare6.yScale = .3 

local function moveFlare1() 
    transition.to(flare, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare1}) 
end 
local function moveFlare2() 
    transition.to(flare2, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare2}) 
end 
local function moveFlare3() 
    transition.to(flare3, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare3}) 
end 
local function moveFlare4() 
    transition.to(flare4, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare4}) 
end 
local function moveFlare5() 
    transition.to(flare5, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare5}) 
end 
local function moveFlare6() 
    transition.to(flare6, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare6}) 
end 
transition.to(flare, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare1}) 
transition.to(flare2, {time=2500, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare2}) 
transition.to(flare3, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare3}) 
transition.to(flare4, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare4}) 
transition.to(flare5, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare5}) 
transition.to(flare6, {time=2000, x = math.random(-100, 450), y = math.random(-100, 700), onComplete = moveFlare6}) 

--add options that can when the screen is tapped, tap on an option twice to select 
    -- start story 
    -- continue story 
    -- coin gambling 
    -- end game 

if (title == true) then 
    Runtime:addEventListener("tap", sceneVN) 
end 
end 

function forceQuit() 
function quit() 
    os.exit() 
    end 
    timer.performWithDelay(1000,quit) 
end 

function sceneVNChapter2() 
return 
end 

function sceneVN() -- the actual visual novel code itself 
display.remove(titleImg) 
--display.remove(titleWords) 
display.remove(flare) 
display.remove(flare2) 
display.remove(flare3) 
display.remove(flare4) 
display.remove(flare5) 
display.remove(flare6) 
title = false 

local coinSheetData = 
{ 
    width = 32, 
    height = 32, 
    numFrames = 8, 
} 

local coinimageSheet = graphics.newImageSheet("/Images/spinning_coin.png", coinSheetData) 

local sequenceData = 
{ 
    name= "spinning_coin", 
    start = 1, 
    count = 8, 
    time = 1000, 
    loopCount = 0 
} 

--the properties of the name plate that can be changed ingame by using ".text" property 
local nameOptions = 
{ 
    text = "Frankenstein", 
    x = 165, 
    y = 450, 
    width = 310, 
    font = "Charlesworth.ttf", 
    fontSize = 22, 
    align = "left" 
} 
local bg = display.newImage("/Images/bg4.jpg", 155, 275) 
textRect = display.newRect(155, 525, 325, 200) 
textRect:setFillColor(.02, .02, .02) 
textRect.alpha = .6 
page = 1 
local frames = display.newImage("/Images/windowframes_gold.png", 155, 275) 
display.newText(nameOptions) 
local VN_pages = { 
    [1] = nil, 
    [2] = "\"Then, seeing as this is a simulation of\n a visual novel dating sim, I have no\n choice but to ask you...\"", 
    [3] = "\"My lady, would you go on a date with me?\nFrankenstein... butler of the fineest noble,\nCadis Etrama di Raizel?\"", 
    [4] = "duck", 
    [5] = "duck", 
    [6] = "duck", 
} 

local displayNovelText = display.newText("\"I see. So I\'m supposed to pretend I am\na character in a multi-chapter phone\napp that you\'ve been reading...\"", 165, 500, "Goudy Old Style Regular.ttf", 17) 

function changePage() 
    print("dang it") 
    page = page + 1 
    displayNovelText.text = VN_pages[page] 
    display.newText(displayNovelText) 
end 

textRect:addEventListener("tap", changePage) 

if (coins < 10) then 
    coinsDigits = 2 
else 
    if (coins > 9) and (coins < 100) then 
     coinsDigits = 3 
    else 
     if (coins > 99) and (coins < 1000) then 
      coinsDigits = 4 
     else 
      if (coins > 999) and (coins < 10000) then 
       coinsDigits = 5 
      else 
       if (coins > 9999) and (coins < 100000) then 
        coinsDigits = 6 
       end 
      end 
     end 
    end 
end 

cooin = display.newSprite(coinimageSheet, sequenceData) 
cooin.x = 25 
cooin.y = 30 
cooin:play() 

coinText = display.newText("1", 57 + 4 * coinsDigits, 32, "VCR_OSD_MONO_1.001.ttf", 25) 
coinText.text = coins 
coinTimer = timer.performWithDelay(2000, cooin, 1) 
end 

function choiceMade(event) --the scenes where all the choices are made 
if (event.action == "clicked") then 
    local i = event.index 
    if (i == 1) then 
     Runtime:removeEventListener() 
     titleScreen() 
     else 
      if (i == 2) then 
       system.openURL("https://www.paypal.com/us/home") 
      else 
       if (i == 3) then 
        return 
       end 
      end 
     end 
    end 
end -- end of choice scenes 

function Outofcoins() 
--native alert lack of zero coins 
local alertMessage = "Uh oh, looks like you've run out of coins! To continue reading the story, would you like to buy or gameble for coins?" 
native.showAlert("Out of coins!", alertMessage, {"Gamble for coins", "Purchase coins", "Exit to Menu"}, choiceMade) 
end 

if (coins == 0) then -- conditional branch that alerts Outofcoins if no coins left 
Outofcoins() 
end 

function sceneGambleStart() 

function earntCoins() 

    numberEarnt = 0 
    local coinsGot = display.newImage("/Images/coins_gold.png", 155, 275) 
    coinsGot.alpha = 0 

    local function fadeOutCoinsEart() 
     transition.to(logo, {time = 2000, alpha = 0}) 
     display.remove(coinsGot) 
    end 

    local transitionFade = transition.to(logo, {time = 2000, alpha = 1, onComplete = fadeOutCoinsEarnt}) 
    timer.performWithDelay(2000, transitionFade, 1) 
    coinText.text = coins + numberEarnt 

end 

local function gamblerIntro() 
    nameOptions.text = "Gambler" 
    local bg = display.newImage("/Images/bg4.jpg", 155, 275) 
    textRect = display.newRect(155, 525, 325, 200) 
    textRect:setFillColor(.02, .02, .02) 
    textRect.alpha = .6 
    local frames = display.newImage("/Images/windowframes_gold.png", 155, 275) 
    display.newText(nameOptions) 



    if (gambleVisit == false) then 
     display.newText("\"Welcome to the coin gambling shop!\nHere's your chance to earn free coins\nwithout having to use the app store!", 165, 500, "Goudy Old Style Regular.ttf", 17) 
     --display.newText("\"You can play here once a day if you\'ve\nNO coins in your inventory! You are\ngiven three tries at any game each visit.", 165, 500, "Goudy Old Style Regular.ttf", 17) 
     --display.newText("\"So, then! What games will you play\nin our shop today? \n \n", 165, 500, "Goudy Old Style Regular.ttf", 17) 
    else 
     display.newText("\"Welcome back, player! You have\nthree tries left. So, what games\nwill you try your hand at?", 165, 500, "Goudy Old Style Regular.ttf", 17) 
    end 
end 

local function sceneDiceRoll() 
    --local show background graphics 
    --draw dice on screen, with function ready to shake/transition on screen when accelerometer 
    --transition hands up and drop dice animation 
    -- if dice = # chosen then give coins 
end 

local function sceneCardChoose() 
    -- a function that defines the mechanics of the card game. 
    --draw several options on the screen: 
     --3 cards, earn 5 coins. 
     --6 cards, earn 15 coins. 
     --9 cards, earn 30 coins. 

    --The player needs 5 coins to read another chapter, but by increasing card numbers, 

    --depending on the player's choice, show the images of the cards (with whatever numbers, always set) 
     -- on the screen and allow the player to choose a card. Make a shuffling animation. 
     -- lay all the cards on the screen, now with randomised positions defined by a number. 
     --the player may choose one. Event listener, if the number defined = card number, the card flips, 
     --shows its number, and the player wins the coins. defer to earntCoins. 
    --if the player chooses the wrong card, show him a "WRONG CARD" result, and ask if he would like another 
     --round or to exit to the main shop. 
    return 
end 

local function sceneGuessNumber() 
    --this game is not created, but is a dummy function that's shown here. It's included in the 
    --options to show that if this were a real game, that's what it would look like 
    return 
end 

end 

回答

2

该错误消息说,所有你需要:

“mainl.lua:160:坏参数#1 'newText'(字符串预期,得到了 表)

如果你去你的代码160行,你会发现以下内容:

display.newText(displayNovelText) 

几行上面你这样做:

local displayNovelText = display.newText("sometext") 

请参阅display.newText文档以了解如何正确使用此功能。

https://docs.coronalabs.com/api/library/display/newText.html

你会看到,display.newText()不返回一个字符串,而是一个文本对象。 它也不需要文本对象作为输入。这就是错误信息告诉你的。

要访问displayNovelText的文本,您必须编写displayNovelText.text,您可以在其他选项中填入display.newText()...

请确保您经常阅读的使用功能的文档。如果你不知道你在处理什么,你就不会成功。

+0

嗨,仔猪,感谢伟大的链接文档!你是对的,这非常有用。我曾经只有谷歌论坛的答案,因为文档的语言可以为我相当混乱(在课堂上老师不喜欢文档,我的大部分学习的是实验还是从简单的PPT模板)。我觉得我做了使用铭牌选项的.text属性更改的问题,然后错误地认为我可以做正常的文本一样,不会产生这样的选项。 你的回答是这样的帮助,现在我有一个很好的资源,太多。非常感谢! –

+0

学习如何阅读文档并习惯它就像是软件开发中最重要的事情。我不知道电晕,我从来没有使用过它......但我知道如何快速找到这样的信息(因为它存在并非总是如此) – Piglet