国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

寧德網站建設維護如何優(yōu)化網站排名

寧德網站建設維護,如何優(yōu)化網站排名,陜西十二建設有限公司網站,做別人一樣的網站嗎學習 Python 之 Pygame 開發(fā)魂斗羅(四)繼續(xù)編寫魂斗羅1. 創(chuàng)建子彈類2. 根據玩家方向和狀態(tài)設置子彈發(fā)射的位置(1). 站立向右發(fā)射子彈(2). 站立向左發(fā)射子彈(3). 站立朝上發(fā)射子彈(4). 蹲下發(fā)射子彈(5). 向斜方發(fā)射子彈(6). 奔跑時發(fā)射子彈(7). 跳躍時發(fā)射…

學習 Python 之 Pygame 開發(fā)魂斗羅(四)

    • 繼續(xù)編寫魂斗羅
      • 1. 創(chuàng)建子彈類
      • 2. 根據玩家方向和狀態(tài)設置子彈發(fā)射的位置
        • (1). 站立向右發(fā)射子彈
        • (2). 站立向左發(fā)射子彈
        • (3). 站立朝上發(fā)射子彈
        • (4). 蹲下發(fā)射子彈
        • (5). 向斜方發(fā)射子彈
        • (6). 奔跑時發(fā)射子彈
        • (7). 跳躍時發(fā)射子彈
      • 3. 在玩家類中加入開火
      • 4. 修改主類實現玩家開火

繼續(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. 根據玩家方向和狀態(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是人物放大的倍數,加載圖像的時候把圖像放大了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
# 根據角色的方向和狀態(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速度是負數

# 根據角色的方向和狀態(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
# 根據角色的方向和狀態(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
# 根據角色的方向和狀態(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
# 根據角色的方向和狀態(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)函數中加入發(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)# 根據狀態(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:# 根據方向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:# 加載向右移動的圖片,根據開火狀態(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# 向左移動,速度為負數,這樣玩家的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# 向右移動,速度為正數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# 設置速度,速度為負數,因為角色跳起后,要下落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# 根據上下方向覺得是否角色要加載斜射的圖片if self.isUp or self.isDown:# isUp == True表示向上斜射# isDown == True表示向下斜射# 計算上一次加載圖片到這次的時間,如果大于115,即11.5幀,即上次加載圖片到這次加載圖片之間,已經加載了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. 修改主類實現玩家開火

由于玩家類中的update()方法多了一個子彈列表的參數,現在要修改主類

在主類中加入子彈列表

# 子彈
player1BulletList = []

在這里插入圖片描述
修改run()函數,把子彈列表傳入update()函數

def run(self):while not self.isEnd:# 獲取窗口中的事件self.getPlayingModeEvent()# 游戲場景和景物更新函數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()函數

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)建顯示子彈函數,在類外創(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),可以實現一開始玩家掉下來的動畫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))# 游戲場景和景物更新函數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()

運行一下,看看效果
在這里插入圖片描述
哈哈,完成了

http://m.aloenet.com.cn/news/42133.html

相關文章:

  • wordpress主題后空白seo知識分享
  • 做網站底色怎么選網站seo排名公司
  • 蘭州互聯(lián)網公司seo深度解析
  • 怎樣建設網站公司百度app關鍵詞優(yōu)化
  • 質感企業(yè)網站導航用ps怎么做百度圖片搜索網頁版
  • 關于網站開發(fā)專業(yè)的pptseo診斷專家
  • 網站建設詳細教程寧波seo推廣優(yōu)化公司
  • 河北網站建設排名站長seo查詢工具
  • 便宜的做網站公司關鍵詞seo公司推薦
  • 深圳專門做網站阿里云域名查詢和注冊
  • 簡易網站開發(fā)巨量引擎
  • 電子商務網站服務器上海網絡營銷公司
  • dw手機網站建設500個游戲推廣群
  • 班級網站素材下載百度推廣有哪些推廣方式
  • 大型網站制作梅州網絡推廣
  • 百度網站錄入網站整站優(yōu)化
  • 建行app官方下載搜索引擎優(yōu)化中的步驟包括
  • 淘寶優(yōu)惠券微網站開發(fā)手機版怎么用百度快照
  • wordpress固定鏈接是存在哪個表襄陽seo優(yōu)化排名
  • 如何查看一個網站是用什么程序做的南寧企業(yè)官網seo
  • 廣東網站建設公司報價表濟南做網站公司哪家好
  • 中企動力合作網站銷售找客戶的方法
  • 凡科建站免費版可以做什么2021熱門網絡營銷案例
  • 網站建設需要了解哪些方面seo上海培訓
  • 校園云網站建設如何快速推廣網站
  • 遼寧建設廳規(guī)劃設計網站如何在百度做免費推廣產品
  • 如何做旅游網站seo軟件定制
  • 西安網站建設制作價格百度客戶端登錄
  • 一個網站如何做推廣百度搜索風云榜總榜
  • 男女做爰真人視頻免費網站b2b網站有哪些平臺