04 pygame編程入門之四:Surface模塊簡介

pygame編程入門之四:Surface模塊簡介

作者: Pete Shinners(pete@shinners.org)

翻譯: 楊曉宏(561071777@qq.com)

Introduction

本教程將嘗試介紹NumPy和pygame surfarray模塊。對于初學(xué)者來說,使用surfarray的代碼是相當(dāng)令人生畏的温眉。但實(shí)際上,只需要幾個概念珍手,你將會使用surfarray模塊办铡,就可以從直接的python代碼中執(zhí)行像素級操作辞做。性能可以非常接近于c代碼的級別。

通過修改像素值來獲得更高級的效果是非常棘手的寡具。僅僅掌握數(shù)字Python(SciPy的原始數(shù)組包是數(shù)字秤茅,NumPy的前身)需要大量的學(xué)習(xí)。在本教程中童叠,用基本的知識框喳,并使用大量的例子來演示课幕。在完成本教程之后,應(yīng)該對surfarray的工作原理有一個基本理解五垮。

Numeric Python

如果您沒有安裝python NumPy包乍惊,現(xiàn)在需要這樣做》耪蹋可以從NumPy下載頁面下載軟件包润绎,以確保NumPy工作,您應(yīng)該從交互式python提示中得到诞挨。

>>> from numpy import *                    #import numeric
>>> a = array((1,2,3,4,5))                 #create an array
>>> a                                      #display the array
array([1, 2, 3, 4, 5])
>>> a[2]                                   #index into the array
3
>>> a*2                                    #new array with twiced values
array([ 2,  4,  6,  8, 10])

正如您所看到的莉撇,NumPy模塊為我們提供了一個新的數(shù)據(jù)類型,數(shù)組惶傻。這個對象持有一個固定大小的數(shù)組棍郎,里面的所有值都是相同類型的。數(shù)組也可以是多維的银室,這就是我們?nèi)绾问褂脠D像的方式涂佃。圖像比這要多一些內(nèi)容,但從這里開始足夠了蜈敢。
上面的最后一個命令巡李,您將看到NumPy陣列上的數(shù)學(xué)操作適用于陣列中的所有值。這被稱為“元素-明智操作”扶认。這些數(shù)組也可以像普通列表一樣被分割侨拦。切片語法與在標(biāo)準(zhǔn)python對象上使用的語法是一樣的。(如果你需要的話辐宾,那就去學(xué)習(xí)吧)狱从。下面是一些使用數(shù)組的例子。

>>> len(a)                                 #get array size
5
>>> a[2:]                                  #elements 2 and up
array([3, 4, 5])
>>> a[:-2]                                 #all except last 2
array([1, 2, 3])
>>> a[2:] + a[:-2]                         #add first and last
array([4, 6, 8])
>>> array((1,2,3)) + array((3,4))          #add arrays of wrong sizes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,) (2,)

我們在最后得到了一個錯誤叠纹,因?yàn)槲覀儑L試將兩個不同大小的數(shù)組相加季研。為了使兩個數(shù)組相互操作,包括比較和賦值誉察,它們必須具有相同的維度与涡。很重要的一點(diǎn)是,從切片中創(chuàng)建的新數(shù)組都引用相同的值持偏。
因此驼卖,改變切片中的值也會改變原始值。這是很重要的鸿秆。

>>> a                                      #show our starting array
array([1, 2, 3, 4, 5])
>>> aa = a[1:3]                            #slice middle 2 elements
>>> aa                                     #show the slice
array([2, 3])
>>> aa[1] = 13                             #chance value in slice
>>> a                                      #show change in original
array([ 1, 2, 13,  4,  5])
>>> aaa = array(a)                         #make copy of array
>>> aaa                                    #show copy
array([ 1, 2, 13,  4,  5])
>>> aaa[1:4] = 0                           #set middle values to 0
>>> aaa                                    #show copy
array([1, 0, 0, 0, 5])
>>> a                                      #show original again
array([ 1, 2, 13,  4,  5])

現(xiàn)在我們來看看有兩個維度的小數(shù)組酌畜。不要太擔(dān)心,開始它和擁有一個二維元組(一個元組中的元組)是一樣的卿叽。讓我們從二維數(shù)組開始桥胞。

>>> row1 = (1,2,3)                         #create a tuple of vals
>>> row2 = (3,4,5)                         #another tuple
>>> (row1,row2)                            #show as a 2D tuple
((1, 2, 3), (3, 4, 5))
>>> b = array((row1, row2))                #create a 2D array
>>> b                                      #show the array
array([[1, 2, 3],
       [3, 4, 5]])
>>> array(((1,2),(3,4),(5,6)))             #show a new 2D array
array([[1, 2],
       [3, 4],
       [5, 6]])

現(xiàn)在有了這個二維數(shù)組(從現(xiàn)在開始是“2D”)恳守,我們可以對特定的值進(jìn)行索引,并在兩個維度上進(jìn)行切片贩虾。簡單地使用逗號分隔索引可以讓我們在多個維度上查找/切片催烘。僅僅使用“:”作為一個索引(或者沒有提供足夠的索引)給我們提供了那個維度中的所有值《邪眨看看它是如何工作的颗圣。

>>> b                                      #show our array from above
array([[1, 2, 3],
       [3, 4, 5]])
>>> b[0,1]                                 #index a single value
2
>>> b[1,:]                                 #slice second row
array([3, 4, 5])
>>> b[1]                                   #slice second row (same as above)
array([3, 4, 5])
>>> b[:,2]                                 #slice last column
array([3, 5])
>>> b[:,:2]                                #slice into a 2x2 array
array([[1, 2],
       [3, 4]])

在使用NumPy時,還有一個切片的特性屁使。切片數(shù)組還允許您指定切片的增量在岂。帶有增量的切片的語法是startindex:endindex:increment。

>>> c = arange(10)                         #like range, but makes an array
>>> c                                      #show the array
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c[1:6:2]                               #slice odd values from 1 to 6
array([1, 3, 5])
>>> c[4::4]                                #slice every 4th val starting at 4
array([4, 8])
>>> c[8:1:-1]                              #slice 1 to 8, reversed
array([8, 7, 6, 5, 4, 3, 2])

這里有足夠的信息讓你開始使用NumPy和surfarray模塊蛮寂。當(dāng)然蔽午,NumPy肯定還有很多內(nèi)容,這只是一個簡單介紹酬蹋。此外及老,我們還想繼續(xù)玩那些有趣的東西,對吧范抓?

Import Surfarray

為了使用surfarray模塊骄恶,我們需要導(dǎo)入它。因?yàn)閟urfarray和NumPy都是pygame的可選組件匕垫,所以在使用它們之前僧鲁,確保它們正確導(dǎo)入是很好的。在這些例子中象泵,我將把NumPy導(dǎo)入到一個名為N的變量中寞秃,這會讓您知道我使用的是NumPy包中的哪些函數(shù)。(比在每個函數(shù)之前輸入NumPy要短得多)

try:
    import numpy as N
    import pygame.surfarray as surfarray
except ImportError:
    raise ImportError, "NumPy and Surfarray are required."

Surfarray Introduction

在surfarray中有兩種主要的功能偶惠。一組用來創(chuàng)建一個數(shù)組的函數(shù)春寿,它是一個表面像素數(shù)據(jù)的副本。其他函數(shù)創(chuàng)建了陣列像素數(shù)據(jù)的引用副本忽孽,因此對數(shù)組的更改會直接影響原始表面绑改。還有其他一些功能允許您訪問任何像素的alpha值作為數(shù)組,以及其他一些有用的功能兄一。稍后討論這些其他函數(shù)厘线。
當(dāng)處理這些表面陣列時,有兩種表示像素值的方法瘾腰。首先皆的,它們可以被表示為映射整數(shù)覆履。這種類型的數(shù)組是一個簡單的2D數(shù)組蹋盆,它帶有一個表示表面的映射顏色值的整數(shù)费薄。這種類型的數(shù)組有利于移動圖像的某些部分。另一種類型的數(shù)組使用三個RGB值來表示每個像素的顏色栖雾。這種類型的數(shù)組使得執(zhí)行改變每個像素顏色非常簡單楞抡。這種類型的數(shù)組也有點(diǎn)棘手,因?yàn)樗举|(zhì)上是一個3D數(shù)字?jǐn)?shù)組析藕。盡管如此召廷,一旦你的思維進(jìn)入了正確的模式,它并不比使用普通的2D數(shù)組困難得多账胧。
NumPy模塊使用機(jī)器的自然數(shù)字類型來表示數(shù)據(jù)值竞慢,因此NumPy數(shù)組可以由8位、16位和32位的整數(shù)組成治泥。(數(shù)組也可以使用其他類型筹煮,比如float和double,但是對于我們的圖像處理居夹,我們主要需要用整數(shù)類型)败潦。由于整數(shù)大小的限制,您必須稍微注意一下准脂,引用像素數(shù)據(jù)的數(shù)組類型可以正確地映射到其它適合類型的數(shù)據(jù)劫扒。從表面創(chuàng)建這些數(shù)組的函數(shù)是:

surfarray.pixels2d(surface)

創(chuàng)建一個引用原始表面數(shù)據(jù)的2D數(shù)組(整數(shù)像素值)。這將適用于所有表面格式狸膏,除了24位沟饥。

surfarray.array2d(surface)

創(chuàng)建一個從任何類型的表面復(fù)制的2D數(shù)組(整數(shù)像素值)。

surfarray.pixels3d(surface)

創(chuàng)建一個引用原始表面數(shù)據(jù)的3D數(shù)組(RGB像素值)湾戳。這只適用于具有RGB或BGR格式的24位和32位表面闷板。

surfarray.array3d(surface)

創(chuàng)建一個從任何類型的表面復(fù)制的3D數(shù)組(RGB像素值)。
這里有一個小圖表院塞,可以更好地說明應(yīng)該在哪些表面上使用哪些類型的函數(shù)遮晚。如您所見,arrayXD函數(shù)都適用于任何類型的表面拦止。

  • 32-bit 24-bit 16-bit 8-bit(c-map)
  • pixel2d yes yes yes
  • array2d yes yes yes yes
  • pixel3d yes yes
  • array3d yes yes yes yes

Examples

有了這些信息县遣,我們就可以開始嘗試使用surface陣列了。下面是創(chuàng)建一個NumPy陣列并在pygame中顯示它們的簡短演示汹族。這些不同的測試在arraydemo.py的例子萧求。有一個名為surfdemo_show的簡單函數(shù),它在屏幕上顯示一個數(shù)組顶瞒。

allblack
allblack = N.zeros((128, 128))
surfdemo_show(allblack, 'allblack')

第一個例子創(chuàng)建了一個黑色數(shù)組夸政。當(dāng)您需要創(chuàng)建一個特定大小的新數(shù)字?jǐn)?shù)組時,最好使用零函數(shù)榴徐。這里我們創(chuàng)建一個所有0的2D數(shù)組并顯示它守问。

striped
striped = N.zeros((128, 128, 3))
striped[:] = (255, 0, 0)
striped[:,::3] = (0, 255, 255)
surfdemo_show(striped, 'striped')

要處理的是一個3D數(shù)組匀归。我們首先創(chuàng)建一個紅色的圖像。然后我們把每三排都切掉耗帕,然后把它分配給藍(lán)色/綠色穆端。正如您所看到,可以將3D數(shù)組與2D數(shù)組幾乎完全相同控制仿便,只要確保給它們分配3個值体啰,而不是單個的映射整數(shù)。

rgbarray
imgsurface = pygame.image.load('surfarray.png')
rgbarray = surfarray.array3d(imgsurface)
surfdemo_show(rgbarray, 'rgbarray')

在這里嗽仪,我們用圖像模塊加載一個圖像荒勇,然后將它轉(zhuǎn)換成一個整數(shù)RGB顏色元素的3D數(shù)組。一個表面的RGB副本總是把顏色排列成r闻坚,c枕屉,0代表紅色的分量,一個r鲤氢,c搀擂,1代表綠色的分量,一個r卷玉,c,2代表藍(lán)色相种。這樣就可以不用關(guān)心實(shí)際表面的像素是如何配置的,不像2D數(shù)組寝并,它是映射(原始)表面像素的副本箫措。我們將在其余的樣本中使用這個圖像斤蔓。

flipped
flipped = rgbarray[:,::-1]
surfdemo_show(flipped, 'flipped')

這里垂直地翻轉(zhuǎn)圖像。所要做的就是使用原始的圖像數(shù)組并使用一個負(fù)增量來分割它镀岛。

scaledown
scaledown = rgbarray[::2,::2]
surfdemo_show(scaledown, 'scaledown')

根據(jù)最后一個例子,將圖像縮小是非常合理的漂羊。我們只是用垂直和水平的增量來分割所有的像素。

scaleup
shape = rgbarray.shape
scaleup = N.zeros((shape[0]*2, shape[1]*2, shape[2]))
scaleup[::2,::2,:] = rgbarray
scaleup[1::2,::2,:] = rgbarray
scaleup[:,1::2] = scaleup[:,::2]
surfdemo_show(scaleup, 'scaleup')

將圖像放大稍微多一點(diǎn)工作走越,但與之前的縮放類似,我們用切片來完成。首先喳整,我們創(chuàng)建一個數(shù)組,它的大小是原來的兩倍今缚。
將原始數(shù)組復(fù)制到新數(shù)組的每個像素中算柳。然后對每一個像素再做一次奇數(shù)列低淡。圖像縮放正確姓言,但是每一行都是黑色的,所以我們只需要將每一行復(fù)制到它下面的一行蔗蹋。這樣圖像尺寸翻了一倍何荚。

redimg
redimg = N.array(rgbarray)
redimg[:,:,1:] = 0
surfdemo_show(redimg, 'redimg')

現(xiàn)在我們使用3D數(shù)組來改變顏色。這里我們把綠色和藍(lán)色的所有值設(shè)為零猪杭。留下了紅色的通道餐塘。

soften
factor = N.array((8,), N.int32)
soften = N.array(rgbarray, N.int32)
soften[1:,:]  += rgbarray[:-1,:] * factor
soften[:-1,:] += rgbarray[1:,:] * factor
soften[:,1:]  += rgbarray[:,:-1] * factor
soften[:,:-1] += rgbarray[:,1:] * factor
soften //= 33
surfdemo_show(soften, 'soften')

這里執(zhí)行一個3x3的卷積濾波器來柔化圖像≡硭保看起來有很多步驟戒傻,但是所做的是將圖像的1像素移到每個方向,并將它們?nèi)考釉谝黄穑ㄓ靡恍┏朔▉肀硎緳?quán)重)蜂筹。然后平均所有的值需纳。它不是高斯函數(shù),但速度很快艺挪。在NumPy陣列的一點(diǎn)上不翩,算術(shù)運(yùn)算的精度是由具有最大數(shù)據(jù)類型的陣列決定的。
因此麻裳,如果因子沒有被聲明為numpy.int32的數(shù)組口蝠,那么將使用numpy.int8來執(zhí)行乘法,每個rgbarray元素是8位整數(shù)類型津坑。這將導(dǎo)致值截斷妙蔗。為了避免截斷,也必須聲明柔化數(shù)組的整數(shù)大小比rgbarray更大疆瑰。

xfade
src = N.array(rgbarray)
dest = N.zeros(rgbarray.shape)
dest[:] = 20, 50, 100
diff = (dest - src) * 0.50
xfade = src + diff.astype(N.uint)
surfdemo_show(xfade, 'xfade')

最后灭必,我們在原始圖像和純藍(lán)色的圖像之間交叉褪色。不難乃摹,目標(biāo)圖像可以是任何東西禁漓,改變?yōu)?.5倍可以讓你在兩個圖像之間選擇一個線性的交叉漸變。
希望在這一點(diǎn)上孵睬,看到如何使用surfarray來執(zhí)行特殊的效果和轉(zhuǎn)換播歼,而這些特效和轉(zhuǎn)換只可能在像素級別上實(shí)現(xiàn)。至少,您可以使用surfarray來做大量的表面處理秘狞。設(shè)置Surface.set_at() Surface.get_at()類型操作叭莫。但是不要認(rèn)為已經(jīng)完成了,還有很多東西要學(xué)雇初。

Surface 鎖定

與pygame的其他部分一樣减响,surfarray會在訪問像素數(shù)據(jù)時自動鎖定任何表面。不過刊橘,還有一件事需要注意颂鸿。在創(chuàng)建像素陣列時,原始表面將在該像素陣列的生命周期內(nèi)被鎖定败晴。記住這一點(diǎn)很重要栽渴。一定要“del”像素數(shù)組尖坤,或者讓它超出范圍(例如,當(dāng)函數(shù)返回時)熔萧。
還要注意糖驴,您真的不想在硬件表面(HWSURFACE)上做很多(如果有的話)直接像素訪問贮缕。這是因?yàn)閷?shí)際表面數(shù)據(jù)存在于顯卡上俺榆,而在pci/agp總線上傳輸像素并不快。

透明

surfarray模塊有幾種方法來訪問表面的alpha/colorkey值定嗓。所有的alpha函數(shù)都不會受到表面的整體透明性的影響萍桌,只是像素的alpha值上炎。下面是這些函數(shù)的列表。

surfarray.pixels_alpha(surface)

創(chuàng)建一個引用原始表面alpha數(shù)據(jù)的2D數(shù)組(整數(shù)像素值)寇损。這只適用于帶有8位alpha組件的32位圖像。

surfarray.array_alpha(surface)

創(chuàng)建一個從任何類型的表面復(fù)制的2D數(shù)組(整數(shù)像素值)芙沥。如果surface沒有alpha值而昨,那么數(shù)組將是完全不透明的值(255)卿捎。

surfarray.array_colorkey(surface)

創(chuàng)建一個2D數(shù)組(整數(shù)像素值)径密,它被設(shè)置為透明(0)享扔,無論哪個像素的顏色與Surface的顏色匹配。

Other Surfarray Functions

在surfarray中籽懦,只有很少的其他功能可用氛魁。您可以在surfarray參考頁面上獲得一個更好的列表秀存,其中包含更多的文檔。不過惫恼,有一個非常有用的功能澳盐。

surfarray.blit_array(surface, array)

這將把任何類型的2D或3D表面陣列轉(zhuǎn)換到相同維度的表面。這個surfarray blit通常比為一個被引用的像素數(shù)組要快得多腕窥。盡管如此簇爆,它不應(yīng)該像正常的表面那樣快,因?yàn)檫@些都是經(jīng)過優(yōu)化的拦惋。

更多高級 NumPy

關(guān)于NumPy數(shù)組厕妖,你應(yīng)該知道一些挑庶。當(dāng)處理非常大的數(shù)組時迎捺,比如640x480的大數(shù)組,有一些額外的東西需要注意抄沮。主要是岖瑰,在使用像+和*這樣的操作符蹋订。這些操作符必須對數(shù)組的臨時副本復(fù)制到另一個數(shù)組中。這可能會耗費(fèi)很多時間椒功。幸運(yùn)的是动漾,所有的NumPy操作符都有特殊的功能暇赤,可以執(zhí)行“就地”操作防症。
例如碘橘,您想要替換屏幕:=screen+brightmap和更快的添加(屏幕阐枣、brightmap吼鳞、屏幕)赔桌。無論如何,您需要閱讀NumPy UFunc文檔音诫,了解更多關(guān)于這方面的內(nèi)容竭钝。在處理數(shù)組時雹洗,它是很重要的时肿。
在使用NumPy陣列時,需要注意的另一件事是陣列的數(shù)據(jù)類型旦签。一些數(shù)組(特別是映射的像素類型)通常返回帶有無符號8位值的數(shù)組顷霹。如果您不小心击吱,這些數(shù)組很容易溢出覆醇。NumPy將使用您在C程序中相同的強(qiáng)制方法炭臭,因此將一個操作與8位數(shù)字和32位數(shù)字混合在一起將會得到32位數(shù)字的結(jié)果鞋仍。你可以轉(zhuǎn)換數(shù)組的數(shù)據(jù)類型威创,但是一定要知道你有什么類型的數(shù)組,如果NumPy在一個精度被破壞的情況下溃斋,它會引發(fā)一個異常吸申。
最后,請注意蛉威,當(dāng)在3D數(shù)組中分配值時走哺,它們必須在0到255之間,否則就會得到一些未定義的截斷齐帚。

畢業(yè)了

好了对妄,快速入門的數(shù)字Python和surfarray敢朱。希望現(xiàn)在你明白了什么是可能的拴签,即使你從來沒有使用它們,你也不必害怕看到代碼所做的事情构灸。查看vgrade示例喜颁,以獲得更多的數(shù)字?jǐn)?shù)組操作半开。也有一些“火焰”演示使用surfarray來創(chuàng)建一個實(shí)時的火效果寂拆。
最重要的是抓韩,自己嘗試一些事情园蝠。一開始慢慢來彪薛,我已經(jīng)看到了一些很棒的東西,比如徑向漸變那樣的少态。祝你好運(yùn)彼妻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屋摇,一起剝皮案震驚了整個濱河市幽邓,隨后出現(xiàn)的幾起案子炮温,更是在濱河造成了極大的恐慌,老刑警劉巖牵舵,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒啤,死亡現(xiàn)場離奇詭異,居然都是意外死亡畸颅,警方通過查閱死者的電腦和手機(jī)担巩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來没炒,“玉大人涛癌,你說我怎么就攤上這事】耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵骨稿,是天一觀的道長。 經(jīng)常有香客問我辙浑,道長倦踢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上腮介,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好腾节,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布劈榨。 她就那樣靜靜地躺著,像睡著了一般旱函。 火紅的嫁衣襯著肌膚如雪含长。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天涛酗,我揣著相機(jī)與錄音燕刻,去河邊找鬼。 笑死过蹂,一個胖子當(dāng)著我的面吹牛酷勺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼字管,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丁逝,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罪既,失蹤者是張志新(化名)和其女友劉穎丢间,沒想到半個月后柬甥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年漾肮,在試婚紗的時候發(fā)現(xiàn)自己被綠了谭溉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损搬。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沽瞭,死狀恐怖吠架,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拐辽,我是刑警寧澤赊舶,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布睁搭,位于F島的核電站,受9級特大地震影響笼平,放射性物質(zhì)發(fā)生泄漏园骆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一寓调、第九天 我趴在偏房一處隱蔽的房頂上張望载萌。 院中可真熱鬧炒考,春花似錦帘靡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火惊。三九已至求类,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屹耐,已是汗流浹背尸疆。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿弱。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓犯眠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親症革。 傳聞我的和親對象是個殘疾皇子筐咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容