python3 pygame的发射子弹自编程序
生活随笔
收集整理的這篇文章主要介紹了
python3 pygame的发射子弹自编程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這是主程序1.py
#1.py主程序 import sys import pygame from settings import Settings from ship import Ship from gamefunctions import update_screen from bullet import Bullet from gamefunctions import check_events from pygame.sprite import Group def run_game():pygame.init()my_set = Settings()screen = pygame.display.set_mode(my_set.set_mode)my_ship = Ship(screen,my_set)screen = pygame.display.set_mode(my_set.set_mode)pygame.display.set_caption(my_set.set_caption)bullets = Group()while True:update_screen(my_ship,my_set,screen,bullets)run_game()這是bullet.py子彈定義的程序?
#bullet.py 這是子彈的定義程序 import pygame #導(dǎo)入精靈的類Sprite,用于創(chuàng)建子彈,精靈方便用pygame.sprite的組Group管理子彈 from pygame.sprite import Sprite #定義子彈的類Bullet,這是一個(gè)繼承類,繼承了類Sprite class Bullet(Sprite):def __init__(self,ai_settings,screen,ship):#初始化父類super().__init__()self.screen = screen#定義表示子彈的長方形,位置為屏幕左上角(0,0)self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)#設(shè)置子彈的位置為飛船的頂部self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#定義self.py表示飛船的位置,這里為了微調(diào)子彈,所以定義為一個(gè)float對(duì)象self.y = float(self.rect.y)#存儲(chǔ)子彈顏色self.color = ai_settings.bullet_color#子彈的速度self.speed_factor = ai_settings.bullet_speed_factordef update(self):#這個(gè)函數(shù)更新子彈的位置,子彈向屏幕上方移動(dòng),橫坐標(biāo)不變,所以只需要改變縱坐標(biāo)self.y -= self.speed_factor#把self.py賦值給子彈的縱坐標(biāo)self.rect.y =self.ydef draw_bullet(self):#下面這句是表示在屏幕上繪制子彈pygame.draw.rect(self.screen,self.color,self.rect) #gamefunctions.py import pygame import sys #因?yàn)橄旅嬉獎(jiǎng)?chuàng)建子彈實(shí)例,所以必須導(dǎo)入表示子彈的類 from bullet import Bullet def check_keydown(event,ship,screen,bullets,settings):if event.key == pygame.K_DOWN:ship.moving_down = Trueif event.key == pygame.K_UP:ship.moving_up = Trueif event.key == pygame.K_LEFT:ship.moving_left = Trueif event.key == pygame.K_RIGHT:ship.moving_right = Trueif event.key == pygame.K_SPACE:#創(chuàng)建一個(gè)子彈new_bullet = Bullet(settings,screen,ship)#把子彈加入組bullets中,bullets是一個(gè)Group,一會(huì)方便用這個(gè)Group對(duì)象管理所有子彈#特別是方便更新子彈的位置bullets.add(new_bullet)#放開按鍵不用增加別的代碼,因?yàn)榉砰_按鍵對(duì)子彈沒有什么影響 def check_keyup(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falseif event.key == pygame.K_UP:ship.moving_up = Falseif event.key == pygame.K_DOWN:ship.moving_down = False def check_events(ship,screen,bullets,settings):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()if event.type == pygame.KEYDOWN:check_keydown(event,ship,screen,bullets,settings)if event.type == pygame.KEYUP:check_keyup(event,ship) def update_screen(ship,settings,screen,bullets):check_events(ship,screen,bullets,settings)ship.update()screen.fill(settings.color)#刷新子彈位置bullets.update()ship.blitme()#對(duì)bullets中每一個(gè)子彈,都繪制到屏幕上,sprites()得到所有子彈的一個(gè)類似列表的對(duì)象for bullet in bullets.sprites():bullet.draw_bullet()#下面是屏幕刷新程序,在刷新前必須繪制子彈pygame.display.flip()我們可以發(fā)現(xiàn), 某個(gè)函數(shù)中要建立類,那么只需要導(dǎo)入這個(gè)類即可,這個(gè)類需要的其它類不需要導(dǎo)入,只需要在函數(shù)參數(shù)表中出現(xiàn)即可
#settings.py 這是設(shè)置程序 class Settings():def __init__(self):self.set_mode = (1000,800)self.set_caption = "alien invasion"self.speed_factor = 1.5self.color = (255,255,255)self.bullet_speed_factor = 1self.bullet_color = 60,60,60self.bullet_width = 3self.bullet_height = 15 #ship.py import pygameclass Ship():def __init__(self,screen,settings):self.screen = screenself.settings = settingsself.image = pygame.image.load("ship.bmp")self.rect = self.image.get_rect()self.screen_rect = self.screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomself.moving_left = Falseself.moving_right = Falseself.moving_up = Falseself.moving_down = Falseself.center_x = float(self.rect.centerx)self.settings = settingsdef blitme(self):self.screen.blit(self.image,self.rect)def update(self):if self.moving_left and self.rect.left > 0:self.center_x -= self.settings.speed_factorif self.moving_right and self.rect.right < self.screen_rect.right:self.center_x += self.settings.speed_factorif self.moving_up:self.rect.bottom -= 1if self.moving_down:self.rect.bottom += 1self.rect.centerx = self.center_x本文所用到的ship.bmp的下載? ?鏈接: https://pan.baidu.com/s/1Dn5yaQGZLIsN0BohM8PzoA ?密碼: 38ie
運(yùn)行結(jié)果:
注意幾個(gè)問題:
1.有時(shí)候定義類的對(duì)象的時(shí)候,少幾個(gè)參數(shù)編譯器是檢測不出來的。
2.定義矩形的代碼是:pygame.Rect(0,0,width,height),這里的R是大寫的,如果寫成小寫,會(huì)報(bào)告以下錯(cuò)誤:
self.rect = pygame.rect(0,0,settings.bullet_width,settings.bullet_height) TypeError: 'module' object is not callable這是目前自己學(xué)習(xí)是pygame中的第一個(gè)以大寫字母開頭的pygame的方法
3.精靈的英文是:sprite,讀作[spra?t]
總結(jié)
以上是生活随笔為你收集整理的python3 pygame的发射子弹自编程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能指针shared_ptr的几个例子
- 下一篇: c++动态内存的几个简单例子