外星人入侵游戏开发
一、开发框架
总文件:alien_invasion
包含文件:
- image文件
- alien_invasion.py
- game_functions.py
- ship.py
- settings.py
- bullet.py
alien.invasion.py
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
|
import pygame
from settings import Settings from ship import Ship import game_functions as gf
def run_game(): pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) """ 我们调用pygame.display.set_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。 通过将这些尺寸值传递给pygame.display.set_mode(),我们创建了一个宽1200像素、高800像素的游戏窗口 (你可以根据自己的显示器尺寸调整这些值)。 surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。 display.set_mode()返回的surface表示整个游戏窗口。 我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。 """ pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
ship = Ship(ai_settings,screen)
while True: gf.check_events(ship) gf.ship.updat() gf.update_screen(ai_settings,screen,ship)
run_game()
|
game_functions.py
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
| """包含一系列函数,由它完成游戏的大部分工作. check_events()检测相关事件,按键的按下与松开,并且辅助check_keydown_events()和check_keyup_events()处理事件 包含模块update_screen()用于每次执行主循环时的屏幕绘制 """ import sys import pygame
def check_keydown_events(event,ship): """响应按键""" if event.key == pygame.K_RITGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True
def check_keyup_events(event,ship): if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key ==pygame.K_LEFT: ship.moving_left = False
def check_events(event,ship): """响应按键和鼠标事件""" for events in pygame.event.get(): if events.type == pygame.QUIT: sys.exit() elif events.type == pygame.KEYDOWN: check_keydown_events(event,ship) elif events.type ==pygame.KEYUP: check_keyup_events(event,ship)
def update_screen(ai_settings,screen,ship): """更新屏幕上的图像,并切换到新屏幕""" screen.fill(ai_settings.bg_color) ship.blitme()
pygame.display.flip()
|
ship.py
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
| '''包含__init__()、管理飞船位置的方法update()以及在屏幕上绘制飞船的方法blitme()''' import pygame class Ship(): def __init__(self,ai_settings,screen): """初始化飞船并设置其初始位置""" self.screen = screen self.ai_settings = ai_settings self.image = pygame.image.load('.\images\ship.bmp') self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom self.center = float(self.rect.centerx) self.moving_right = False self.mobing_left = False
def updat(self): """根据移动标志调整飞船的位置""" if self.moving_right and self.rect.right < self.screen_rect.right: self.rect.centerx += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: self.rect.centerx -= self.ai_settings.ship_speed_factor self.rect.centerx = self.center
def blitme(self): """在指定位置绘制飞船""" self.screen.blit(self.image,self.rect)
|
settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class Settings(): """存储《外星入侵》的所有设置的类""" def __init__(self): self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230,230,230) self.ship_speed_factor = 1.5 self.bullet_speed_factor = 1 self.bullet_width = 3 self.bullet_hight = 15 self.bullet_color = 60,60,60
|
bullet.py
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
| import pygame from pygame.sprite import Sprite
class Bullet(Sprite): """一个对飞船发射的子弹进行管理的类""" def __init__(self, ai_settings, screen,ship): """在飞船所处的位置创建一个子弹对象""" super(Bullet,self)._init__() self.screen = screen
self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height) self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top
self.y = float(self.rect.y) self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor
def update(self): """向上移动子弹""" self.y -= self.speed_factor self.rect.y = self.y
def draw_bullet(self): """在屏幕上绘制子弹""" """函数draw.rect()使用存储在self.color中的颜色填充表示子弹的rect占据的屏幕部分""" pygame.draw.rect(self.screen,self.color,self.rect)
|
images文件
项目进度:12.6.4
敬请T期待
樱花树
原文链接:https://blog.csdn.net/sxc1414749109/article/details/139392284
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 78 79 80 81 82 83 84 85 86 87 88
| #cherry.py from turtle import * from random import random from math import cos,radians
def draw_tree(branch_length,level): #递归绘制树干 pendown() #根据当前的方向和角度改变颜色 t=cos(radians(heading()+45))/8+0.25 pencolor(t,t,t) pensize(branch_length/10) forward(branch_length)
if level > 0 :#如果还有分支级别 #随意生成分支角度和长度 angle1=random()*15+10 angle2=random()*15+10 new_length=branch_length*(random()*0.25+0.7)
#绘制右侧分支 right(angle1) draw_tree(new_length,level-1)
#绘制左侧分支 left(angle1+angle2) draw_tree(new_length,level-1)
right(angle2) else: # 如果已经到达最底层 # 在分支末端绘制花朵 draw_flower()
penup() backward(branch_length)
#绘制树枝末端树叶 def draw_flower():
right(90)#调整方向,准备绘制花朵 pencolor("pink") circle(3)#绘制花朵
left(90)#调整方向,准备绘制其他元素
#偶尔在地面上绘制落花 if random() > 0.7: penup()#抬笔,停止绘画 current_heading=heading()#记录当前方向 angle = -40+random()*80 setheading(angle)#设置方向 #计算落花的距离 distance=int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2) forward(distance) #落笔 pendown() right(90) #根据当前的方向和角度计算颜色 n=cos(radians(heading()-45))/4+0.5 pencolor(n*0.5+0.5, 0.4+n*0.4, 0.4+n*0.4) circle(2)
left(90) penup() setheading(angle) backward(distance)#后退回原来的位置 setheading(current_heading)#恢复至原始方向
def main(): """主函数用于设置绘图环境并开始绘制过程""" bgcolor(0.956, 0.9255, 0.9882) # 设置背景颜色为浅紫色 speed(10) hideturtle() tracer(100)#设置追踪延迟
penup()#抬笔 backward(100)#后退一段距离 left(90) backward(300)
draw_tree(100, 12) done()
if __name__ == "__main__": main() #主函数
|
效果图:
