iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

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

不要太認真學 Python! - Day 27

  • 分享至 

  • 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 = 8

isJump = False
jumpCount = 15

run = True
while run:
    pygame.time.delay(20)
    
    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 - vel:
        x += vel
    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
    else:
        if isJump >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10

    gameNaughtybox.fill((0,0,0))
    
    pygame.draw.rect(gameNaughtybox, (247,80,0), (x, y, width, height))
    pygame.display.update()
    
    
pygame.quit()

話果然不能說的太早...
真的是有難度啊!!!!!

1. 要先「定義」關鍵字

這之前要記得在最一開始「定義」跳躍的關鍵字,我是放在x = 50 y = 50 width =60 height = 60 vel = 8 下面,在下面多加兩行「定義」:

isJump = False
jumpCount = 15

2.加入執行動作

接著就是要使用昨天的程式碼,如下:

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

要在上面的程式碼中間加上執行動作。

思考點1

首先,要選什麼按鍵執行「跳」這個動作。
我也很老套的選擇了空白鍵(Space)

因此,除了上下左右鍵以外,下面還要加上 Space 鍵的指令,
變成下方的指令碼:

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
if keys [pygame.K_SPACE]:
    isJump = True

思考點2

按左右鍵的時候,不可以跳。
按上下鍵的時候,可以跳。

這個要用 if/else,所以接下來就是要把 if/else 填進去,
變成下面這樣:

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 not (isJump):
    if keys [pygame.K_UP] and y>vel:
        y-=vel
    if keys [pygame.K_DOWN] and y<600-height:
        y+=vel
    if keys [pygame.K_SPACE]:
        isJump = True
else:

思考點3

「跳」這個動作是怎麼樣運作的?

老實說,這個在看教程以前,還真的沒有思考過這個問題。
今天看了教程,覺得真的很有趣,所以決定把它圖像化來表示。


好的,我竟然為了製圖,文章寫不完...
文字候補...

https://ithelp.ithome.com.tw/upload/images/20190929/20120423xnhq1FDiLH.jpg

文章越來越長(?
希望能把自己的想法更條理化。


題外話,在製圖的過程中,突然覺得我真的是個很熱愛影像的人欸~)大笑

https://ithelp.ithome.com.tw/upload/images/20190929/20120423vvo2v90by2.png

https://ithelp.ithome.com.tw/upload/images/20190929/2012042316F7kF0uL4.png

看到上面的圖,就可以開始用座標來思考了。
如果不是在螢幕上的坐標,是在紙上的座標,假設物體從45度角彈出去,然後再從45度角降落,那就是從(0,0)彈到(3,3),在那裡停留以後,再從那裡降落到(5,5),這時候可以發現距離有點像是平方的概念。

因此可以開始試寫程式了,程式碼如下:

keys = pygame.key.get_pressed()
    
    if keys [pygame.K_LEFT] and x > vel:
        x -= vel
    if keys [pygame.K_RIGHT] and x < 600 - width - vel:
        x += vel
    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
    else:
        if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10

仔細檢視 y -= (jumpCount ** 2) * 0.5 * neg 就是這個概念。

但是,我必須要說

if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10

這段程式碼,我自己只能意會,不能言傳。像是 neg = 1neg = -1jumpCount = 1 這裡我還是不能參透。

不過這時候我必須要大力稱讚教程中的老師,這個老師真的很棒,他說了一段話就是「不會的話就先跳過,複製貼上以後,再慢慢弄懂它就好了」。對的!!!我也是很喜歡這種方式啊,看多了,總有一天會開竅的!!

https://ithelp.ithome.com.tw/upload/images/20190929/20120423hrR7m6YIyj.jpg

給大家看今天的成果吧!!!
小淘氣跳跳影片

是說為什麼上傳影片只能先傳到youtube,有點麻煩啊...

最後,附上我看的教學影片,我覺得很淺顯易懂,很適合新手學習。
Yes


還有這幾天有在想,要怎麼替這個活動劃下句點。
今天有想到了,揪讓 我們 我自己拭目以待吧!!!


不要太認真學 Python! - Day 26


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

尚未有邦友留言

立即登入留言