摘要:條形表在頂部,我們將用這個來檢查要顯示的條子,以及球擊中后要移除的條子。最后的職能是唯一的變化是我們初始化了,和輸入的圖像。我們正在創建我們的欄桿,但沒有顯示它們。我還想做一件事。
? ? ? ?前兩天不是中秋節嗎,放了幾天假,所以我就回家過節去了,也是沒時間給大家更新,回家親戚朋友多嘛,所以我侄兒子看到我在和別人玩和平精英,他也要玩,我以為他會,結果連東西都不會搜,就知道讓我找飛機給他開!看得出,應該是看別人玩的多,自己基本沒有玩過,但是他這么菜,我不能讓他坑我的隊友啊,畢竟也是分段比較高的局了,于是我就掏出筆記本寫了款非常簡單的游戲給他玩!沒想到一玩上手了,家也不回了,玩到大晚上還念念不忘,說明天還來玩哦!
這款小游戲非常簡單,也適合5,6歲的小朋友玩!看下效果
這里提供了所有代碼:點這里領取
安裝游戲庫:
pip install pgzero
我們要做的第一件事是打開一個空窗口:
import pgzrunTITLE = "Arkanoid clone"WIDTH = 800HEIGHT = 500pgzrun.go()
我們進口游戲零。標題顯示在窗口上的標題,其他兩個變量定義寬度和高度。Go()運行程序。
您將看到一個空白窗口:
?
?
接下來,讓我們展示一些街區。
在高度和寬度下面添加以下代碼:
WIDTH = 800HEIGHT = 500paddle = Actor("paddleblue.png")paddle.x = 120paddle.y = 420ball = Actor("ballblue.png")ball.x = 30ball.y = 300
?
是PyGames 0顯示圖像的方式。圖像總是存儲在
影象
文件夾位于與游戲腳本相同的位置。
? tree.├── game.py└── images ├── ballblue.png └── paddleblue.png1 directory, 3 files
我們還設置了正在加載的圖像的起始x和y位置:
paddle.x = 120paddle.y = 420
這些值可以是任意的,我通過反復試驗得到了上面的結果。
因此,我們將圖像加載到內存中,但我們還沒有顯示它們。我們現在就解決這個問題。PgZero有一個內置的抽簽()函數,該函數在啟動游戲時自動調用。還有一個更新函數,每秒調用60次,并在移動時更新屏幕。
更新VS繪圖功能
更新和繪制函數是相似的--除非更新每秒調用60次,而只有在某些事情發生變化時才調用繪圖。
沒有硬和快速的規則,但我會使用更新的東西,很多變化,如鍵盤運動,球運動等,而背景圖像可以在繪制。
畫槳和球
現在,我們將只在屏幕上繪圖,并將UPDATE保留為空:
def draw(): paddle.draw() ball.draw() def update():?
?
?
我還有一件事要做。背景很無聊--讓我們把它整理一下吧。
讓我們更新繪圖功能:
def draw(): screen.blit("background.png", (0,0)) paddle.draw() ball.draw()
背景是一個文件Background.png在……里面影象。這個布利特()函數將我們的圖像繪制到屏幕上。(0,0)表示從x=0y=0開始。我們將在下面討論更多關于PyameZero坐標系的內容。
?
?
好多了。
接下來,我們要列出我們的球將擊中的所有頂部的欄桿。
在我們的目錄中有一些條形圖,我們將使用它們。首先,布局1欄:
bar = Actor("element_blue_rectangle_glossy.png")bar.x=120bar.y=100def draw(): bar.draw()?
?
?很明顯,一次只放一個欄桿是很痛苦的。讓我們使用一個for循環來放置多個。
def draw(): bar_x = 120 bar_y = 100 for i in range(8): bar = Actor("element_blue_rectangle_glossy.png") bar.x = bar_x bar.y = bar_y bar.draw() bar_x += 70
?我們創建了開始的x和y變量-棒x初始化為120和棒Y初始化為100我們繞8圈。為什么是8?因為這就是我們能舒服地坐在屏幕上的酒吧。
對于每個循環,我們創建一個Actor并初始化它的x和y,并將其繪制到屏幕上。然后我們會:
bar_x += 70
使下一個條形圖向左移動70個像素。再一次,我通過反復試驗找到了70個。嘗試更改值,然后看到條形圖重疊或相距太遠。
運行代碼:
?
?
?好的。現在我們也要把其他的欄桿都布置好。我計劃有三排不同顏色的。
我要做的第一件事是將上面的代碼解壓縮到一個函數中:
def draw(): screen.blit("background.png", (0,0)) paddle.draw() ball.draw() place_blue_bars()def place_blue_bars(): bar_x = 120 bar_y = 100 for i in range(8): bar = Actor("element_blue_rectangle_glossy.png") bar.x = bar_x bar.y = bar_y bar.draw() bar_x += 70
我所做的就是將代碼解壓縮成一個函數放置藍條()現在,我可以創建更多的函Create_red_bar(等但我相信我們可以做得更聰明。所以我將有一個一般的函數Place_bar():
def place_bars(x,y,image):
我們還將創建另一個全局變量。條形表=[]在頂部,我們將用這個來檢查要顯示的條子,以及球擊中后要移除的條子。
我們將傳遞第一個條形的起始x和y,加上我們想要使用的圖像。最后的職能是:
def place_bars(x,y,image): bar_x = x bar_y = y for i in range(8): bar = Actor(image) bar.x = bar_x bar.y = bar_y bar_x += 70 bars_list.append(bar)
唯一的變化是我們初始化了x,y和輸入的圖像。
我們將在游戲主代碼開始之前調用這個函數。
Pgzero.run()
coloured_box_list = ["element_blue_rectangle_glossy.png", "element_green_rectangle_glossy.png","element_red_rectangle_glossy.png"] x = 120 y = 100
我們有一個包含3幅圖像的列表,我們初始化了x和y值。然后我們循環遍歷我們的列表:
for coloured_box in coloured_box_list: place_bars(x, y, coloured_box) y += 50
我們需要做一個
Y+=50
在每個循環中,否則,條子將放置在彼此的頂部。
最后代碼:
coloured_box_list = ["element_blue_rectangle_glossy.png", "element_green_rectangle_glossy.png", "element_red_rectangle_glossy.png"] x = 120 y = 100 for coloured_box in coloured_box_list: place_bars(x, y, coloured_box) y += 50
還有一件事要做。我們正在創建我們的欄桿,但沒有顯示它們。更新繪圖功能:
def draw() for bar in bars_list: bar.draw()?
?
?我們有漂亮的布局。我們現在可以開始研究邏輯了。
移動槳
讓我們從移動我們的槳開始。這是相當容易的,在游戲零-你可以直接檢查鍵盤事件。讓我們更新我們的更新()技巧:
def update(): if keyboard.left: paddle.x = paddle.x - 5 if keyboard.right: paddle.x = paddle.x + 5
如果鍵盤左
檢查左鍵是否按下,如果是,則將槳的x位置更改為-5(即向左移動5個像素)。正確的鑰匙也是一樣。
為什么我要選擇5個像素?在移動太快/太慢之間找到平衡。嘗試將值更改為1和10,看看會發生什么。
按左右鍵-你現在可以移動槳了。
?
?
?
移動球
記住,內置的UPDATE()方法每秒調用60次。因此,任何游戲邏輯,如移動球,檢查碰撞等都會出現在這里。我們將創建一個名為更新球()我們會從更新().
def update(): update_ball()def update_ball(): ball.x -= 1 ball.y -= 1
我們要改變球的x和y位置。
關于PYGERO零坐標系的一點看法
?
?
屏幕左上角為0,0;即x=0,y=0。
當你往右走,x就會增加。
當你下去的時候,y會增加。
所以向左移動,減小x。向右移動,增加x。
下去,增加你。向上,減少你。
考慮到這一點:
Ball.x-=1
向左移動球(as-1=左,+1=右)
Ball.y-=1
將球向上移動(as-1=向上,+1=向下)
所以在開始的時候,球會向上和左邊移動。這只是一個隨機的決定-你可以很容易地選擇下來和正確的。但我會堅持下去,現在,我可以給你們看一個問題:
?
?
?
?球飛離了屏幕!哈!
我們需要增加檢查,這樣如果它撞到墻上,它就會反彈回來。這是物理部分。
現在再加上那張支票。
首先,讓我們為x和y的速度添加一個全局變量。將這些全局VAR添加到文件的頂部:
ball_x_speed = 1ball_y_speed = 1
左/右和上/下的速度是1像素。您可以嘗試增加這個數字,以使球跑得更快(從而增加難度),但我們將堅持1,因為它使測試變得容易。
讓我們在函數中使用這個變量:
def update_ball(): global ball_x_speed, ball_y_speed ball.x -= ball_x_speed ball.y -= ball_y_speed
代碼和以前一樣,只是用變量替換了‘1’。我們現在把加起來。
if (ball.x >= WIDTH) or (ball.x <=0): ball_x_speed *= -1
如果x超過我們為游戲定義的最大寬度(即超出屏幕的右側),或低于0(即超出屏幕的左邊),那么:
ball_x_speed *= -1
這是什么意思?記住,每次更新的時候我們都是按球的速度前進的。首先,我們向上移動,然后離開。
在這里,我們把速度乘以-1。所以,如果球向左移動,它就會開始向右移動,反之亦然。
結果是,球一碰到邊界,就會改變方向。
對于y軸,我們也可以這樣做:
if (ball.y >= HEIGHT) or (ball.y <=0): ball_y_speed *= -1
再一次,我們檢查球是在屏幕上方還是下面。最后的職能是:
def update_ball(): global ball_x_speed, ball_y_speed ball.x -= ball_x_speed ball.y -= ball_y_speed if (ball.x >= WIDTH) or (ball.x <=0): ball_x_speed *= -1 if (ball.y >= HEIGHT) or (ball.y <=0): ball_y_speed *= -1
讓我們測試代碼:
?
?
?太酷了,所以球會從墻上跳下來。但它仍然穿過街區。我們來解決這個問題。
在PyameZero中實現碰撞檢測
在UPDATE函數中,我們添加此代碼以檢測沖突:
def update(): update_ball() for bar in bars_list: if ball.colliderect(bar): bars_list.remove(bar)
讓我們逐行檢查代碼。
我們繞著欄桿:
for bar in bars_list:
對于每個酒吧,我們檢查球是否與之碰撞:
if ball.colliderect(bar):
對撞機()是一個內置的函數,它檢查兩個對象是否發生碰撞;在本例中,是球體和棒子。
如果它們發生碰撞,我們從列表中刪除該條:
if ball.colliderect(bar): bars_list.remove(bar)
記住,這些條是在
抽簽()
功能?
for bar in bars_list: bar.draw()
如果我們從列表中刪除該條,它將不再被繪制,從而從屏幕上消失。
運行代碼以檢查它是否有效:
好的,那很好,但是球像刀子一樣穿過塊。這不是我們想要的。我們想讓球在擊中蓋子時反彈。
幸運的是,有一個簡單的解決方案:
for bar in bars_list: if ball.colliderect(bar): bars_list.remove(bar) ball_y_speed *= -1 # ==> this is the new code
最后一行是新代碼--我們改變了球的y方向--所以如果它上升了,它就會開始下降。
我還想做一件事。在真正的阿肯色州,當球擊中塊或槳,它可以左或右,模擬現實世界彈球樣的“物理”。是的,這并不完美,但它給比賽增添了一些樂趣,因為你不知道球會去哪里。
我將為此添加代碼:
# randomly move ball left or right on hit rand = random.randint(0,1) if rand: ball_move_x *= -1
當球擊中一個街區,我們將隨機,大約50%的時間,改變方向。所以如果球向右,它可能會開始向左移動。
我們還有最后一件事要做。
把球從我們的槳上彈下來
我將分享代碼--你現在應該能夠理解它了:
if paddle.colliderect(ball): ball_y_speed *= -1 # randomly move ball left or right on hit rand = random.randint(0,1) if rand: ball_x_speed *= -1
再次,我們檢查球是否與槳碰撞,如果是,改變它的y方向。隨機改變x方向。
你現在應該可以玩這個游戲了:
1)代碼中有一個很大的錯誤--如果它落在槳下,游戲就會繼續進行。實際上,你永遠不會輸!
你需要改變邏輯,這樣如果球落在槳下,游戲就結束了。在下一個例子中,我們將看到如何在屏幕上創建一個游戲,現在只需將其打印到控制臺即可。
2)試著增加分數--所以每次你碰到一個街區,你就能得到1分。同樣,只需將得分打印到控制臺即可。
對于加分,對于不同顏色的塊有不同的分數。提示:您需要將塊存儲在不同的列表中,這樣您就可以根據您點擊的顏色來檢查分數。
那么你學會了嗎?需要代碼記得看前文哈!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121154.html
摘要:本博客貓叔的博客,轉載請申明出閱讀本文約分鐘適讀人群互聯網工作者游戲愛好者吃雞嗎本文部分素材摘抄自最前線騰訊吃雞游戲或借殼變現,絕地求生成為和平精英。我比較少玩吃雞幾乎沒有,不過對于游戲的好奇感一直高于其他行業。 本博客 貓叔的博客,轉載請申明出閱讀本文約3分鐘適讀人群:IT/互聯網工作者、游戲愛好者 吃雞嗎? showImg(https://segmentfault.com/img...
摘要:最近看到一個很有未來感的新聞一輛特斯拉在拉斯維加斯出了車禍,撞死了一個機器人。不知道是意外還是炒作,又或者是這位機器人故意碰瓷,反正人們也無法從受害者口中了解被特斯拉撞是怎樣一種體驗了。像星際爭霸之類的經典游戲都有過類似的比賽。 最近看到一個很有未來感的新聞: 一輛 特斯拉 在拉斯維加斯出了車禍,撞死了一個……emmmm……機器人。不知道是意外還是炒作,又或者是這位機器人故意碰瓷,反...
摘要:十年,轉瞬即逝,人生進入下半場。沒想到,公司在短短年時間里就上市了,作為頭部員工,他獲得了不菲的回報。他其實挺喜歡寫代碼的,但程序員工資還是低了點。就像養狗一樣,要有規矩。去年為了還貸款,還變賣了一套。 風險預警。本文屬于毒雞湯系列,經過文學渲染,讀后或產生焦慮,有相關抵制者慎入。 十年,轉瞬即逝,人生進入下半場。眾生皆苦,萬相本無。且看風云變幻,慢品苦辣酸甜。小姐姐味道微信公眾號首發。 ...
閱讀 2968·2023-04-25 19:45
閱讀 2690·2021-11-19 09:40
閱讀 690·2021-10-14 09:49
閱讀 2667·2021-09-30 09:47
閱讀 2201·2021-09-26 09:55
閱讀 1220·2021-09-22 16:01
閱讀 2808·2019-08-30 14:19
閱讀 705·2019-08-29 16:44