首页 > 其他分享 >解决Pygame精灵会跳但不会走的问题

解决Pygame精灵会跳但不会走的问题

时间:2024-02-07 10:32:59浏览次数:16  
标签:self 精灵 cell pygame key 解决 rect Pygame

根据我从事几年游戏开发的经验,我们知道在Pygame中,精灵(Sprite)是游戏中的基本元素,通常代表游戏中的角色、物体或动画。精灵可以执行各种动作,包括移动、跳跃、碰撞检测等。但是如果我们遇到Pygame精灵能够跳跃但不能走动,可能有多种问题存在,废话不多说,直接看下面详细过程,相信看过了懂的应该都会懂。

解决Pygame精灵会跳但不会走的问题_sed

问题背景:

在 Pygame 中,创建了一个可以跳跃但是无法正常移动的精灵对象,移动时只能移动几个像素,希望解决这个问题,以便精灵对象能够正常行走。

解决方案:

1、问题分析:

问题主要在于精灵对象的移动速度设置不当,导致精灵对象只能移动几个像素。

2、修复代码:

class Player(pygame.sprite.Sprite):
    def __init__(self, *groups):
        super(Player, self).__init__(groups)
        self.image = pygame.image.load('Images\player1.png')
        self.rect = pygame.rect.Rect((50, 650), self.image.get_size())
        self.resting = False
        self.dy = 0 #dy represents change in y velocity

    def update(self, dt, game):
        last = self.rect.copy()
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            # Increase the move speed to allow the sprite to move smoothly
            self.rect.x -= 500 * dt
        if key[pygame.K_RIGHT]:
            self.rect.x += 500 * dt
        #if key[pygame.K_UP]:
        #    self.rect.y -= 300 * dt
        #if key[pygame.K_DOWN]:
        #    self.rect.y += 300 * dt

        if self.resting and key[pygame.K_SPACE]:
            self.dy = -500 #If space bar is pressed, increase velocity.
        self.dy = min(400, self.dy + 40) #Speed capped at 400. Gravity set at 40.
        self.rect.y += self.dy * dt

        new = self.rect
        self.resting = False
        for cell in pygame.sprite.spritecollide(self, game.walls, False):
            #self.rect = last
            cell = cell.rect
            if last.right <= cell.left and new.right > cell.left:
                new.right = cell.left               
            if last.left >= cell.right and new.left < cell.right:
                new.left = cell.right
            if last.bottom <= cell.top and new.bottom > cell.top:
                #if you hit something while jumping, stop.
                self.resting = True
                new.bottom = cell.top
                self.dy = 0
            if last.top >= cell.bottom and new.top < cell.bottom:
                new.top = cell.bottom
                self.dy = 0 #If you hit the floor while jumping, stop

# Increase the speed of the sprite movement
move_speed = 500
# Modify the update method to update the position of the sprite based on the input
def update(self, dt, game):
    key = pygame.key.get_pressed()
    if key[pygame.K_LEFT]:
        self.rect.x -= move_speed * dt
    if key[pygame.K_RIGHT]:
        self.rect.x += move_speed * dt

3、解释:

  • class Player: 定义了一个精灵类 Player,它继承自 pygame.sprite.Sprite
  • __init__(self, *groups): Player 的构造函数,初始化精灵对象。
  • update(self, dt, game): Player 的更新方法,根据输入更新精灵对象的位置。
  • dt: 时间增量。
  • game: 游戏对象。
  • move_speed: 定义了精灵对象的移动速度。
  • key: 获取当前按下的按键。
  • if key[pygame.K_LEFT]: 如果按下左键,将精灵对象向左移动。
  • if key[pygame.K_RIGHT]: 如果按下右键,将精灵对象向右移动。

通过调整 move_speed 的值,可以控制精灵对象的移动速度。

这些数据可以用来创建游戏中的精灵、地图、背景音乐等,从而增强游戏体验。检查精灵的移动速度设置,确保速度不是零或非常小。如果速度太小,精灵移动时可能会被视为静止。所以说,解决了上面的问题,对于游戏开发是有非常好的效果的。如果各位有问题可以这里留言讨论。

标签:self,精灵,cell,pygame,key,解决,rect,Pygame
From: https://blog.51cto.com/u_13488918/9634665

相关文章

  • 已解决java.lang.IllegalAccessException异常的正确解决方法,亲测有效!!!
    已解决java.lang.IllegalAccessException异常的正确解决方法,亲测有效!!!文章目录问题分析与报错原因解决思路解决方法总结 ----------------------------------------------------------------------------------------------------------------问题分析与报错原因java.lang.IllegalA......
  • Git配置SSH key(解决需要一直输入用户名和密码的问题)
    1、检查自己电脑上是否已经生成了SSHkey(1)打开gitbash(2)输入cd~,进入家目录(3)输入cd.ssh,出现bash:cd:.ssh:Nosuchfileordirectory则表示没有 注:若要重新生成SSHkey,可以删除改文件2、创建SSHkey(1)输入[email protected],需要连续回车(2)执行完该命令,将会......
  • python入门教程详细从零基础入门到精通一站式解决方案
    前言众所周知,Python以优雅、简洁著称,入行门槛低,可以从事Linux运维、PythonWeb网站工程师python自动化测试、数据分析、人工智能等职位,薪资待遇呈上涨趋势,对于许多未曾涉足IT行业「小白」来说,深入地学习python是一件十分困难的事。我这个小萌新当时什么也不懂,就傻乎乎地开始了学......
  • 解决使用XYplorer代替系统资源管理器后无法打开控制面板的问题
    1.问题由于赋予了XYexplorer系统权限,每次打开一个文件夹都要提示是否允许来自未知发布者的此应用对你的设备进行更改,经查阅资料后采用以下方案:关闭win10安全警告但是出现新的问题:XYexplorer无法打开虚拟文件夹,如控制面板,垃圾回收站等等,当我们在此电脑中选择属性,会自动被XYplore......
  • 解决VS Code中使用WSL开发Ruby程序每次打开控制台都需要输入/bin/bash --login的问题
    项目的开发环境是在VSCode上连接WSL开发,使用的语言是Ruby,每次打开控制台都需要先输入/bin/bash--login才能继续输入其他命令,为此,找遍了全网的资料,最终找到了解决的办法,特此记录一下,步骤如下:1.在终端输入vim~/.bashrc回车打开文件2.复制下面的代码粘贴至文件最后[[-s"$HOME/.......
  • 解决terraform部署storage account management policy问题
    承接上文TerraformAzurediagnosticsetting升级,之前说到azurerm_monitor_diagnostic_setting里的retentionpolicy已经deprecated了,需要用azurerm_storage_management_policy替换以recoveryservicevault的诊断设置为例,对应的azurerm_storage_management_policy可以参考下边的代......
  • 解决淘宝登录频繁提示,验证失败,点击框体重试(error:9tFhU6)
    1、起因近期淘宝登录需要右划验证,才能点击登录,但是一直提示"验证失败,点击框体重试"类似错误如下图所示2、发现问题通常有这种问题的,大概率是安装了浏览器广告屏蔽插件经核查,我的浏览器安装的是AdGuard看了一下页面的调试日志,发现有一条用来通信的WebSocket协议被插件屏蔽了......
  • Qt processEvents - 解决线程中事件阻塞(如槽函数被阻塞)
    百度了一会,发现没太有文字讲这件事情,因此整理成文字记录一下。processEvents介绍长时间运行的操作可以调用processEvents()保持应用程序响应能力。voidQCoreApplication::processEvents(QEventLoop::ProcessEventsFlagsflags=QEventLoop::AllEvents)根据指定的条件为调......
  • nginx改变访问应用端口以及解决css,js或表单提交访问不到的问题
    场景如果原先某个网站是通过ip:8080直接访问的,现在想要加个前缀,并且去掉端口进行访问,比如ip/myapp去访问这个项目,可以通过nginx来实现这个过程。最近有个需求需要变更redmine的访问路径,从ip:8080改成ip/redmine,下面以redmine举例子。配置过程以ip/redmine来访问原先ip:8080的项......
  • 解决警告:Feature flag __VUE_PROD_HYDRATION_MISMATCH_DETAILS__
    如果你也发现了上述警告,传送门:https://vuejs.org/api/compile-time-flags#webpack,感谢文章https://stackoverflow.com/questions/77752897/feature-flag-vue-prod-hydration-mismatch-details-is-not-explicitly-defined......