上次我們說明了使用鍵盤操作遊戲,鍵盤是非常古老的輸入裝置,甚至筆計算機本身都要古老的多,因為它發源於打字機,貌似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鍵來退出程式,除了上一次的方向鍵,當滑鼠左右移動的時候,小魚轉動,按下滑鼠左右鍵的時候,小魚前進/後退。看程式碼,基本也是一樣的,就多了幾句帶註釋的。
這裡使用了
1 2 |
pygame.mouse.set_visible(False) pygame.event.set_grab(True) |
來完全控制滑鼠,這樣滑鼠的游標看不見,也不會跑到pygame視窗外面去,一個副作用就是無法使用滑鼠關閉視窗了,所以你得準備一句程式碼來退出程式。
然後我們使用
1 |
rotation_direction = pygame.mouse.get_rel()[0] / 5. |
來獲得x方向上的偏移量,除以5是把動作放慢一點……
還有
1 |
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維方向到達任何的位置,所以滑鼠相對鍵盤,更適合現代的複雜操作,只有想不到沒有做不到啊。
絕大多數時候,滑鼠和鍵盤是合作使用的,比如使用鍵盤轉換視角,使用鍵盤移動,或者鍵盤對應很多快捷鍵,而鍵盤則用來指定位置。開動大腦,創造未來!
下一章節講述使用遊戲控制器,也就是手柄啦~ 手裡拿一個手柄玩遊戲,感覺就是不一樣,不過被爸媽看到立刻就知道不在幹正事了……