2016-11-23 109 views
1

我一直在試圖爲用戶輸入數據後,用戶單擊該框。這是我迄今爲止,但單擊該框不會導致文本輸入添加到它。問題在哪裏?如何在love2d中創建文本框

function love.load() 
    txt1 = "" 

    columnx = { 50, 160, 260, 375, 495, 600, 710 } 
    columny = { 130, 230, 330, 440, 540, 640 } 


    if show1 == true then 
     function love.textinput(t) 
      txt1 = t 
     end 
    end 
end 

function love.mousepressed (x, y) 
    if 
     x >= columnx[4] and 
     x <= 435 and 
     y >= columny[1] and 
     y >= 145 then 
     show1 = true 
    end 
end 

function love.draw() 
    love.graphics.print(txt1, columnx[4], columny[1]) 
end 

回答

5

你幾乎在路上,但我會給你一些關於如何創建基本文本框的提示。

首先,將一個概念文本框設置爲一個單一表格,其中包含需要了解其自身以正確更新和呈現的所有信息。推理自我包容的東西要容易得多。

文本框需要知道它的位置,大小,它是否處於活動狀態以及它包含哪些文本。我們可以將它壓縮成如下所示的表格。

local textbox = { 
    x = 40, 
    y = 40, 
    width = 400, 
    height = 200, 
    text = '', 
    active = false, 
    colors = { 
     background = { 255, 255, 255, 255 }, 
     text = { 40, 40, 40, 255 } 
    } 
} 

(我們還保存了一些顏色信息。)

的簡單的方法來添加文字是通過love.textinput後,如您所見。在你的代碼中,我們只檢查文本框是否被激活一次,在love.load,這當然不是,因爲我們可能還沒有采取任何用戶輸入。與其試圖重載函數,我們只是檢查文本框是否在處理程序中處於活動狀態,並相應地執行。

function love.textinput (text) 
    if textbox.active then 
     textbox.text = textbox.text .. text 
    end 
end 

我們已經介紹瞭如何檢查用戶是否點擊了這個問題一個矩形區域內:Love2d cursor positions。我們想要停用文本框,如果它當前處於活動狀態,並且用戶在其空間的以外點擊

function love.mousepressed (x, y) 
    if 
     x >= textbox.x and 
     x <= textbox.x + textbox.width and 
     y >= textbox.y and 
     y <= textbox.y + textbox.height 
    then 
     textbox.active = true 
    elseif textbox.active then 
     textbox.active = false 
    end 
end 

最後我們需要渲染我們的文本框。我們使用unpack來擴展我們的顏色表格,並使用love.graphics.printf來確保我們的文字在我們的文本框空間內環繞。

function love.draw() 
    love.graphics.setColor(unpack(textbox.colors.background)) 
    love.graphics.rectangle('fill', 
     textbox.x, textbox.y, 
     textbox.width, textbox.height) 

    love.graphics.setColor(unpack(textbox.colors.text)) 
    love.graphics.printf(textbox.text, 
     textbox.x, textbox.y, 
     textbox.width, 'left') 
end 

這些是創建一個非常粗糙的文本框的基本思想。這並不完美。請注意,您需要考慮文本在長度方面比我們最初設置文本框的高度時更長,因爲這兩者只是鬆散相關的。


使你的程序更易於閱讀,更易於擴展,您在上面看到的一切真的應該放在自己的函數,處理文本框的表,而不是用公共代碼弄亂love處理程序。看一看Programming in Lua的第16章,其中涵蓋Object-Oriented Programming--遊戲開發的一個重要主題。


請參閱love.textinput關於如何處理退格,刪除字符的頁面。


一些額外的事情要考慮:

  • 我們怎樣才能從無效區分一個積極的文本框?
  • 我們如何創建一個文本框列表,所以我們可以在屏幕上有多個(但只有一個活動)?
+0

謝謝這有助於很多。 – laquishabonquiquithe3rd

+0

每件事看起來都是正確的,並且有道理,但每當我點擊框並嘗試輸入一個字母/數字,它都不起作用。我也沒有其他的錯誤。 – laquishabonquiquithe3rd

+1

@ laquishabonquiquithe3rd您可以創建一個完整的,但最小的'main.lua'文件,並將其託管在https://gist.github.com之類的位置,以便我可以看一下嗎? 'love.textinput'應該像廣告一樣工作。你正在使用哪個版本的愛? – Oka

1

我想,love.textinput()回調函數是你在找什麼。但是當術語'回調'意味着,它將被LÖVE引擎調用,而不是您的代碼。只要用戶在遊戲運行時輸入一些文本,就會調用它。因此您需要將其放在love.load()函數之外。
在love2d.org維基是一個例子(較低的一個)。

至於你的榜樣,移動love.textinput()love.load()並添加if聲明:

function love.load() 
    txt1 = "" 

    columnx = {50, 160, 260, 375, 495, 600, 710} 
    columny = {130, 230, 330, 440, 540, 640} 
end 

function love.textinput(t) 
    if (show1) then 
     txt1 = txt1 .. t 
    end 
end 

-- The rest of your code. 
-- And maybe mix it with the 'backspace example' from the wiki... 

-- But you also might want to have some function to set 'show1' back to 'false' after the text input. Maybe something like this: 
function love.keypressed(key) 
    if (key == "return") and (show1) then 
     show1 = false 
    end 
end 

我希望我可以幫你一點!