資訊內(nèi)容
用python和pygame游戲編程入門-向量類的使用
上一節(jié)中我們學(xué)習(xí)并明白了什么是向量,向量之間如何進(jìn)行計(jì)算。現(xiàn)在已經(jīng)有人為我們寫好了一個(gè)可以直接使用的向量類-》在Python3.x下可用的向量類源碼
將代碼保存到本地,并命名為Vec2d.py
有了這個(gè)類,我們就來編寫一個(gè)簡(jiǎn)單得測(cè)試程序,看看效果:
from Vec2d import * A = Vec2d(10.0, 20.0) B = Vec2d(30.0, 35.0) C=Vec2d(-10, 5) AB = A+B print(AB.normalized()) print ("Vector AB is", AB) print ("AB * 2 is", AB * 2) print ("AB / 2 is", AB / 2) print ("AB + (–10, 5) is", (AB +C)) ''' 運(yùn)行結(jié)果: Vector AB is Vec2d(40.0, 55.0) AB * 2 is Vec2d(80.0, 110.0) AB / 2 is Vec2d(20.0, 27.5) AB + (–10, 5) is Vec2d(30.0, 60.0) '''
那么向量道底有什么用,我們來看一個(gè)實(shí)戰(zhàn)的例子,這個(gè)程序?qū)崿F(xiàn)的效果是魚不停的在鼠標(biāo)周圍游動(dòng),若即若離,在沒有到達(dá)鼠標(biāo)時(shí),加速運(yùn)動(dòng),超過以后則減速。因而魚會(huì)在鼠標(biāo)附近晃動(dòng)。
background_image_filename = './img/Underwater.png' sprite_image_filename = './img/fish-b.png' import pygame from pygame.locals import * from sys import exit from Vec2d 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() position = Vec2d(100.0, 100.0) heading = Vec2d(0,0) while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.blit(background, (0,0)) screen.blit(sprite, position) time_passed = clock.tick() time_passed_seconds = time_passed / 1000.0 # 參數(shù)前面加*意味著把列表或元組展開 destination = Vec2d( *pygame.mouse.get_pos() ) - Vec2d( *sprite.get_size() )/2 # 計(jì)算魚兒當(dāng)前位置到鼠標(biāo)位置的向量 vector_to_mouse = destination - position # 向量規(guī)格化 vector_to_mouse.normalized() # 這個(gè)heading可以看做是魚的速度,但是由于這樣的運(yùn)算,魚的速度就不斷改變了 # 在沒有到達(dá)鼠標(biāo)時(shí),加速運(yùn)動(dòng),超過以后則減速。因而魚會(huì)在鼠標(biāo)附近晃動(dòng)。 heading = heading + (vector_to_mouse * 0.001) position += heading * time_passed_seconds pygame.display.update()
雖然這個(gè)例子里的計(jì)算有些讓人看不明白,但是很明顯heading的計(jì)算是關(guān)鍵,如此復(fù)雜的運(yùn)動(dòng),使用向量居然兩句話就搞定了。
本站部分內(nèi)容轉(zhuǎn)載自網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系管理員及時(shí)刪除。

- 上一篇
用python和pygame游戲編程入門-鍵盤設(shè)備
今天我們?cè)俳榻B一個(gè)方法,pygame.key.get_pressed()來獲得所有按下的鍵值,它會(huì)返回一個(gè)元組。這個(gè)元組的索引就是鍵值
- 下一篇
用python和pygame游戲編程入門-認(rèn)識(shí)向量
向量的表示和坐標(biāo)很像,(10,20)對(duì)坐標(biāo)而言,就是一個(gè)固定的點(diǎn),然而在向量中,它意味著x方向行進(jìn)10,y方向行進(jìn)20,所以坐標(biāo)(0,0)加上向量(10,20)后,就到達(dá)了點(diǎn)(10,20)。