Python游戏编程之赛车游戏6-2

news/2025/2/26 19:59:25

3.2 move()方法的定义

Player类的move()方法用于玩家控制汽车左右移动,当玩家点击键盘上的左右按键时,汽车会相应地进行左右移动。

move()方法的代码如图7所示。

图7 move()方法的代码

其中,第20行代码通过pygame.key.get_pressed()函数获取键盘中所有按键的状态,并将其保存在变量pressed_keys中,当玩家按下了向左的按键,pressed_keys[K_LEFT]的值是True,当玩家按下了向右的按键,pressed_keys[K_RIGHT]的值是True。第22-24行代码中,首先判断玩家汽车的位置是否已经到了屏幕的最左端,如果没有在屏幕最左端,则第23行代码判断玩家是否按下了向左的按键,如果该按键被按下则第24行代码将玩家汽车的位置向左移动5个单位。第22-24行代码保证了如果玩家汽车位于屏幕最左端,此时不会再移动到屏幕之外。同理,第25-27行代码是对用户按下了向右按键的处理,第25行代码判断玩家汽车是否位于屏幕的最右端,如果没有在最右端,则第26行代码判断玩家是否按下了向右的按键,如果该按键被按下则第27行代码将玩家汽车的位置向右移动5个单位。第25-27行代码保证了如果玩家汽车位于屏幕最右端,此时不会再移动到屏幕之外。

相关链接5  Pygame的Rect类的资料,请参考

《Pygame中Rect类的使用方法2-1》

《Pygame中Rect类的使用方法2-2》

相关链接6 Pygame的键盘监听资料,请参考

《Pygame中监控键盘按键的方法》

4 实例化Player类及相关处理

4.1 实例化Player类

通过图8所示的代码实例化Player类。

图8 实例化Player类的代码

其中, P1是Player类的实例。

4.2 将P1加入到精灵组中

P1是Player类的实例,而Player类是pygame.sprite.Sprite类的子类,因此P1可以看作是一个“精灵”。将“精灵”加入到“精灵组”可以方便对多个“精灵”进行批量处理。代码如图9所示。

图9 将P1加入到精灵组的代码

其中,第29行通过pygame.sprite.Group()创建“精灵组”all_sprites,该“精灵组”中将会包含游戏中的所有“精灵”,即包含玩家也包含“敌人”。

4.3 显示及控制玩家汽车

在while True循环中,通过“精灵组”all_sprites实现显示及控制玩家汽车的功能,代码如图10所示。

图10 显示及控制玩家汽车的代码

其中,第39行代码通过for循环遍历“精灵组”all_sprites中的所有精灵(目前组里面只有玩家一个精灵),之后第40行代码调用精灵的move()方法控制“精灵”的移动;第41行代码绘制“精灵”。

运行代码后,游戏的效果如图11所示。

图11 游戏效果

5 完整代码

以上内容的完整代码如下所示。

python">import pygame
import os
from pygame.locals import *

WIDTH = 400
HEIGHT = 600
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption('赛车游戏')

background = pygame.image.load("AnimatedStreet.png")

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        self.image = pygame.image.load("Player.png")
        self.rect = self.image.get_rect()
        self.rect.center = (160, 520)
    def move(self):
        pressed_keys = pygame.key.get_pressed()
        
        if self.rect.left > 0:
              if pressed_keys[K_LEFT]:
                  self.rect.move_ip(-5, 0)
        if self.rect.right < WIDTH:        
              if pressed_keys[K_RIGHT]:
                  self.rect.move_ip(5, 0)
P1 = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(P1)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            os.sys.exit()
    
    screen.blit(background, (0,0))
    for entity in all_sprites:
        entity.move()
        screen.blit(entity.image, entity.rect)
    pygame.display.update()


http://www.niftyadmin.cn/n/5869124.html

相关文章

Java进阶(vue基础)

目录 1.vue简单入门 ?1.1.创建一个vue程序 1.2.使用Component模板(组件&#xff09; 1.3.引入AXOIS ?1.4.vue的Methods&#xff08;方法&#xff09; 和?compoted&#xff08;计算&#xff09; 1.5.插槽slot 1.6.创建自定义事件? 2.Vue脚手架安装? 3.Element-UI的…

计算机基础之操作系统——进程与线程管理(二)

1、进程的状态有哪些&#xff1f; 新建&#xff08;New&#xff09;&#xff1a;当一个进程刚刚被创建时&#xff0c;它处于新建状态。在这个状态下&#xff0c;操作系统为进程分配必要的资源&#xff0c;如内存、文件描述符等&#xff0c;并初始化进程控制块&#xff08;PCB&a…

pycharm管理虚拟环境

不借用Anoconda 1.检查pip所在位置&#xff0c; 因为pip的默认安装路径是python的安装目录下的依赖库路径D:\Program Files\Python397\Lib\site-packages。项目如果用之前pycharm创建的环境是无法加载这个路径的库的。 2.安装时指定安装路径 千万要注意指定安装路径为项目的…

【HarmonyOS Next】鸿蒙循环渲染ForEach,LazyForEach,Repeat使用心得体会

【HarmonyOS Next】鸿蒙循环渲染ForEach&#xff0c;LazyForEach&#xff0c;Repeat使用心得体会 一、ForEach&#xff0c;LazyForEach&#xff0c;Repeat三者关系 在鸿蒙中列表组件循环渲染的实现&#xff0c;一般都是通过ForEach来配合列表容器组件实现&#xff0c;例如Lis…

LeetCode 解题思路 2(Hot 100)

解题思路&#xff1a; 哈希去重&#xff1a; 将所有元素存入哈希集合。遍历检查起点&#xff1a; 对每个元素&#xff0c;若其前驱不存在&#xff0c;则作为起点开始向后扩展&#xff0c;统计最长连续序列。 Java代码&#xff1a; class Solution {public int longestConsec…

线代[8]|北大丘维声教授《怎样学习线性代数?》(红色字体为博主本人注释)

文章目录 说明一、线性代数的内容简介二、学习线性代数的用处三、线性代数的特点四、学习线性代数的方法五、更新时间记录 说明 文章中红色字体为博主敲录完丘教授这篇文章后所加&#xff0c;刷到这篇文章的读者在首次阅读应当跳过红色字体&#xff0c;先通读一读文章全文&…

rust笔记10-多线程

在 Rust 中,Sync 和 Send 是用于多线程编程的两个关键 trait,它们帮助确保线程安全和数据同步。 Send 和 Sync Trait Send: 表示类型的所有权可以在线程间安全传递。如果一个类型实现了 Send,它的实例可以从一个线程移动到另一个线程。大多数类型都实现了 Send,但像 Rc<…

SSH.NET: .NET 平台上的安全 Shell 库

简介 SSH.NET 是一个针对 .NET 平台优化的 Secure Shell (SSH-2) 库&#xff0c;支持并行操作。它提供了丰富的功能&#xff0c;包括执行 SSH 命令、SFTP 和 SCP 文件传输、端口转发、交互式终端等功能&#xff0c;并支持多种认证方式和加密方法。 主要特性 命令执行&#x…