用Pygame和Python做遊戲-從入門到精通11

pythontab發表於2012-12-20
上次我們說明了使用鍵盤操作遊戲,鍵盤是非常古老的輸入裝置,甚至筆計算機本身都要古老的多,因為它發源於打字機,貌似1868年就有成熟的打字機問世了。不得不說的是,現在最常用的鍵位排部,並不是最科學的,相比上一次說過的DUORAK鍵盤,打字者的手指平均每日運動1英里,而QWERTY則是12到20英里。當然這對遊戲毫無意義……

相比而言,滑鼠非常的年輕,世界上最早的滑鼠誕生於1964年,它是由美國人道格·恩格爾巴特(Doug Engelbart)發明的。IEEE協會把滑鼠的發明列為計算機誕生50年來最重大的事件之一,可見其對IT歷程的重大影響作用。1983年蘋果公司給自家的電腦安上了滑鼠,使用者就開始離不開這個小東西了。而現代遊戲,離開了滑鼠,99%的都沒法玩!我們自然得好好研究如何使用滑鼠來操控我們的遊戲。

使用滑鼠控制精靈

我們已經看到如何畫一個游標了,只是簡單的在滑鼠座標上畫一個影像而已,我們可以從MOUSEMOTION或者pygame.mouse.get_pos方法來獲得座標。但我們還可以使用這個座標來控制方向,比如在3D遊戲中,可以使用滑鼠來控制視角。這種時候,我們不使用滑鼠的位置,因為滑鼠可能會跑到視窗外面,我們使用滑鼠現在與上一幀的相對偏移量。在下一個例子中,我們演示使用滑鼠的左右移動來轉動我們熟悉的小魚兒:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
background_image_filename = 'sushiplate.jpg'
sprite_image_filename = 'fugu.png'
 
import pygame
from pygame.locals import *
from sys import exit
from gameobjects.vector2 import Vector2
from math import *
 
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
 
background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename).convert_alpha()
 
clock = pygame.time.Clock()
 
# 讓pygame完全控制滑鼠
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)
 
sprite_pos = Vector2(200, 150)
sprite_speed = 300.
sprite_rotation = 0.
sprite_rotation_speed = 360.
 
while True:
 
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
        # 按Esc則退出遊戲
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                exit()
 
    pressed_keys = pygame.key.get_pressed()
    # 這裡獲取滑鼠的按鍵情況
    pressed_mouse = pygame.mouse.get_pressed()
 
    rotation_direction = 0.
    movement_direction = 0.
 
    # 通過移動偏移量計算轉動
    rotation_direction = pygame.mouse.get_rel()[0]/5.0
 
    if pressed_keys[K_LEFT]:
        rotation_direction = +1.
    if pressed_keys[K_RIGHT]:
        rotation_direction = -1.
    # 多了一個滑鼠左鍵按下的判斷
    if pressed_keys[K_UP] or pressed_mouse[0]:
        movement_direction = +1.
    # 多了一個滑鼠右鍵按下的判斷
    if pressed_keys[K_DOWN] or pressed_mouse[2]:
        movement_direction = -1.
 
    screen.blit(background, (0,0))
 
    rotated_sprite = pygame.transform.rotate(sprite, sprite_rotation)
    w, h = rotated_sprite.get_size()
    sprite_draw_pos = Vector2(sprite_pos.x-w/2, sprite_pos.y-h/2)
    screen.blit(rotated_sprite, sprite_draw_pos)
 
    time_passed = clock.tick()
    time_passed_seconds = time_passed / 1000.0
 
    sprite_rotation += rotation_direction * sprite_rotation_speed * time_passed_seconds
 
    heading_x = sin(sprite_rotation*pi/180.)
    heading_y = cos(sprite_rotation*pi/180.)
    heading = Vector2(heading_x, heading_y)
    heading *= movement_direction
 
    sprite_pos+= heading * sprite_speed * time_passed_seconds
 
    pygame.display.update()

一旦開啟這個例子,滑鼠就看不到了,我們得使用Esc鍵來退出程式,除了上一次的方向鍵,當滑鼠左右移動的時候,小魚轉動,按下滑鼠左右鍵的時候,小魚前進/後退。看程式碼,基本也是一樣的,就多了幾句帶註釋的。

這裡使用了

pygame.mouse.set_visible(False)
pygame.event.set_grab(True)

來完全控制滑鼠,這樣滑鼠的游標看不見,也不會跑到pygame視窗外面去,一個副作用就是無法使用滑鼠關閉視窗了,所以你得準備一句程式碼來退出程式。

然後我們使用

rotation_direction = pygame.mouse.get_rel()[0] / 5.

來獲得x方向上的偏移量,除以5是把動作放慢一點……

還有

lmb, mmb, rmb = pygame.mouse.get_pressed()

獲得了滑鼠按鍵的情況,如果有一個按鍵按下,那麼對應的值就會為True。

總結一下pygame.mouse的函式:

  • pygame.mouse.get_pressed —— 返回按鍵按下情況,返回的是一元組,分別為(左鍵, 中鍵, 右鍵),如按下則為True
  • pygame.mouse.get_rel —— 返回相對偏移量,(x方向, y方向)的一元組
  • pygame.mouse.get_pos —— 返回當前滑鼠位置(x, y)
  • pygame.mouse.set_pos —— 顯而易見,設定滑鼠位置
  • pygame.mouse.set_visible —— 設定滑鼠游標是否可見
  • pygame.mouse.get_focused —— 如果滑鼠在pygame視窗內有效,返回True
  • pygame.mouse.set_cursor —— 設定滑鼠的預設游標式樣,是不是感覺我們以前做的事情白費了?哦不會,我們使用的方法有著更好的效果。
  • pyGame.mouse.get_cursor —— 不再解釋。

關於使用滑鼠

在遊戲中活用滑鼠是一門學問,像在FPS中,滑鼠用來瞄準,ARPG或RTS中,滑鼠用來指定位置和目標。而在很多策略型的小遊戲中,滑鼠的威力更是被髮揮的 淋漓盡致,也許是可以放置一些道具,也許是用來操控蓄力。我們現在使用的螢幕是二維的,而滑鼠也能在2維方向到達任何的位置,所以滑鼠相對鍵盤,更適合現代的複雜操作,只有想不到沒有做不到啊。

絕大多數時候,滑鼠和鍵盤是合作使用的,比如使用鍵盤轉換視角,使用鍵盤移動,或者鍵盤對應很多快捷鍵,而鍵盤則用來指定位置。開動大腦,創造未來!

下一章節講述使用遊戲控制器,也就是手柄啦~ 手裡拿一個手柄玩遊戲,感覺就是不一樣,不過被爸媽看到立刻就知道不在幹正事了……

相關文章