1、下载一个包
PySide2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64
如果下载错误,就先下载shiboken2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64补丁,然后再下载Pyside2。
记得都放在同一个工程下。
2、准备好飞机大战中所需要的图片资源
(1)自身飞机
(2)飞机子弹
(3)背景
(4)敌机
将准备好的图片放入工程中的images文件夹中,且命名好
3、代码
我们一共准备六个模块
(1)主函数main模块.py
from PySide2 import QtCore, QtWidgets, QtGui
from settings import Settings
from map import Map
from hero import Hero
from enemy import Enemy
from random import randint
class MainScene(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.settings = Settings()
self.setWindowTitle(self.settings.game_title)
self.setWindowIcon(QtGui.QIcon(self.settings.game_ico))
self.setFixedSize(self.settings.game_width, self.settings.game_height)
self.map = Map() # 构造一个地图对象
self.hero = Hero() # 构造一个英雄对象
# 初始化敌机
self.enemys = []
self.enemy_interval = 0
for i in range(self.settings.enemy_num):
self.enemys.append(Enemy())
self.timer_main = QtCore.QTimer(self)
self.timer_main.setInterval(20)
self.timer_main.timeout.connect(self.run)
self.timer_main.start()
self.presskeys = []
self.timer_key = QtCore.QTimer(self)
self.timer_key.setInterval(50)
self.timer_key.timeout.connect(self.handleKey)
def enemyToScene(self):
self.enemy_interval += 1
if self.enemy_interval < 30:
return
self.enemy_interval = 0
for i in range(self.settings.enemy_num):
if self.enemys[i].free:
self.enemys[i].free = False
self.enemys[i].x = randint(0, self.settings.game_width-self.enemys[i].img.width())
self.enemys[i].y = -self.enemys[i].img.height()
break
def collisionDetect(self):
for i in range(self.settings.enemy_num):
if self.enemys[i].free:
continue
for j in range(self.settings.bullet_num):
if self.hero.bullets[j].free:
continue
if self.enemys[i].rect.intersects(self.hero.bullets[j].rect):
self.enemys[i].free = True
self.hero.bullets[j].free = True
def handleKey(self):
x = self.hero.x
y = self.hero.y
if self.presskeys.count(QtCore.Qt.Key_Left) > 0:
x -= self.hero.speed
if self.presskeys.count(QtCore.Qt.Key_Right) > 0:
x += self.hero.speed
if self.presskeys.count(QtCore.Qt.Key_Space) > 0:
self.hero.shoot()
if self.presskeys.count(QtCore.Qt.Key_Q) > 0:
self.close()
self.hero.move(x, y)
def keyPressEvent(self, event):
'''按键按下时,自动调用此函数'''
self.presskeys.append(event.key())
if not self.timer_key.isActive():
self.timer_key.start()
def keyReleaseEvent(self, event):
'''松开按键时,自动调用'''
if self.timer_key.isActive() and len(self.presskeys) == 0:
self.timer_key.stop()
self.handleKey()
while event.key() in self.presskeys:
self.presskeys.remove(event.key())
def updatePosition(self):
self.map.move()
'''更新子弹的位置'''
for i in range(self.settings.bullet_num):
if not self.hero.bullets[i].free:
self.hero.bullets[i].move()
'''更新敌机位置'''
for i in range(self.settings.enemy_num):
if not self.enemys[i].free:
self.enemys[i].move()
def run(self):
self.enemyToScene()
self.updatePosition()
self.update()
self.collisionDetect()
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.drawPixmap(0, self.map.y1, self.map.img1)
painter.drawPixmap(0, self.map.y2, self.map.img2)
painter.drawPixmap(self.hero.x, self.hero.y, self.hero.img)
'''绘制子弹'''
for i in range(self.settings.bullet_num):
if not self.hero.bullets[i].free:
painter.drawPixmap(self.hero.bullets[i].x, self.hero.bullets[i].y, self.hero.bullets[i].img)
'''绘制敌机'''
for i in range(self.settings.enemy_num):
if not self.enemys[i].free:
painter.drawPixmap(self.enemys[i].x, self.enemys[i].y, self.enemys[i].img)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
w = MainScene()
w.show()
app.exec_()
(2)资源调用模块setting.py
class Settings:
def __init__(self):
self.game_title = "python飞机大战"
self.game_ico = r"D:\周末实训\飞机大战\images\app.ico"
self.game_width = 512
self.game_height = 700
self.map_path = r"D:\周末实训\飞机大战\images\img_bg_level_2.jpg"
self.map_speed = 2
self.hero_path = r"D:\周末实训\飞机大战\images\hero2.png"
self.hero_speed = 20
self.bullet_path = r"D:\周末实训\飞机大战\images\bullet_11.png"
self.bullet_speed = 10
self.bullet_num = 10
self.enemy_path = r"D:\周末实训\飞机大战\images\img-plane_5.png"
self.enemy_speed = 3
self.enemy_num = 10
(3)地图模块map.py
from PySide2 import QtGui
from settings import Settings
class Map:
def __init__(self):
self.settings = Settings()
self.img1 = QtGui.QPixmap(self.settings.map_path)
self.img2 = QtGui.QPixmap(self.settings.map_path)
self.y1 = -self.settings.game_height
self.y2 = 0
def move(self):
self.y1 += self.settings.map_speed
if self.y1 >= 0:
self.y1 = -self.settings.game_height
self.y2 += self.settings.map_speed
if self.y2 >= self.settings.game_height:
self.y2 = 0
(4)自身飞机操作模块hero.py
from PySide2 import QtGui
from settings import Settings
from bullet import Bullet
class Hero:
def __init__(self):
self.settings = Settings()
self.img = QtGui.QPixmap(self.settings.hero_path)
self.x = self.settings.game_width*0.5 - self.img.width()*0.5
self.y = self.settings.game_height - self.img.height()
self.speed = self.settings.hero_speed
# 创建一个弹夹,放入10颗子弹
self.bullets = []
for i in range(self.settings.bullet_num):
self.bullets.append(Bullet())
def move(self, x, y):
'''飞机移动'''
self.x = x
self.y = y
def shoot(self):
'''飞机发射子弹,按空格键时,调用此函数'''
for i in range(self.settings.bullet_num):
if self.bullets[i].free:
self.bullets[i].free = False
self.bullets[i].x = self.x + self.img.width()*0.5 - self.bullets[i].img.width()*0.5
self.bullets[i].y = self.y - 30
break
(5)发射子弹模块bullet.py
from PySide2 import QtGui
from settings import Settings
class Bullet:
def __init__(self):
self.settings = Settings()
self.img = QtGui.QPixmap(self.settings.bullet_path)
self.rect = self.img.rect()
self.speed = self.settings.bullet_speed
self.x = 0
self.y = 0
self.free = True
def move(self):
if self.free:
return
self.y -= self.speed
self.rect.moveTo(self.x, self.y)
if self.y <= -self.rect.height():
self.free = True
(6)敌机模块enemy.py
from PySide2 import QtGui
from settings import Settings
class Enemy:
def __init__(self):
self.settings = Settings()
self.img = QtGui.QPixmap(self.settings.enemy_path)
self.rect = self.img.rect()
self.x = 0
self.y = 0
self.free = True
self.speed = self.settings.enemy_speed
def move(self):
if self.free:
return
self.y += self.speed
self.rect.moveTo(self.x, self.y)
if self.y >= self.settings.game_height:
self.free = True
4、注意
代码没有问题,在同一工程目录下建6个.py文件然后将代码复制进去就行了
如果有报错,一般就是我上面说的包没有下载或者调用成功,
也可能是图片路径问题。
代码比较少,功能也不是很多,相比于正规游戏这个肯定是没得比的,如果有问题,还望各位大佬多加指点
操作方式:飞机方向由左右两键控制,空格发射子弹,Q退出游戏