如何在pygame中让相机跟随自上而下的汽车

2023-12-04

一般来说,对 pygame 和游戏编程不熟悉,只是想知道如何让相机在自上而下的汽车游戏中跟随汽车(没什么花哨的) - 想想微型机器!我正在使用 Python 3.6,并且有一辆可以旋转和移动的自行车。我在这里保留了更短的代码,但如果相机正常工作,我确实有一个静态图像可供参考!

这是我所拥有的:

import pygame, math, sys, random
from pygame.locals import *

display_width = 1280
display_height = 800

# Sets size of screen
screen = pygame.display.set_mode((display_width, display_height))

# Initialises clock
clock = pygame.time.Clock()

# Colours
white = (255,255,255)
black = (0,0,0)

class Entity(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

class VehicleSprite(Entity):
    # Creates a vehicle class
    MAX_FORWARD_SPEED = 10
    MAX_REVERSE_SPEED = 2
    ACCELERATION = 0.05
    TURN_SPEED = 0.000000000001

    def __init__(self, image, position):
        Entity.__init__(self)

        # Creates object instance off
        pygame.sprite.Sprite.__init__(self)
        self.src_image = pygame.image.load(image)
        self.position = position
        self.speed = self.direction = 0
        self.k_left = self.k_right = self.k_down = self.k_up = 0


    def update(self, time):
        # SIMULATION
        self.speed += (self.k_up +self.k_down)
        if self.speed > self.MAX_FORWARD_SPEED:
            self.speed = self.MAX_FORWARD_SPEED
        if self.speed < -self.MAX_REVERSE_SPEED:
            self.speed = -self.MAX_REVERSE_SPEED

        # Degrees sprite is facing (direction)
        self.direction += (self.k_right + self.k_left)
        x, y = self.position
        rad = self.direction * math.pi / 180
        x += -self.speed*math.sin(rad)
        y += -self.speed*math.cos(rad)
        self.position = (x, y)
        self.image = pygame.transform.rotate(self.src_image, self.direction)
        self.rect = self.image.get_rect()
        self.rect.center = self.position

class Background(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)  #call Sprite initializer
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

rect = screen.get_rect()

# Background
BackGround = Background('/home/pi/gametuts/images/backgrounds/bkg_img.png', [0, 0])

# Bike image load
bike = VehicleSprite('/home/pi/gametuts/images/BikePixelBig.png', rect.center)
bike_group = pygame.sprite.RenderPlain(bike)

# Ball image load
ball = VehicleSprite('/home/pi/gametuts/images/ironball.png', rect.center)
ball_group = pygame.sprite.RenderPlain(ball)

# Main game loop
def game_loop():

    while 1:
        #USER INPUT
        # Sets frame rate
        time = clock.tick(60)
        for event in pygame.event.get():
            if not hasattr(event, 'key'): continue
            down = event.type == KEYDOWN

            # Bike Input (Player 1)
            if event.key == K_d: bike.k_right = down * -5
            elif event.key == K_a: bike.k_left = down * 5
            elif event.key == K_w: bike.k_up = down * 2
            elif event.key == K_s: bike.k_down = down * -2      

            # Quit
            elif event.key == K_ESCAPE: sys.exit(0)

        #RENDERING

        # Game background
        screen.fill(white)
        screen.blit(BackGround.image, BackGround.rect)

        # Bike render
        bike_group.update(time)
        bike_group.draw(screen)

        ball_group.update(time)
        ball_group.draw(screen)

        pygame.display.flip()


game_loop()
pygame.quit()
quit()

提前致谢!


实现相机的最简单方法是使用pygame.math.Vector2作为相机,每帧减去玩家速度,并将其添加到位块传送期间所有游戏元素的位置。

import pygame as pg
from pygame.math import Vector2


class Player(pg.sprite.Sprite):

    def __init__(self, pos, walls, *groups):
        super().__init__(*groups)
        self.image = pg.Surface((30, 50))
        self.image.fill(pg.Color('dodgerblue'))
        self.rect = self.image.get_rect(center=pos)
        self.vel = Vector2(0, 0)
        self.pos = Vector2(pos)
        self.walls = walls
        self.camera = Vector2(0, 0)

    def update(self):
        self.camera -= self.vel  # Change the camera pos if we're moving.
        # Horizontal movement.
        self.pos.x += self.vel.x
        self.rect.centerx = self.pos.x
        # Change the rect and self.pos coords if we touched a wall.
        for wall in pg.sprite.spritecollide(self, self.walls, False):
            if self.vel.x > 0:
                self.rect.right = wall.rect.left
            elif self.vel.x < 0:
                self.rect.left = wall.rect.right
            self.pos.x = self.rect.centerx
            self.camera.x += self.vel.x  # Also move the camera back.

        # Vertical movement.
        self.pos.y += self.vel.y
        self.rect.centery = self.pos.y
        for wall in pg.sprite.spritecollide(self, self.walls, False):
            if self.vel.y > 0:
                self.rect.bottom = wall.rect.top
            elif self.vel.y < 0:
                self.rect.top = wall.rect.bottom
            self.pos.y = self.rect.centery
            self.camera.y += self.vel.y


class Wall(pg.sprite.Sprite):

    def __init__(self, x, y, w, h, *groups):
        super().__init__(*groups)
        self.image = pg.Surface((w, h))
        self.image.fill(pg.Color('sienna2'))
        self.rect = self.image.get_rect(topleft=(x, y))


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    walls = pg.sprite.Group()
    for rect in ((100, 170, 90, 20), (200, 100, 20, 140),
                 (400, 60, 150, 100), (300, 470, 150, 100)):
        walls.add(Wall(*rect))
    all_sprites.add(walls)
    player = Player((320, 240), walls, all_sprites)

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    player.vel.x = 5
                elif event.key == pg.K_a:
                    player.vel.x = -5
                elif event.key == pg.K_w:
                    player.vel.y = -5
                elif event.key == pg.K_s:
                    player.vel.y = 5
            elif event.type == pg.KEYUP:
                if event.key == pg.K_d and player.vel.x > 0:
                    player.vel.x = 0
                elif event.key == pg.K_a and player.vel.x < 0:
                    player.vel.x = 0
                elif event.key == pg.K_w and player.vel.y < 0:
                    player.vel.y = 0
                elif event.key == pg.K_s and player.vel.y > 0:
                    player.vel.y = 0

        all_sprites.update()

        screen.fill((30, 30, 30))
        for sprite in all_sprites:
            # Add the player's camera offset to the coords of all sprites.
            screen.blit(sprite.image, sprite.rect.topleft+player.camera)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

编辑:这是带有相机的代码示例。我还尝试改进其他一些事情,例如max(min(...))限制速度值的技巧。我不确定这个动作是否如你所愿,但你当然可以自己调整。 (我可能会对update方法。)

import math
import random

import pygame


pygame.init()
screen = pygame.display.set_mode((1280, 800))
rect = screen.get_rect()
clock = pygame.time.Clock()

WHITE = pygame.Color('white')
# Load images globally and reuse them in your program.
# Also use the `.convert()` or `.convert_alpha()` methods after
# loading the images to improve the performance.
VEHICLE1 = pygame.Surface((40, 70), pygame.SRCALPHA)
VEHICLE1.fill((130, 180, 20))
VEHICLE2 = pygame.Surface((40, 70), pygame.SRCALPHA)
VEHICLE2.fill((200, 120, 20))
BACKGROUND = pygame.Surface((1280, 800))
BACKGROUND.fill((30, 30, 30))


class Entity(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)


class VehicleSprite(Entity):
    MAX_FORWARD_SPEED = 10
    MAX_REVERSE_SPEED = 2
    ACCELERATION = 0.05
    TURN_SPEED = 0.000000000001

    def __init__(self, image, position):
        Entity.__init__(self)
        self.src_image = image
        self.image = image
        self.rect = self.image.get_rect(center=position)
        self.position = pygame.math.Vector2(position)
        self.velocity = pygame.math.Vector2(0, 0)
        self.speed = self.direction = 0
        self.k_left = self.k_right = self.k_down = self.k_up = 0

    def update(self, time):
        # SIMULATION
        self.speed += self.k_up + self.k_down
        # To clamp the speed.
        self.speed = max(-self.MAX_REVERSE_SPEED,
                         min(self.speed, self.MAX_FORWARD_SPEED))

        # Degrees sprite is facing (direction)
        self.direction += (self.k_right + self.k_left)
        rad = math.radians(self.direction)
        self.velocity.x = -self.speed*math.sin(rad)
        self.velocity.y = -self.speed*math.cos(rad)
        self.position += self.velocity
        self.image = pygame.transform.rotate(self.src_image, self.direction)
        self.rect = self.image.get_rect(center=self.position)


class Background(pygame.sprite.Sprite):

    def __init__(self, image, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(topleft=location)


def game_loop():
    background = Background(BACKGROUND, [0, 0])
    bike = VehicleSprite(VEHICLE1, rect.center)
    ball = VehicleSprite(VEHICLE2, rect.center)

    bike_group = pygame.sprite.Group(bike)
    ball_group = pygame.sprite.Group(ball)
    all_sprites = pygame.sprite.Group(bike_group, ball_group)

    camera = pygame.math.Vector2(0, 0)
    done = False

    while not done:
        time = clock.tick(60)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.KEYDOWN:
                # Bike Input (Player 1)
                if event.key == pygame.K_d:
                    bike.k_right = -5
                elif event.key == pygame.K_a:
                    bike.k_left = 5
                elif event.key == pygame.K_w:
                    bike.k_up = 2
                elif event.key == pygame.K_s:
                    bike.k_down = -2

                elif event.key == pygame.K_ESCAPE:
                    done = True
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_d:
                    bike.k_right = 0
                elif event.key == pygame.K_a:
                    bike.k_left = 0
                elif event.key == pygame.K_w:
                    bike.k_up = 0
                elif event.key == pygame.K_s:
                    bike.k_down = 0

        camera -= bike.velocity

        all_sprites.update(time)

        screen.fill(WHITE)
        screen.blit(background.image, background.rect)

        for sprite in all_sprites:
            screen.blit(sprite.image, sprite.rect.topleft+camera)

        pygame.display.flip()


game_loop()
pygame.quit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在pygame中让相机跟随自上而下的汽车 的相关文章

  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • 如何在单独的文件中使用 FastAPI Depends 作为端点/路由?

    我在单独的文件中定义了一个 Websocket 端点 例如 from starlette endpoints import WebSocketEndpoint from connection service import Connectio
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb

随机推荐

  • 右栏按钮项目不显示

    我有以下用于放置 rightbarbuttonitem 的代码 UIButton rightbutton UIButton buttonWithType UIButtonTypeCustom rightbutton setBackgroun
  • 某些 JSON 文件出现 PowerShell FilterScript 错误

    感谢 iRon 本周早些时候提供的帮助question 他对我目前正在进行的一项工作提供了巨大帮助 总之 我们有一个 Azure CICD 管道来部署策略 我们有一个包含 200 多个 JSON 策略文件的文件夹 CICD 流程将它们全部放
  • 使用 to_html 将 CSS 类应用到 Pandas DataFrame

    我在使用 Pandas to html 方法应用 classes 参数来设置 DataFrame 样式时遇到问题 类 str或列表或元组 默认无 应用于生成的 html 表的 CSS 类 从 https pandas pydata org
  • 递归 mod_rewrite 用于搜索引擎友好的 url

    我一直在读以前的解决方案递归 mod rewrite 问题与我想要做的类似 不同之处在于我通过 index php 文件发送所有查询 因此不需要在查询中指定脚本 本质上我想递归地转换搜索引擎友好的 URL 中的任意数量的参数 example
  • 文本框中的永久前缀

    我试图在文本框中输入永久前缀 就我而言 我想要有以下前缀 DOMAIN 这样用户只需在域前缀后输入用户名即可 这不是我必须做或追求的事情 但我的问题更多是出于好奇 我试图想出一些逻辑来做到这一点TextChangedEvent但是 这意味着
  • AngularJS 应用程序的 AssertionUrl

    我的申请流程是这样的 用户输入 Url 然后显示 AngularJS 登录页面 用户单击 使用 SAML 登录 并调用返回 SAML 登录 URL 的 Web API 端点 AngularJS UI 接收 SAML 登录 URL 并将用户重
  • Spark.csv如何确定读取的分区数?

    在 Spark 2 2 0 中 我正在使用以下命令读取一个文件 spark csv read filepath load rdd getNumPartitions 我在一个系统中为 350 MB 文件分配了 77 个分区 在另一个系统中分配
  • TensorFlow Keras 无法处理大于 GPU 内存的 numpy 数组

    我正在尝试处理重量超过 25GB 的样本矩阵 问题是我的 GPU 只有 12GB 内存 我认为 tenorflow 会将小批量的矩阵从 ram 转移到 gRam 如下所述 https stackoverflow com a 53938359
  • 样式未应用于 CSS 中的 H1 元素

    我面临一个奇怪的问题 该样式没有应用于H1元素 Code p h1 color red p p h1 This is a header h1 You can t有一个标题 H1 to H6 作为一个孩子p 这是无效的 HTML 它不起作用
  • SyntaxError:无法在 JEST LWC 中的模块外部使用 import 语句

    我正在尝试使用 Visual Studio Code 作为 IDE 来测试我的第一个 Lightning Web 组件 按照指示 我安装了 Node js npm 和 jest 依赖项 但我收到这个错误 错误图像 当尝试运行下面的代码时 d
  • 是否可以编辑 UIAlertAction 标题字体大小和样式?

    现在iOS8已经弃用了UIActionsheet and UIAlertviewiOS7 上的自定义不再生效 到目前为止 我知道的唯一定制是色调颜色 我需要的是改变标题的字体大小和样式 但我还没有找到任何方法可以用新的UIAlertActi
  • SQL AND 运算符无法正常工作

    我有以下两张表 地块表 Blockid ParcelNo storPri 52000105 3 State 52000105 4 Private 52000105 5 State 行动表 Blockid ParcelNo ActionTak
  • Pandas 中的可变位移

    数据框中有两列 A 和 B A B 0 1 6 1 2 7 2 1 8 3 2 9 4 1 10 我想创建一个列 C C 必须将 B 的值移动 A 的值 A B C 0 1 6 NaN 1 2 7 NaN 2 1 8 7 3 2 9 7 4
  • ImageMagick 比较:忽略 PSNR 结果中的白色匹配

    我在用着compare区分两个相似的colorPNG 文件 他们得到一个PSNR值 27 图像包含许多白色区域 两个图像之间始终匹配 如果我错了 请纠正我 但这些白色区域正在增加 PSNR 值 使图像作为平均值更加相似 因此我不想考虑白色像
  • 如何以编程方式在所需文件夹中创建 SQL Server 2008 数据库完整备份

    如何使用 Microsoft Visual Studio 2010 c 以编程方式在所需文件夹中创建 SQL Server 2008 数据库完整备份 只需执行 SQL Servercommand BACKUP DATABASE databa
  • C11 中的内存顺序消耗使用情况

    我读到了关于带有依赖性关系和依赖顺序先于在其定义中使用 15 1 2 4 p16 评价A在评估之前是依存顺序的B if A对原子对象执行释放操作M 并且 在另一个 线 B执行消费操作M并读取写入的值 由释放序列中的任何副作用引起A or 一
  • Apache Lucene 大型 XML 文件索引

    我是 lucene 新手 我想用 lucene 索引包含纯文本 属性和许多 xml 标签的大型 xml 文件 15GB 如何使用 lucene 和任何示例解析此 xml 文件并为其建立索引 如果我们使用 lucene 我们需要任何数据库 如
  • Inno Setup:调整卸载进度表及其所有组件的大小

    嘿 我需要增加宽度和高度UninstallProgressForm我的 Inno Setup 卸载程序 当我根据我的自定义设计的安装程序向导页面宽度和高度手动更改其宽度和高度时 卸载进度表显得很奇怪 唯一改变的是它的宽度和高度 所有其他组件
  • 使用 Attach 时 R 中的命名冲突

    我感觉好像在 R 中经常出现奇怪的命名冲突 附加数据帧和其他对象之间 附加 分离不能按预期工作 只是附加了同一数据帧的两个副本 甚至不确定它们是否相同 和整个软类型语言特定问题 一小时前工作的代码突然产生新的错误等 是否有处理此类事情的最佳
  • 如何在pygame中让相机跟随自上而下的汽车

    一般来说 对 pygame 和游戏编程不熟悉 只是想知道如何让相机在自上而下的汽车游戏中跟随汽车 没什么花哨的 想想微型机器 我正在使用 Python 3 6 并且有一辆可以旋转和移动的自行车 我在这里保留了更短的代码 但如果相机正常工作