目录
问题一:pygame中Rect(left, top, width, height)的参数详解
问题二:python - pygame 中 rect.move() 和 rect.move_ip 的区别
运行效果:
1、game_main.py
2、enemy_plane.py
3、game_map.py
4、hero_plane.py
5、plane_bullet.py
6、game_score.py
问题一:pygame中Rect(left, top, width, height)的参数详解
详情见:pygame中Rect(left, top, width, height)的参数详解_追随者永远是胜利者的博客-CSDN博客_pygame.rect
常用的Rect参数有这个形式:pygame.Rect(left, top, width, height)
left,top,width,height对应的具体表示如下图,
问题二:python - pygame 中 rect.move() 和 rect.move_ip 的区别虽然 rect.move_ip 改变了 pygame.Rect 对象本身,
rect.move 不会改变对象,但它会返回一个具有相同大小和“移动”位置的新对象。
注意,rect.move_ip
的返回值是 None
,但是 rect.move
的返回值是一个新的 pygame.Rect
对象。rect.move_ip(x, y)
与 rect = rect.move(x, y)
的作用相同
move_ip()不能识别浮点数
素材和文件见连接:https://download.csdn.net/download/qq_48328693/85274200
运行效果: 1、game_main.pyimport pygame, sys, game_map, hero_plane, enemy_plane, game_score
#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768
class GameWindow(object):
def __init__(self):#初始化
# 对pygame进行实例化,也叫做硬件准备
pygame.init()
# 加载背景音乐
# pygame.mixer.music.load("./res/bg2.ogg")
# # 循环播放背景音乐
# pygame.mixer.music.play(-1)
# 加载音效
self.boom_sound = pygame.mixer.Sound("./res/baozha.ogg")
# 创立窗口 set_mode([400,400]) #512*768像素,背景图大小
self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])
# 设置游戏窗口的标题
pygame.display.set_caption('飞机大战')
# 加载本地资源图片
logo_image = pygame.image.load('res/app.ico')
# 设置游戏窗口logo
pygame.display.set_icon(logo_image)
#地图对象
self.map = game_map.GameMap()
#英雄飞机的对象
self.hero_plane = hero_plane.HeroPlane()
#添加多个敌机对象(6个)
self.enemy_list = [enemy_plane.EnemyPlane() for i in range(6)]
#游戏分数
self.game_score = game_score.GameScore(35)#字体大小35
#定义各种矩形的坐标移动
def __action(self):
self.map.move_down()
#遍历子d
for bullet in self.hero_plane.buttle_list:
if bullet.is_shot:#为true则说明已经发射
bullet.move_up()
#敌机向下移动
for enemy in self.enemy_list:
enemy.move_down()
#根据矩形坐标,重新对元素进行描绘
def __draw(self):
#添加背景图片
self.window.blit(self.map.img_1,(0,self.map.img_1_y))#在窗口内建立图片1,位置是(0,图片纵坐标)
self.window.blit(self.map.img_2,(0,self.map.img_2_y))
# 添加飞机图片
self.window.blit(self.hero_plane.img,(self.hero_plane.img_rect[0],self.hero_plane.img_rect[1]))
#添加子d
for bullet in self.hero_plane.buttle_list:
#判断子d是否发射
if bullet.is_shot:
self.window.blit(bullet.img,(bullet.img_rect[0],bullet.img_rect[1]))
#添加敌机
for enemy in self.enemy_list:
self.window.blit(enemy.img,(enemy.img_rect[0],enemy.img_rect[1]))
#添加文字
self.window.blit(self.game_score.text_obj,(10,10))
#处理窗口中的监听事件
def __event(self):
# 获取所有游戏窗口内的事件监听,返回一个列表
event_list = pygame.event.get()
# 循环遍历所有游戏事件
for event in event_list:
# 判断鼠标点击 *** 作
if event.type == pygame.QUIT:
self.game_over()
# 监听键盘上的 *** 作
if event.type == pygame.KEYDOWN: # 判断是否键盘
if event.key == pygame.K_ESCAPE: # 判断是否esc键
self.game_over()
if event.key == pygame.K_SPACE:
self.hero_plane.shot()
# 监听键盘中的长按事件->元组(只有两种情况,0 或 1)(返回元组)
pressed_keys = pygame.key.get_pressed()
# 判断向上的按键是否在长按(1)
if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
self.hero_plane.move_up()
# 判断向下的按键是否在长按(1)
if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
self.hero_plane.move_down()
# 判断向左的按键是否在长按(1)
if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
self.hero_plane.move_left()
# 判断向右的按键是否在长按(1)
if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
self.hero_plane.move_right()
#刷新窗口
def __update(self):
pygame.display.update()
#把游戏结束函数封装
def game_over(self):
# 停止音效
self.boom_sound.stop()
# 停止背景音乐
# pygame.mixer.music.stop()
# 退出游戏
pygame.quit()
# 退出程序
sys.exit()
#游戏运行
def run(self):
while True:
self.__action()
self.__draw()
self.__event()
self.__update()
self.__bullet_hit_enemy()
#子d碰撞的函数
def __bullet_hit_enemy(self):
# 判断
# 遍历子d
for bullet in self.hero_plane.buttle_list:
# 判断子d发射
if bullet.is_shot:
# 遍历敌机
for enemy in self.enemy_list:
# 判断两个矩形是否相交,相交返回True,否则返回False
flag = pygame.Rect.colliderect(bullet.img_rect, enemy.img_rect)
if flag:
# 子d状态重置
bullet.is_shot = False
# 敌机敌机状态
enemy.reset()
# 播放音效
self.boom_sound.play()
# 设置分数
self.game_score.set_text_obj()
#主函数
def main():
game_window = GameWindow()
game_window.run()
if __name__ == '__main__':#像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此
main()
2、enemy_plane.py
import random,pygame
#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768
# 自定义敌机类
class EnemyPlane(object):
#初始化敌机
def __init__(self):
#敌机数量
self.num = str(random.randint(1,7))#6架敌机
#敌机图片
self.img = pygame.image.load('res/img-plane_'+ self.num+'.png')
#获取敌军飞机的图片矩阵
self.img_rect = self.img.get_rect()
self.reset()#因为敌军的位置和速度是随机的,所以在这里需要重置
#设置敌机位置和速度(有修改,因为speed太快,所以调整了出现的位置代替速度的随机性)
def reset(self):
self.img_rect[0] = random.randint(0,WINDOW_WIDTH-self.img_rect[2])
self.img_rect[1] = random.randint(-WINDOW_HEIGHT,-WINDOW_HEIGHT/3)
self.speed = 1
#敌机向下移动
def move_down(self):
self.img_rect.move_ip(0,self.speed)
#判断如果在屏幕消失以后,重置敌机位置
if self.img_rect[1] >= WINDOW_HEIGHT:
self.reset()
3、game_map.py
import random,pygame
#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768
class GameMap(object):
def __init__(self):#定义地图初始化
self.num = str(random.randint(1,5))#定义1-5随机数
#获取图片
self.img_1 = pygame.image.load('res/img_bg_level_'+ self.num +'.jpg')#图片1-5随机显示
self.img_2 = pygame.image.load('res/img_bg_level_'+ self.num +'.jpg')
#设置和记录背景图片的y轴(x轴默认为0)
self.img_1_y = -WINDOW_HEIGHT
self.img_2_y = 0#第二张图片顶上
#下降速度
self.speed = 0.3
#背景向下移动
def move_down(self):#向下移动的类
#重置地图y轴(初始化)
if self.img_1_y >= 0:
self.img_1_y = -WINDOW_HEIGHT
self.img_2_y = 0
self.img_1_y += self.speed
self.img_2_y += self.speed
4、hero_plane.py
import random,pygame,plane_bullet
#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768
class HeroPlane(object):
#初始化飞机类
def __init__(self):
#加载飞机图片
self.img = pygame.image.load('res/hero.png')
#获取飞机矩阵
self.img_rect = self.img.get_rect()
#设置飞机初始位置
self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2,WINDOW_HEIGHT -self.img_rect[3]-50)
#设置飞机速度
self.speed = 1#不知道为啥速度为0.5就不能移动,我这个速度比教程里的速度要快好多倍
#子dd夹
self.buttle_list = [plane_bullet.PlaneBullet() for i in range(6)]#一次发射五个子d
#向上
def move_up(self):
#边缘检测
if self.img_rect[1] >= 0:#rect四个参数的意义详解见笔记
self.img_rect.move_ip(0,-self.speed)
#向下
def move_down(self):
#边缘检测
if self.img_rect[1] <= WINDOW_HEIGHT -self.img_rect[3]:
self.img_rect.move_ip(0,self.speed)
#向左
def move_left(self):
if self.img_rect[0] >= 0:
self.img_rect.move_ip(-self.speed, 0)
#向右
def move_right(self):
if self.img_rect[0] <= WINDOW_WIDTH -self.img_rect[2]:
self.img_rect.move_ip(self.speed, 0)
#发射子弹
def shot(self):
#遍历所有子弹
for buttet in self.buttle_list:
#判断未发射的
if not buttet.is_shot:
#设置子弹位置
buttet.img_rect[0] = self.img_rect[0] + (self.img_rect[2]/2 - buttet.img_rect[2]/2)
buttet.img_rect[1] = self.img_rect[1] - buttet.img_rect[3]
#设置子弹的发送状态
buttet.is_shot = True
#一次只能发射一颗子弹
break
5、plane_bullet.py
import pygame
#定义常量
WINDOW_WIDTH,WINDOW_HEIGHT = 512,768
# 自定义一个英雄飞机子d类
class PlaneBullet(object):
def __init__(self):
#图片
self.img = pygame.image.load('res/bullet_10.png')
#获取图片矩形
self.img_rect = self.img.get_rect()
#设置子d状态
self.is_shot = False
#子d速度
self.speed = 1
#向上移动
def move_up(self):
self.img_rect.move_ip(0,-self.speed)
#注意修改子d状态
if self.img_rect[1] <= -self.img_rect[3]:
self.is_shot = False
6、game_score.py
import pygame, random
# 自定义文字管理类
class GameScore(object):
# 记录分数
__cls_score = 0
def __init__(self, font_size):
# 设置字体和大小
self.font = pygame.font.SysFont("SimHei", font_size)#(默认字体,字体大小)
# render(text(文本内容), antialias(抗锯齿值,默认1), color(RGB)),返回文字对象
self.text_obj = self.font.render("分数:0", 1, (255, 255, 255))
# 设置显示的文字和字体颜色
def set_text_obj(self):
# 加5分
GameScore.__cls_score += 5
# 随机颜色值
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
# 重新赋值
self.text_obj = self.font.render("分数:%d" % GameScore.__cls_score, 1, (r, g, b))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)