寧德網(wǎng)站建設維護如何優(yōu)化網(wǎng)站排名
學習 Python 之 Pygame 開發(fā)魂斗羅(四)
- 繼續(xù)編寫魂斗羅
- 1. 創(chuàng)建子彈類
- 2. 根據(jù)玩家方向和狀態(tài)設置子彈發(fā)射的位置
- (1). 站立向右發(fā)射子彈
- (2). 站立向左發(fā)射子彈
- (3). 站立朝上發(fā)射子彈
- (4). 蹲下發(fā)射子彈
- (5). 向斜方發(fā)射子彈
- (6). 奔跑時發(fā)射子彈
- (7). 跳躍時發(fā)射子彈
- 3. 在玩家類中加入開火
- 4. 修改主類實現(xiàn)玩家開火
繼續(xù)編寫魂斗羅
在上次的博客學習 Python 之 Pygame 開發(fā)魂斗羅(二)中,我們完成了角色的移動和跳躍,下面我們來繼續(xù)寫魂斗羅。
下面是圖片的素材
鏈接:https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwd=hdly
提取碼:hdly
1. 創(chuàng)建子彈類
發(fā)射子彈首先要有子彈類
我們來創(chuàng)建一下
import pygame
from Constants import *class Bullet(pygame.sprite.Sprite):def __init__(self, person):pygame.sprite.Sprite.__init__(self)self.images = [loadImage('../Image/Bullet/bullet1.png')]self.index = 0self.image = self.images[self.index]# 速度self.xSpeed = 1self.ySpeed = 1self.rect = pygame.Rect(person.rect)# 銷毀開關self.isDestroy = Falsedef move(self):self.rect.x += self.xSpeedself.rect.y += self.ySpeedself.checkBullet()def draw(self, window):window.blit(self.image, self.rect)def checkBullet(self):toDestroy = Falseif self.rect.top < 0 or self.rect.top > 600:toDestroy = Trueif self.rect.left < 0 or self.rect.right > 900:toDestroy = Trueif toDestroy:self.isDestroy = True
2. 根據(jù)玩家方向和狀態(tài)設置子彈發(fā)射的位置
由于玩家的方向和狀態(tài)不一樣,所以玩家開火后,子彈發(fā)射的位置也不一樣
下面我們來看看角色狀態(tài)和發(fā)射子彈的位置
(1). 站立向右發(fā)射子彈
(x,y) 是圖片的位置,我們計算出,此狀態(tài)下,子彈發(fā)射的位置是 (x+24,y+11)
下面我們來設置一下
self.rect.x += 24 * 2.5
self.rect.y += 11 * 2.5
self.ySpeed = 0
self.xSpeed = 7
2.5是人物放大的倍數(shù),加載圖像的時候把圖像放大了2.5倍,所以設置子彈發(fā)射位置的時候,同樣要乘以2.5
if person.isStanding:# 判斷方向# 方向向右if person.direction == Direction.RIGHT:# 向上if person.isUp:pass# 向右else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7# 方向向左else:if person.isUp:passelse:passelif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:passelse:passelif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
(2). 站立向左發(fā)射子彈
self.rect.y += 11 * 2.5
self.ySpeed = 0
self.xSpeed = -7
# 根據(jù)角色的方向和狀態(tài)設置子彈發(fā)射的位置
# 角色站著
if person.isStanding:# 判斷方向if person.direction == Direction.RIGHT:# 向上if person.isUp:passelse:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:passelse:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:passelse:passelif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
(3). 站立朝上發(fā)射子彈
站立向右朝上發(fā)射子彈
self.rect.x += 10 * 2.5
self.rect.y += -1 * 2.5
self.ySpeed = -7
self.xSpeed = 0
這里我微微調整了一下y的值,方向向上,所以子彈的y是逐漸減小的,所以y速度是負數(shù)
# 根據(jù)角色的方向和狀態(tài)設置子彈發(fā)射的位置
# 角色站著
if person.isStanding:# 判斷方向if person.direction == Direction.RIGHT:# 向上if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:passelse:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:passelse:passelif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
站立向左朝上發(fā)射子彈也是同樣的計算方式
self.rect.x += 10 * 2.5
self.rect.y += -1 * 2.5
self.ySpeed = -7
self.xSpeed = 0
# 根據(jù)角色的方向和狀態(tài)設置子彈發(fā)射的位置
# 角色站著
if person.isStanding:# 判斷方向if person.direction == Direction.RIGHT:# 向上if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:passelse:passelif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
(4). 蹲下發(fā)射子彈
向右示意圖
self.rect.x += 34 * 2.5
self.rect.y += 25 * 2.5
self.ySpeed = 0
self.xSpeed = 7
# 根據(jù)角色的方向和狀態(tài)設置子彈發(fā)射的位置
# 角色站著
if person.isStanding:# 判斷方向if person.direction == Direction.RIGHT:# 向上if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:self.rect.x += 34 * 2.5self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = 7else:passelif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
同樣的,設置向左的發(fā)射位置
self.rect.y += 25 * 2.5
self.ySpeed = 0
self.xSpeed = -7
# 根據(jù)角色的方向和狀態(tài)設置子彈發(fā)射的位置
# 角色站著
if person.isStanding:# 判斷方向if person.direction == Direction.RIGHT:# 向上if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:self.rect.x += 34 * 2.5self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = 7else:self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:passelif person.isDown:passelse:passelse:if person.isUp:passelif person.isDown:passelse:passelif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
(5). 向斜方發(fā)射子彈
向斜右上方發(fā)射子彈示意圖
self.rect.x += 20 * 2.5
self.rect.y += -1 * 2.5
self.ySpeed = -7
self.xSpeed = 7
向斜左上方發(fā)射子彈時的子彈位置
self.rect.x += -3 * 2.5
self.rect.y += -1 * 2.5
self.ySpeed = -7
self.xSpeed = -7
向斜右下方發(fā)射子彈示意圖
self.rect.x += 21 * 2.5
self.rect.y += 20 * 2.5
self.ySpeed = 7
self.xSpeed = 7
向斜左下方發(fā)射子彈時的子彈位置
self.rect.x += -3 * 2.5
self.rect.y += 20 * 2.5
self.ySpeed = 7
self.xSpeed = -7
(6). 奔跑時發(fā)射子彈
奔跑時發(fā)射子彈和站立發(fā)射子彈是一樣的
向右
self.rect.x += 24 * 2.5
self.rect.y += 11 * 2.5
self.ySpeed = 0
self.xSpeed = 7
向左
self.rect.y += 11 * 2.5
self.ySpeed = 0
self.xSpeed = -7
完整的代碼
if person.isStanding:if person.direction == Direction.RIGHT:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:self.rect.x += 34 * 2.5self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = 7else:self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:self.rect.x += 20 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 7elif person.isDown:self.rect.x += 21 * 2.5self.rect.y += 20 * 2.5self.ySpeed = 7self.xSpeed = 7else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += -3 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = -7elif person.isDown:self.rect.x += -3 * 2.5self.rect.y += 20 * 2.5self.ySpeed = 7self.xSpeed = -7else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:passelse:pass
(7). 跳躍時發(fā)射子彈
elif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:self.rect.x += 16 * 2.5self.rect.y += 8 * 2.5self.ySpeed = 0self.xSpeed = 7else:self.rect.x += -2 * 2.5self.rect.y += 8 * 2.5self.ySpeed = 0self.xSpeed = -7
完整子彈類代碼
import pygame
from Constants import *class Bullet(pygame.sprite.Sprite):def __init__(self, person):pygame.sprite.Sprite.__init__(self)self.images = [loadImage('../Image/Bullet/bullet1.png')]self.index = 0self.image = self.images[self.index]# 速度self.xSpeed = 1self.ySpeed = 1self.rect = pygame.Rect(person.rect)if person.isStanding:if person.direction == Direction.RIGHT:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += 10 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 0else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isSquating and not person.isWalking:if person.direction == Direction.RIGHT:self.rect.x += 34 * 2.5self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = 7else:self.rect.y += 25 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isWalking:if person.direction == Direction.RIGHT:if person.isUp:self.rect.x += 20 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = 7elif person.isDown:self.rect.x += 21 * 2.5self.rect.y += 20 * 2.5self.ySpeed = 7self.xSpeed = 7else:self.rect.x += 24 * 2.5self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = 7else:if person.isUp:self.rect.x += -3 * 2.5self.rect.y += -1 * 2.5self.ySpeed = -7self.xSpeed = -7elif person.isDown:self.rect.x += -3 * 2.5self.rect.y += 20 * 2.5self.ySpeed = 7self.xSpeed = -7else:self.rect.y += 11 * 2.5self.ySpeed = 0self.xSpeed = -7elif person.isJumping or person.state == State.FALL:if person.direction == Direction.RIGHT:self.rect.x += 16 * 2.5self.rect.y += 8 * 2.5self.ySpeed = 0self.xSpeed = 7else:self.rect.x += -2 * 2.5self.rect.y += 8 * 2.5self.ySpeed = 0self.xSpeed = -7# 銷毀開關self.isDestroy = Falsedef move(self):self.rect.x += self.xSpeedself.rect.y += self.ySpeedself.checkBullet()def draw(self, window):window.blit(self.image, self.rect)def checkBullet(self):toDestroy = Falseif self.rect.top < 0 or self.rect.top > 600:toDestroy = Trueif self.rect.left < 0 or self.rect.right > 900:toDestroy = Trueif toDestroy:self.isDestroy = True
3. 在玩家類中加入開火
在常量文件中設置子彈上限
# 設置玩家子彈上限
PLAYER_BULLET_NUMBER = 15
在玩家類的四個狀態(tài)函數(shù)中加入發(fā)射的代碼
if keys[pygame.K_j]:self.isFiring = Trueif len(playerBulletList) < PLAYER_BULLET_NUMBER:# 設置子彈發(fā)射的間隔為150if currentTime - self.fireLastTimer > 150:playerBulletList.append(Bullet(self))self.fireLastTimer = currentTime
完整的玩家類
import pygame
from Constants import *
from Bullet import Bulletclass PlayerOne(pygame.sprite.Sprite):def __init__(self, currentTime):pygame.sprite.Sprite.__init__(self)# 加載角色圖片self.standRightImage = loadImage('../Image/Player/Player1/Right/stand.png')self.standLeftImage = loadImage('../Image/Player/Player1/Left/stand.png')self.upRightImage = loadImage('../Image/Player/Player1/Up/upRight(small).png')self.upLeftImage = loadImage('../Image/Player/Player1/Up/upLeft(small).png')self.downRightImage = loadImage('../Image/Player/Player1/Down/down.png')self.downLeftImage = loadImage('../Image/Player/Player1/Down/down.png', True)self.obliqueUpRightImages = [loadImage('../Image/Player/Player1/Up/rightUp1.png'),loadImage('../Image/Player/Player1/Up/rightUp2.png'),loadImage('../Image/Player/Player1/Up/rightUp3.png'),]self.obliqueUpLeftImages = [loadImage('../Image/Player/Player1/Up/rightUp1.png', True),loadImage('../Image/Player/Player1/Up/rightUp2.png', True),loadImage('../Image/Player/Player1/Up/rightUp3.png', True),]self.obliqueDownRightImages = [loadImage('../Image/Player/Player1/ObliqueDown/1.png'),loadImage('../Image/Player/Player1/ObliqueDown/2.png'),loadImage('../Image/Player/Player1/ObliqueDown/3.png'),]self.obliqueDownLeftImages = [loadImage('../Image/Player/Player1/ObliqueDown/1.png', True),loadImage('../Image/Player/Player1/ObliqueDown/2.png', True),loadImage('../Image/Player/Player1/ObliqueDown/3.png', True),]# 角色向右的全部圖片self.rightImages = [loadImage('../Image/Player/Player1/Right/run1.png'),loadImage('../Image/Player/Player1/Right/run2.png'),loadImage('../Image/Player/Player1/Right/run3.png')]# 角色向左的全部圖片self.leftImages = [loadImage('../Image/Player/Player1/Left/run1.png'),loadImage('../Image/Player/Player1/Left/run2.png'),loadImage('../Image/Player/Player1/Left/run3.png')]# 角色跳躍的全部圖片self.upRightImages = [loadImage('../Image/Player/Player1/Jump/jump1.png'),loadImage('../Image/Player/Player1/Jump/jump2.png'),loadImage('../Image/Player/Player1/Jump/jump3.png'),loadImage('../Image/Player/Player1/Jump/jump4.png'),]self.upLeftImages = [loadImage('../Image/Player/Player1/Jump/jump1.png', True),loadImage('../Image/Player/Player1/Jump/jump2.png', True),loadImage('../Image/Player/Player1/Jump/jump3.png', True),loadImage('../Image/Player/Player1/Jump/jump4.png', True),]self.rightFireImages = [loadImage('../Image/Player/Player1/Right/fire1.png'),loadImage('../Image/Player/Player1/Right/fire2.png'),loadImage('../Image/Player/Player1/Right/fire3.png'),]self.leftFireImages = [loadImage('../Image/Player/Player1/Right/fire1.png', True),loadImage('../Image/Player/Player1/Right/fire2.png', True),loadImage('../Image/Player/Player1/Right/fire3.png', True),]# 角色左右移動下標self.imageIndex = 0# 角色跳躍下標self.upImageIndex = 0# 角色斜射下標self.obliqueImageIndex = 0# 上一次顯示圖片的時間self.runLastTimer = currentTimeself.fireLastTimer = currentTime# 選擇當前要顯示的圖片self.image = self.standRightImage# 獲取圖片的rectself.rect = self.image.get_rect()# 設置角色的狀態(tài)self.state = State.STAND# 角色的方向self.direction = Direction.RIGHT# 速度self.xSpeed = PLAYER_X_SPEEDself.ySpeed = 0self.jumpSpeed = -11# 人物當前的狀態(tài)標志self.isStanding = Falseself.isWalking = Falseself.isJumping = Trueself.isSquating = Falseself.isFiring = False# 重力加速度self.gravity = 0.7self.isUp = Falseself.isDown = Falsedef update(self, keys, currentTime, playerBulletList):# 更新站或者走的狀態(tài)# 根據(jù)狀態(tài)響應按鍵if self.state == State.STAND:self.standing(keys, currentTime, playerBulletList)elif self.state == State.WALK:self.walking(keys, currentTime, playerBulletList)elif self.state == State.JUMP:self.jumping(keys, currentTime, playerBulletList)elif self.state == State.FALL:self.falling(keys, currentTime, playerBulletList)# 更新位置# 記錄前一次的位置坐標pre = self.rect.xself.rect.x += self.xSpeedself.rect.y += self.ySpeed# 如果x位置小于0了,就不能移動,防止人物跑到屏幕左邊if self.rect.x <= 0:self.rect.x = pre# 更新動畫# 跳躍狀態(tài)if self.isJumping:# 根據(jù)方向if self.direction == Direction.RIGHT:# 方向向右,角色加載向右跳起的圖片self.image = self.upRightImages[self.upImageIndex]else:# 否則,方向向左,角色加載向左跳起的圖片self.image = self.upLeftImages[self.upImageIndex]# 角色蹲下if self.isSquating:if self.direction == Direction.RIGHT:# 加載向右蹲下的圖片self.image = self.downRightImageelse:# 加載向左蹲下的圖片self.image = self.downLeftImage# 角色站著if self.isStanding:if self.direction == Direction.RIGHT:if self.isUp:# 加載向右朝上的圖片self.image = self.upRightImageelif self.isDown:# 加載向右蹲下的圖片self.image = self.downRightImageelse:# 加載向右站著的圖片self.image = self.standRightImageelse:# 向左也是同樣的效果if self.isUp:self.image = self.upLeftImageelif self.isDown:self.image = self.downLeftImageelse:self.image = self.standLeftImage# 角色移動if self.isWalking:if self.direction == Direction.RIGHT:if self.isUp:# 加載斜右上的圖片self.image = self.obliqueUpRightImages[self.obliqueImageIndex]elif self.isDown:# 加載斜右下的圖片self.image = self.obliqueDownRightImages[self.obliqueImageIndex]else:# 加載向右移動的圖片,根據(jù)開火狀態(tài)是否加載向右開火移動的圖片if self.isFiring:self.image = self.rightFireImages[self.imageIndex]else:self.image = self.rightImages[self.imageIndex]else:if self.isUp:self.image = self.obliqueUpLeftImages[self.obliqueImageIndex]elif self.isDown:self.image = self.obliqueDownLeftImages[self.obliqueImageIndex]else:if self.isFiring:self.image = self.leftFireImages[self.imageIndex]else:self.image = self.leftImages[self.imageIndex]def standing(self, keys, currentTime, playerBulletList):"""角色站立"""# 設置角色狀態(tài)self.isStanding = Trueself.isWalking = Falseself.isJumping = Falseself.isSquating = Falseself.isUp = Falseself.isDown = Falseself.isFiring = False# 設置速度self.ySpeed = 0self.xSpeed = 0# 按下A鍵if keys[pygame.K_a]:# A按下,角色方向向左self.direction = Direction.LEFT# 改變角色的狀態(tài),角色進入移動狀態(tài)self.state = State.WALK# 設置站立狀態(tài)為False,移動狀態(tài)為Trueself.isStanding = Falseself.isWalking = True# 向左移動,速度為負數(shù),這樣玩家的x坐標是減小的self.xSpeed = -PLAYER_X_SPEED# 按下D鍵elif keys[pygame.K_d]:# D按下,角色方向向右self.direction = Direction.RIGHT# 改變角色的狀態(tài),角色進入移動狀態(tài)self.state = State.WALK# 設置站立狀態(tài)為False,移動狀態(tài)為Trueself.isStanding = Falseself.isWalking = True# 向右移動,速度為正數(shù)self.xSpeed = PLAYER_X_SPEED# 按下k鍵elif keys[pygame.K_k]:# K按下,角色進入跳躍狀態(tài),但是不會改變方向self.state = State.JUMP# 設置站立狀態(tài)為False,跳躍狀態(tài)為True# 不改變移動狀態(tài),因為移動的時候也可以跳躍self.isStanding = Falseself.isJumping = True# 設置速度,速度為負數(shù),因為角色跳起后,要下落self.ySpeed = self.jumpSpeed# 沒有按下按鍵else:# 沒有按下按鍵,角色依然是站立狀態(tài)self.state = State.STANDself.isStanding = True# 按下w鍵if keys[pygame.K_w]:# W按下,角色向上,改變方向狀態(tài)self.isUp = Trueself.isStanding = Trueself.isDown = Falseself.isSquating = False# 按下s鍵elif keys[pygame.K_s]:# S按下,角色蹲下,改變方向狀態(tài),并且蹲下狀態(tài)設置為Trueself.isUp = Falseself.isStanding = Falseself.isDown = Trueself.isSquating = Trueif keys[pygame.K_j]:self.isFiring = Trueif len(playerBulletList) < PLAYER_BULLET_NUMBER:if currentTime - self.fireLastTimer > 150:playerBulletList.append(Bullet(self))self.fireLastTimer = currentTimedef walking(self, keys, currentTime, playerBulletList):"""角色行走,每10幀變換一次圖片"""self.isStanding = Falseself.isWalking = Trueself.isJumping = Falseself.isSquating = Falseself.isFiring = Falseself.ySpeed = 0self.xSpeed = PLAYER_X_SPEED# 如果當前是站立的圖片if self.isStanding:# 方向向右,方向向上if self.direction == Direction.RIGHT and self.isUp:# 設置為向右朝上的圖片self.image = self.upRightImage# 方向向右elif self.direction == Direction.RIGHT and not self.isUp:# 設置為向右站立的圖片self.image = self.standRightImageelif self.direction == Direction.LEFT and self.isUp:self.image = self.upLeftImageelif self.direction == Direction.LEFT and not self.isUp:self.image = self.standLeftImage# 記下當前時間self.runLastTimer = currentTimeelse:# 如果是走動的圖片,先判斷方向if self.direction == Direction.RIGHT:# 設置速度self.xSpeed = PLAYER_X_SPEED# 根據(jù)上下方向覺得是否角色要加載斜射的圖片if self.isUp or self.isDown:# isUp == True表示向上斜射# isDown == True表示向下斜射# 計算上一次加載圖片到這次的時間,如果大于115,即11.5幀,即上次加載圖片到這次加載圖片之間,已經(jīng)加載了11張圖片if currentTime - self.runLastTimer > 115:# 那么就可以加載斜著奔跑的圖片# 如果角色加載的圖片不是第三張,則加載下一張就行if self.obliqueImageIndex < 2:self.obliqueImageIndex += 1# 否則就加載第一張圖片else:self.obliqueImageIndex = 0# 記錄變換圖片的時間,為下次變換圖片做準備self.runLastTimer = currentTime# 不是斜射else:# 加載正常向右奔跑的圖片if currentTime - self.runLastTimer > 115:if self.imageIndex < 2:self.imageIndex += 1else:self.imageIndex = 0self.runLastTimer = currentTimeelse:self.xSpeed = -PLAYER_X_SPEEDif self.isUp or self.isDown:if currentTime - self.runLastTimer > 115:if self.obliqueImageIndex < 2:self.obliqueImageIndex += 1else:self.obliqueImageIndex = 0self.runLastTimer = currentTimeelse:if currentTime - self.runLastTimer > 115:if self.imageIndex < 2:self.imageIndex += 1else:self.imageIndex = 0self.runLastTimer = currentTime# 按下D鍵if keys[pygame.K_d]:self.direction = Direction.RIGHTself.xSpeed = PLAYER_X_SPEED# 按下A鍵elif keys[pygame.K_a]:self.direction = Direction.LEFTself.xSpeed = -PLAYER_X_SPEED# 按下S鍵elif keys[pygame.K_s]:self.isStanding = Falseself.isDown = True# 按下W鍵if keys[pygame.K_w]:self.isUp = Trueself.isDown = False# 沒有按鍵按下else:self.state = State.STAND# 移動時按下K鍵if keys[pygame.K_k]:# 角色狀態(tài)變?yōu)樘Sself.state = State.JUMPself.ySpeed = self.jumpSpeedself.isJumping = Trueself.isStanding = Falseif keys[pygame.K_j]:self.isFiring = Trueif len(playerBulletList) < PLAYER_BULLET_NUMBER:if currentTime - self.fireLastTimer > 150:playerBulletList.append(Bullet(self))self.fireLastTimer = currentTimedef jumping(self, keys, currentTime, playerBulletList):"""跳躍"""# 設置標志self.isJumping = Trueself.isStanding = Falseself.isDown = Falseself.isSquating = Falseself.isFiring = False# 更新速度self.ySpeed += self.gravityif currentTime - self.runLastTimer > 115:if self.upImageIndex < 3:self.upImageIndex += 1else:self.upImageIndex = 0# 記錄變換圖片的時間,為下次變換圖片做準備self.runLastTimer = currentTimeif keys[pygame.K_d]:self.direction = Direction.RIGHTelif keys[pygame.K_a]:self.direction = Direction.LEFT# 按下W鍵if keys[pygame.K_w]:self.isUp = Trueself.isDown = Falseelif keys[pygame.K_s]:self.isUp = Falseself.isDown = Trueif self.ySpeed >= 0:self.state = State.FALLif not keys[pygame.K_k]:self.state = State.FALLif keys[pygame.K_j]:self.isFiring = Trueif len(playerBulletList) < PLAYER_BULLET_NUMBER:if currentTime - self.fireLastTimer > 150:playerBulletList.append(Bullet(self))self.fireLastTimer = currentTimedef falling(self, keys, currentTime, playerBulletList):# 下落時速度越來越快,所以速度需要一直增加self.ySpeed += self.gravityif currentTime - self.runLastTimer > 115:if self.upImageIndex < 3:self.upImageIndex += 1else:self.upImageIndex = 0self.runLastTimer = currentTime# 防止落到窗口外面,當落到一定高度時,就不會再掉落了if self.rect.bottom > SCREEN_HEIGHT - GROUND_HEIGHT:self.state = State.WALKself.ySpeed = 0self.rect.bottom = SCREEN_HEIGHT - GROUND_HEIGHTself.isJumping = Falseif keys[pygame.K_d]:self.direction = Direction.RIGHTself.isWalking = Falseelif keys[pygame.K_a]:self.direction = Direction.LEFTself.isWalking = Falseif keys[pygame.K_j]:self.isFiring = Trueif len(playerBulletList) < PLAYER_BULLET_NUMBER:if currentTime - self.fireLastTimer > 150:playerBulletList.append(Bullet(self))self.fireLastTimer = currentTime
4. 修改主類實現(xiàn)玩家開火
由于玩家類中的update()方法多了一個子彈列表的參數(shù),現(xiàn)在要修改主類
在主類中加入子彈列表
# 子彈
player1BulletList = []
修改run()函數(shù),把子彈列表傳入update()函數(shù)
def run(self):while not self.isEnd:# 獲取窗口中的事件self.getPlayingModeEvent()# 游戲場景和景物更新函數(shù)self.update(MainGame.window, MainGame.player1BulletList)# 更新窗口pygame.display.update()# 設置幀率self.clock.tick(self.fps)fps = self.clock.get_fps()caption = '魂斗羅 - {:.2f}'.format(fps)pygame.display.set_caption(caption)else:sys.exit()
修改update()函數(shù)
def update(self, window, player1BulletList):# 更新物體currentTime = pygame.time.get_ticks()MainGame.allSprites.update(self.keys, currentTime, player1BulletList)drawPlayerOneBullet(player1BulletList)# 顯示物體MainGame.allSprites.draw(window)
創(chuàng)建顯示子彈函數(shù),在類外創(chuàng)建
def drawPlayerOneBullet(player1BulletList):for bullet in player1BulletList:if bullet.isDestroy:player1BulletList.remove(bullet)else:bullet.draw(MainGame.window)bullet.move()
完整的主類代碼
import sys
import pygame
from Constants import *
from PlayerOne import PlayerOnedef drawPlayerOneBullet(player1BulletList):for bullet in player1BulletList:if bullet.isDestroy:player1BulletList.remove(bullet)else:bullet.draw(MainGame.window)bullet.move()class MainGame:player1 = NoneallSprites = Nonewindow = None# 子彈player1BulletList = []def __init__(self):# 初始化展示模塊pygame.display.init()SCREEN_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window = pygame.display.set_mode(SCREEN_SIZE)# 設置窗口標題pygame.display.set_caption('魂斗羅角色')# 是否結束游戲self.isEnd = False# 獲取按鍵self.keys = pygame.key.get_pressed()# 幀率self.fps = 60self.clock = pygame.time.Clock()# 初始化角色MainGame.player1 = PlayerOne(pygame.time.get_ticks())# 設置角色的初始位置# 這里設置為(0,80),可以實現(xiàn)一開始玩家掉下來的動畫MainGame.player1.rect.x = 80MainGame.player1.rect.bottom = 300# 把角色放入組中,方便統(tǒng)一管理MainGame.allSprites = pygame.sprite.Group(MainGame.player1)def run(self):while not self.isEnd:# 設置背景顏色pygame.display.get_surface().fill((0, 0, 0))# 游戲場景和景物更新函數(shù)self.update(MainGame.window, MainGame.player1BulletList)# 獲取窗口中的事件self.getPlayingModeEvent()# 更新窗口pygame.display.update()# 設置幀率self.clock.tick(self.fps)fps = self.clock.get_fps()caption = '魂斗羅 - {:.2f}'.format(fps)pygame.display.set_caption(caption)else:sys.exit()def getPlayingModeEvent(self):# 獲取事件列表for event in pygame.event.get():# 點擊窗口關閉按鈕if event.type == pygame.QUIT:self.isEnd = True# 鍵盤按鍵按下elif event.type == pygame.KEYDOWN:self.keys = pygame.key.get_pressed()# 鍵盤按鍵抬起elif event.type == pygame.KEYUP:self.keys = pygame.key.get_pressed()def update(self, window, player1BulletList):# 更新物體currentTime = pygame.time.get_ticks()MainGame.allSprites.update(self.keys, currentTime, player1BulletList)drawPlayerOneBullet(player1BulletList)# 顯示物體MainGame.allSprites.draw(window)if __name__ == '__main__':MainGame().run()
運行一下,看看效果
哈哈,完成了