自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析關(guān)于Lua Player學(xué)習(xí)指南

移動(dòng)開發(fā) iOS
關(guān)于Lua Player學(xué)習(xí)指南是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)Lua中關(guān)于Player的內(nèi)容,具體內(nèi)容的實(shí)現(xiàn)來看本文詳解。

關(guān)于Lua Player學(xué)習(xí)指南是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)Lua中關(guān)于Player的內(nèi)容。你應(yīng)該對(duì)lua編程語言的基礎(chǔ)有所了解,而LuaIDE在純的Lua環(huán)境下對(duì)你實(shí)驗(yàn)很有幫助,在那里你可以鍵入一些程序并且一步一步的運(yùn)行,來觀察其中的變量是如何改變的,還有一種方式就是下載windows版本的Lua(lua.exe),以命令行的方式來啟動(dòng)lua.exe,然后在里面輸入Lua表達(dá)式,比如像”for i=1,10 do io.write(i..”/n”) end”。

Hello World

首先按照readme文件中描述的步驟安裝Lua Player.完成之后讓我們從一個(gè)簡(jiǎn)單的腳本開始吧:

  1. -- create a new Color object  
  2. green = Color.new(0, 2  
  3.    
  4. -- show some text on offscreen  
  5. screen:print(200, 100, "Hello World!", green)  
  6.    
  7. -- flip visible and offscreen  
  8. screen.flip()  
  9.    
  10. -- wait forevever  
  11. while true do  
  12.          screen.waitVblankStart()  
  13. end 

把上面這些內(nèi)容輸入到文本文檔中,并以”script.lua”作為他的文件名,把它放到你的記憶棒用來存放EBOOT.PBP的同一個(gè)目錄中.當(dāng)你啟動(dòng)Lua player之后,你的可愛的psp屏幕上應(yīng)該可以看到這個(gè)枯燥的圖片:

psp 的屏幕的分辨率是480*272(單位像素)的.”Color.new”這條語句建立了一個(gè)新的顏色對(duì)象.參數(shù)分別是red,green,blue和alpha(可選),每一個(gè)參數(shù)的變化范圍都是從0到255.這其實(shí)就是RGB顏色模型. "screen:print"這條語句在屏幕上顯示出了一些文本,其中前兩個(gè)參數(shù)是要顯示的文本在屏幕中的位置x,y坐標(biāo)值,這兩個(gè)參數(shù)后面緊接著要顯示的文本和一個(gè)可選的顏色參數(shù)(默認(rèn)是黑色).坐標(biāo)值x是從屏幕的左邊開始的,坐標(biāo)值y是從屏幕頂端往下增長(zhǎng)的.

這里我們使用了兩個(gè)屏幕緩沖:一個(gè)離屏緩沖和一個(gè)可視緩沖。所有的繪圖函數(shù)都是作用在離屏緩沖上的。這就意味著直到調(diào)用了screen.flip(),離屏緩沖和可視緩沖才能互相交換,從而顯示出你要顯示出的文字來。這其實(shí)就是所謂的雙緩沖技術(shù)。這種技術(shù)是通過一種叫做page-flipping(翻頁技術(shù))來實(shí)現(xiàn)的,這就是問什么它的名字叫做“flip“啦。

在***的那個(gè)while循環(huán)中 無限的調(diào)用了waitVblankStart這個(gè)函數(shù)。如果你不以類似這樣的方式結(jié)尾的話,當(dāng)你的腳本結(jié)束時(shí),你將不會(huì)看到你所想要看到的結(jié)果,因?yàn)槟闳绻麖腖owser中啟動(dòng)它的話你看到的將是Lowser的圖形界面,如果把它作為一個(gè)單獨(dú)的腳本來運(yùn)行的話你看到將是屏幕上顯示是否還要重新運(yùn)行一遍的提示。如果你只是用一個(gè)空循環(huán)而沒有用那些等待函數(shù)的話,這將會(huì)占用大量的cpu資源。

動(dòng)畫

理解存儲(chǔ)在內(nèi)存中的像素是如何顯示在屏幕上的對(duì)于編寫游戲是非常重要的。許多顯示設(shè)備包括psp的顯示原理,其實(shí)都和老式的陰極射線管的原理相類似。一條光線從屏幕的左上端開始一條線一條線往下掃描。

在***部時(shí)這條光要返回左上端時(shí)要花費(fèi)一些時(shí)間而這段時(shí)間就叫做垂直空白(vblank),這是因?yàn)樵趻呙杈€在返回起始掃描位置時(shí)它是處在非激活狀態(tài)的。當(dāng)然了,在psp中其實(shí)并沒有這條掃描線。但是你可以就認(rèn)為它是這么工作的。當(dāng)執(zhí)行”screen.waitVblankStart()”后,腳本將會(huì)等待到這次vblank的開始.在vblank期間將不會(huì)顯示任何像素點(diǎn),這就給了我們時(shí)間來進(jìn)行離屏和顯示屏之間的切換,從而避免了屏幕閃爍。

下面讓我們看看通過同步的頁面切換來實(shí)現(xiàn)的動(dòng)畫是個(gè)什么樣的吧:

  1. System.usbDiskModeActivate()  
  2. green = Color.new(0, 255, 0)  
  3. time = 0 
  4. pi = math.atan(1) * 4  
  5. while true do  
  6.          screen:clear()  
  7.    
  8.          x = math.sin(pi * 2 / 360 * time) * 150 + 192.5  
  9.          screen:print(x, 100, "Hello World!", green)  
  10.          timetime = time + 1  
  11.          if time >= 360 then  
  12.                  time = 0 
  13.          end  
  14.    
  15.          screen.waitVblankStart()  
  16.          screen.flip()  
  17.    
  18.          pad = Controls.read()  
  19.          if pad:start() then  
  20.                  break  
  21.          end  
  22. end 

在while循環(huán)當(dāng)中,首先對(duì)離屏進(jìn)行清屏,然后在離屏上面寫上一些文字,然后腳本等待vblank的開始,之后在交換可見屏和離屏。Psp的垂直刷新率是60Hz,這就意味著文字需要六秒鐘的時(shí)間才會(huì)回到原來的地方(sin函數(shù)的周期是2*pi,所以一個(gè)完整的周期就是從0度到360度,而每秒鐘增加六十次,所以一個(gè)周期就要花費(fèi)6秒)。在代碼的***通過檢查是否按下了start這個(gè)按鍵,來退出循環(huán)。
 
你可以使用這條語句作為你自己的程序的開始。System.usbDiskModeActivate()這條語句啟動(dòng)了usb模式,在循環(huán)的***是按鍵代碼:當(dāng)你按下start按鍵后,Lua Player程序就重新運(yùn)行你的程序一遍。這個(gè)就讓我們?cè)陂_發(fā)時(shí)有了一個(gè)快速的周轉(zhuǎn)時(shí)間:首先在psp上運(yùn)行你的腳本程序,當(dāng)你開啟了usb功能時(shí),你就可以通過usb驅(qū)動(dòng)來在一個(gè)文本編輯器打開你的腳本,保存你對(duì)腳本改動(dòng),然后只要每按下start按鍵就可以馬上運(yùn)行經(jīng)過改動(dòng)后的腳本了。
 
圖像
 
首先拷貝下面這個(gè)圖片到你的psp上,并以background.png作為它的文件名:

然后還有這個(gè)圖片,把它命名為smiley.png

下面就這個(gè)笑臉的動(dòng)畫程序了:

  1. System.usbDiskModeActivate()  
  2. green = Color.new(0, 255, 0)  
  3. time = 0 
  4. pi = math.atan(1) * 4  
  5. background = Image.load("background.png")  
  6. smiley = Image.load("smiley.png")  
  7. while true do  
  8.          screen:blit(0, 0, background, 0, 0, background:width(), background:height(), false)  
  9.    
  10.          x = math.sin(pi * 2 / 250 * time) * 200 + 220.5  
  11.          y = 172 - math.abs(math.sin(pi * 2 / 125 * time) * 150)  
  12.          screen:blit(x, y, smiley)  
  13.          timetime = time + 1  
  14.          if time >= 500 then  
  15.                  time = 0 
  16.          end  
  17.    
  18.          screen.waitVblankStart()  
  19.          screen.flip()  
  20.    
  21.          pad = Controls.read()  
  22.          if pad:start() then  
  23.                  break  
  24.          end  
  25. end 

你可以看到我們上面這個(gè)程序的主循環(huán)體的大體結(jié)構(gòu)和前面例子的結(jié)構(gòu)是很像的。不過這次沒有使用screen:clear()這個(gè)函數(shù)拉,而是調(diào)用了screen:blit,通過它來描繪了背景。然后screen:blit(x, y, smiley)這一句則在背景之上描繪了另一個(gè)圖像。這里用到的參數(shù)比較少,因?yàn)槲覀儗?duì)blit函數(shù)使用了默認(rèn)的參數(shù),我們把a(bǔ)lpha這個(gè)參數(shù)設(shè)為真。這意味著所有在這幅圖片中透明的像素點(diǎn)是不會(huì)被參與blit過程。

比如說某些圖像程序會(huì)這樣顯示你的圖片:

我們可以看到當(dāng)Lua Player中alpha這個(gè)參數(shù)被設(shè)為真時(shí),各自花紋圖案是透明的并沒有被描繪出來。

如果你有很多物體要畫在屏幕上的話,使用多層技術(shù)可能會(huì)更快一些:通過Image.createEmpty建立一個(gè)空的圖像(空的圖像默認(rèn)是由透明的像素點(diǎn)構(gòu)成的),把你游戲中的靜態(tài)部分描繪到這個(gè)圖像上,然后對(duì)于vblank后的每次循環(huán),首先在屏幕上畫出背景,然后是包含靜態(tài)部分的那個(gè)圖片,***再畫那些動(dòng)態(tài)部分。具體你可參閱snake這個(gè)游戲是怎么做到的。

控制

你可以通過control類來使用你psp上的控制部件。Controls.read()能夠讀取到psp控制部件的當(dāng)前狀態(tài),舉個(gè)例子來說當(dāng)x鍵按下時(shí),那么cross這個(gè)函數(shù)就會(huì)返回真值(true)否著就會(huì)返回假值(false)。analogX 和 analogY可以返回模擬模擬搖桿的位置,它的范圍是-128到127,但是即使當(dāng)搖桿在中間位置時(shí)也會(huì)產(chǎn)生些小于32的數(shù)值。下面是一個(gè)畫圖程序。通過模擬搖桿來移動(dòng)光標(biāo),按下cross來繪畫,select是截圖按鈕,start鍵則是結(jié)束。

  1. red = Color.new(255, 0, 0);  
  2. black = Color.new(0, 0, 0);  
  3. white = Color.new(255, 255, 255);  
  4.    
  5. canvas = Image.createEmpty(480, 272)  
  6. canvas:clear(white)  
  7.    
  8. brush = {}  
  9. eraser = {}  
  10.    
  11. x0 = 0  
  12. y0 = 0  
  13. x1 = 0 
  14. y1 = 0 
  15. while true do  
  16.          pad = Controls.read()  
  17.          dx = pad:analogX()  
  18.          if math.abs(dx) > 32 then  
  19.                  x0x0 = x0 + dx / 64  
  20.          end  
  21.          dy = pad:analogY()  
  22.          if math.abs(dy) > 32 then  
  23.                  y0y0 = y0 + dy / 64  
  24.          end  
  25.          if pad:cross() then  
  26.                  canvas:drawLine(x0, y0, x1, y1, black)  
  27.          end  
  28.          x1 = x0 
  29.          y1 = y0 
  30.          screen:blit(0, 0, canvas, 0, 0, canvas:width(), canvas:height(), false)  
  31.          screen:drawLine(x1 - 5, y1, x1 + 5, y1, red)  
  32.          screen:drawLine(x1, y1 - 5, x1, y1 + 5, red)  
  33.          screen.waitVblankStart()  
  34.          screen.flip()  
  35.          if pad:start() then break end  
  36.          if pad:select() then screen:save("screenshot.tga") end  
  37. end 

小結(jié):淺析關(guān)于Lua Player學(xué)習(xí)指南的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: CSDN博客
相關(guān)推薦

2010-07-15 15:39:51

Perl線程

2010-07-16 15:29:02

Windows Pho

2010-07-29 09:31:28

Flex編程模型

2010-07-21 11:04:44

Perl學(xué)習(xí)指南

2009-11-11 14:32:33

路由協(xié)議介紹

2009-09-17 09:01:10

CCNA學(xué)習(xí)指南CCNA

2010-07-16 10:44:54

Perl數(shù)組

2011-08-23 15:02:59

LuaTable

2014-12-11 17:55:05

程序員

2024-10-15 08:10:49

NotebookLMYouTube視頻AI

2010-06-11 14:21:53

2009-03-22 12:01:33

CCNA視頻教程下載

2015-12-07 11:22:00

算法學(xué)習(xí)指南

2020-07-08 14:50:18

WebpackHMR前端

2009-11-24 14:48:00

2009-11-12 17:20:17

2011-08-23 15:34:56

Lua模式 匹配

2011-08-24 14:14:13

LUA環(huán)境 配置

2011-08-23 14:26:07

Lua字符串

2015-09-24 14:04:59

機(jī)器學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)