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文件然后将代码复制进去就行了
如果有报错,一般就是我上面说的包没有下载或者调用成功,
也可能是图片路径问题。
代码比较少,功能也不是很多,相比于正规游戏这个肯定是没得比的,如果有问题,还望各位大佬多加指点