iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

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

不要太認真學 Python! - Day 29

  • 分享至 

  • xImage
  •  

[前情提要]

今天颱風天,真的很認真的研究的一天怎麼把背景和人物放進我的 pygame 小淘氣裡面。

https://ithelp.ithome.com.tw/upload/images/20190930/20120423EiKkBsHqER.jpg

大家猜猜看結果會是怎樣吧?


一樣先上一段程式碼:

import pygame
import random

pygame.init()

black = (0, 0, 0)
green = (91,231,196)
  
gameNaughtybox = pygame.display.set_mode((600,600))
pygame.Surface((600,600))
dest = (600,600)

pygame.display.set_caption("Naughty Box")

walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')]
walkLeft = [pygame.image.load('Angel-1-7.png'), pygame.image.load('Angel-1-6.png')]
bg = pygame.image.load('pipo-battlebg007b.png')
bg.blit(bg,(600,600))
pygame.display.flip()

class Player(pygame.sprite.Sprite):
    character=[pygame.image.load("Angel-1-4.png")]

BGM = [pygame.mixer.music.load("NES - CIRCUS CHARLIE-B(stage1_stage5).mp3")]
pygame.mixer.music.play()

clock = pygame.time.Clock()

x = 50
y = 50
width =65
height = 65
vel = 8
isJump = False
jumpCount = 15
left = False
right =False
walkCount = 0

def redrwnewWindow():
    global walkCount
    gameNaughtybox.blit(bg, dest, area=None, special_flags = 0)
    if walkCount + 1 >= 29:
        walkCount = 0
    if left:
        gameNaughtybox.blit(walkLeft)[walkCount//3. (x,y)]
        walkCount +=1
    elif right:
        gameNaughtybox.blit(walkRight[walkCount//3], (x,y))
        walkCount +=1
    else:
        gameNaughtybox.blit(character)
                        
    pygame.display.update()

run = True
while run:
    clock.tick(29)
    gameNaughtybox.blit(bg, dest, area=None, special_flags = 0)
    
    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
        left = True
        right = False
    elif keys [pygame.K_RIGHT] and x < 600 - width - vel:
        x += vel
        left = False
        right = True
    elif keys [pygame.K_UP] and y > vel:
        y -= vel
        right = True
        left = True
    elif keys [pygame.K_DOWN] and y < 600 - height - vel:
        y += vel
        right = False
        left = False
    else:
        right = False
        left = False
        walkCount = 0
        
    if not (isJump):
        if keys [pygame.K_UP] and y > vel:
            y -= vel
        if keys [pygame.K_DOWN] and y < 600 - height - vel:
            y += vel
        if keys [pygame.K_SPACE]:
            isJump = True
            right = False
            left = False
            walkCount = 0
    else:
        if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10    

    redrawnewWindow()
                        
pygame.quit()

先來說說本日學習重點吧!

1. 置入背景
想要把黑背景變成彩色的背景。
2. 置入圖片,將方塊變成實體角色
希望能置入圖片把前幾天的淘氣小方框變成真正的小蘿莉。

基於上載音樂的經驗,我覺得上載背景和角色素材應該不難。

1. 把素材放進同一個資料夾

這個應該不用多說了吧!昨天已經大篇幅介紹過了。
詳情請見最下方超連結。

2. 前置作業最重要:圖片素材檔名要整理!!!

圖片上載的開頭和昨天上載音樂相似,在這裡「上載圖片」的關鍵字,就是 pygame.image.load

BUT!!!

圖片不像音樂一樣可以一首用到底。
可能會有很多人物和背景等等,因此會需要一次上載多張照片。
這個就比較麻煩,要一張一張鍵入素材檔名。

這也是我說的,要先將素材的檔名整理好,建議同類型的,用統一的檔名,這樣上載檔案的時候,比較好寫程式。

以下是我程式碼:

walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')]
walkLeft = [pygame.image.load('Angel-1-7.png'), pygame.image.load('Angel-1-6.png')]
bg = pygame.image.load('pipo-battlebg007b.png')

值得注意的是,如果一個指令有一張以上的圖片要執行,就要用頓號隔開像是 walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')] 裡面 pygame.image.load('Angel-1-3.png')pygame.image.load('Angel-1-1.png')] 中間就有頓號。

圖片的程式碼要上在哪裡比較好呢?

我會把它放在最一開頭「建立遊戲框」之後。

3. 上程式碼:「Surface」、「blit」

現在來讓圖片顯示吧!!!

在上程式碼之前一樣要先認識上圖片素材的關鍵字 Surfaceblit

A. Surface

在最一開始設計遊戲的時候,曾經建立一個 gameNaughtybox = pygame.display.set_mode((600,600)),這個設定是遊戲框的大小,但是這裡要設定的 Surface 是指可以繪圖的區域大小。

我的理解是 Surface 有點像圖層的概念,它就是一個圖層,這個圖層就是用來畫圖的。

因此,我在 gameNaughtybox = pygame.display.set_mode((600,600)) 下方,建立了一個 Surface : pygame.Surface((600,600)),大小我設定和遊戲框一樣大。

A. blit

我的理解是素材移動,就是把 A圖層的部分或全部圖像素材 移動到 B圖層。
bg.blit(bg,(600,600),gameNaughtybox,(0,0))

但是,當我打完以後就出現了...
「TypeError: an integer is required (got type tuple)」

天阿...
https://ithelp.ithome.com.tw/upload/images/20190930/2012042397VGgcJ3Ec.jpg

好的,回歸理性,暫且不提這個錯誤。

我在寫還有測試的過程中,還有想到一些問題。

  1. 圖片的大小是否會影響顯示與否?
    也就是說,圖片的像素比遊戲框還要大,那可以顯示出來嗎?
  2. 如果能顯示,那是否會影響顯示的快慢?
    如果像素比遊戲框還要大的圖片能顯示出來,那是否會比較慢顯示出來。
  3. 在找資料的過程中,還有看到FPS(畫面更新率),其中還有幀數問題。
    pygame應該也有這個問題。
  4. 遊戲角色與框架(frame)之間的關係
    遊戲角色移動的時候,往左往右幾步不會超出遊戲框,這個要怎麼計算...

啊...也太多問題了吧...

我只是想要用一個小遊戲當專題,怎麼這麼難啊~~~

https://ithelp.ithome.com.tw/upload/images/20190930/201204231aXuJBkKQa.jpg

雖然懷疑人森,但是明天還是會繼續研究怎麼解決...

https://ithelp.ithome.com.tw/upload/images/20190930/20120423Y7y5qmwGmr.jpg

颱風天風不平浪不靜
打code打到只想靜靜

靜靜收工)泣

別問我靜靜是誰!


不要太認真學 Python! - Day 28


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

1 則留言

1

你的bg是一張圖片,應該要用來自 pygame.display.set_modegameNaughtybox .... 吧XD

gameNaughtybox.blit(bg,(600,600))

(我猜的XD

RGB iT邦新手 5 級 ‧ 2019-10-02 01:06:19 檢舉

謝謝你的提點,很受用!

我要留言

立即登入留言