iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

不要太認真學 Python! 之 我又重新報名了系列 第 23

不要太認真學 Python! - Day 26

  • 分享至 

  • xImage
  •  

[前情提要]

昨天想要讓我的「小淘氣」動作,但是它就是不理我。
肯定是跟主人有相同的習性...「懶得動」
總之,我看我進度要慢慢來了。
不要又再肖想可以兩天就做好遊戲了!!!


import pygame
import random

pygame.init()

black = (0, 0, 0)
green = (91,231,196)

gameNaughtybox = pygame.display.set_mode((600,600))

pygame.display.set_caption("Naughty Box")

gameNaughtybox.fill(black)

x = 50
y = 50
width =60
height = 60
vel = 6

run = True
while run:
    pygame.time.delay(50)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False 
            
    keys = pygame.key.get_pressed()
    
    if keys [pygame.K_LEFT] and x>vel:
        x-=vel
    if keys [pygame.K_RIGHT] and x<600-width:
        x+=vel
    if keys [pygame.K_UP] and y>vel:
        y-=vel
    if keys [pygame.K_DOWN] and y<600-height:
        y+=vel
    
    gameNaughtybox.fill((0,0,0))
    
    pygame.draw.rect(gameNaughtybox,green, (x, y, width, height))
    pygame.display.update()
    
    
pygame.quit()

我今天再重新看過一次原始碼,然後也重新看教程。
我覺得用看的很容易覺得每行都理所當然,覺得沒什麼問題。


又得後補了。
自從參加這個比賽,好像重回學生生涯,每天趕死線)笑哭


接續上面的話題。

實際自己寫程式的時候就會發現,這個語法好像不太懂,那個段落剛剛看沒問題,但是自己寫的時候就會覺得「天阿!原作寫這是天書嗎?還是剛剛自己腦門被打到了,怎麼一瞬間又矇了」。

https://ithelp.ithome.com.tw/upload/images/20190928/20120423uQZCJvtlP2.jpg

這也是我在後半段參賽的過程中,逼自己一定要帶程式碼在文章裡的原因,因為要親自打才知道問題,光看是不會知道自己的盲點的,就算發出來的程式碼外人看起來是基礎到一個不行,或是錯也沒有關係,但是肯定要 每天告訴自己要打code才會進步比較快 。這點想要分享給其他跟我一樣完全零基礎的學習者。

Practice makes perfect.


再回頭來看看那段程式碼,昨天那段程式碼也太悲催了吧,怎麼感覺特別的混亂。

我發現自己有一個問題,就是我似乎很愛用奇怪的詞命名,每次看其他人的命名就覺得特別工整,但是相對的也是有那麼一點無聊(?

https://ithelp.ithome.com.tw/upload/images/20190928/20120423J62kImC1u6.jpg

總之,目前正在學習簡化,希望能寫出有趣又好玩的程式碼!

今天學習的重點:

1. pygame.time.delay(50)

那個底累括號 50 到底是在說什麼?
簡單來說 Pygame 中的時間是以毫秒(也就是千分之一秒)表示的,這段程式碼就是遊戲設計者想要讓程式暫停多久時間。

delay(50) 就是表示時間暫停千分之五十秒,也就是0.05秒。

2. 遊戲框也要命名啊!

pygame.display.set_caption("Naughty Box")

這是為了讓遊戲上方的遊戲介面能出現自己想要的名稱。

3. 不要忘記,是在做「動態」的形狀

昨天就是卡死在這個環節,因為會忘記自己不是要做單純的圖形。

https://ithelp.ithome.com.tw/upload/images/20190928/20120423l2X76HrKeK.jpg

今天要做的是會動的形狀,因此不能只畫出固定的邊長,而是要找出矩形在遊戲介面左上角起始的座標、長寬和速度。

因此我寫了下面這段程式碼:

x = 50
y = 50
width =60
height = 60
vel = 6

其中vel = 6,一開始根本不知道那是什麼......
谷歌了一下,其實也可以用 speed 來代替,就是速度(velocity)的意思。

4. 建立活動

因為目前還沒做過其他遊戲,但是我猜大部分的 pygame 都會需要「建立活動」,程式碼如下:

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False 

「event」是什麼呢?

就我的認知是,舉凡滑鼠移動、鍵盤上下左右等等動作,都可以稱之為活動。

因此,要先建立活動,讓系統知道有一場「遊戲」準備進行。

5. 遊戲按鍵(Keys)設定

因為想要讓方塊自由移動,因此要設定用哪幾個按鍵可以操作它。
我選擇上下左右鍵,程式碼如下:

    keys = pygame.key.get_pressed()
    
    if keys [pygame.K_LEFT] and x>vel:
        x-=vel
    if keys [pygame.K_RIGHT] and x<600-width:
        x+=vel
    if keys [pygame.K_UP] and y>vel:
        y-=vel
    if keys [pygame.K_DOWN] and y<600-height:
        y+=vel

我覺得最困難的就是這裡了,剛開始搞不動到底該怎麼設定,才不會讓方塊超出遊戲框,後來看到下方這個方式,我自己覺得有點深奧,但是多看幾次就容易多了。

x>velx<600-widthy>vely<600-height 到底是在幹嘛的呢?

這個還是一定要先提出來,就是再三提醒 「Pygame 遊戲介面左上角座標是「(0,0)」

在製作遊戲的過程中,經常需要思考座標位置,也就不能忘記起始座標了!

因此,以x>vel 為例就是依照前台介面左上角座標(0,0),然後要因為點選按鍵左的話,為了不要讓它超過左邊的邊界,因此設定成邊界一定要大於vel才行。

6. 「循環覆蓋」圖形

我覺得這是整個遊戲最抽象的一個概念了。
簡單來說,雖然我做了一個矩形,也成功讓它動了。
但是,在移動的過程中,其實比較像是複製矩形,因此會得到一條像貪吃蛇一樣的連續矩形圖。

但是,當我們只想要讓前臺顯示一個矩形的時候,這時候就要逆向思考,也就是不斷的使用舊有的覆蓋住舊的矩形,因此有了下面這段程式碼:

gameNaughtybox.fill((0,0,0))

其中色號可以隨著自己挑的背景去做更改。
stack overflow 真的是我學習的好夥伴啊)感動哭
Pygame sceen.fill() not filling up the color properly

以上,就是今日的學習重點。
看到方塊動的時候也是好感動啊!!!

因為真的很怕做不出來自己想要的結果啊!!!

https://ithelp.ithome.com.tw/upload/images/20190928/20120423PSvSb4lOFV.jpg

希望明天可以讓他彈跳!!!

今天總算可以收工了。
TGI finished!!!

開心收工。


不要太認真學 Python! - Day 25


上一篇
不要太認真學 Python! - Day 25
下一篇
不要太認真學 Python! - Day 27
系列文
不要太認真學 Python! 之 我又重新報名了31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言