- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我试图创建一个在 pygame 中跟随玩家的移动摄像机,我读了一些指南,还有堆栈溢出上流行的指南(供引用: this one ),但仍然无法使其工作。
基本上我的问题是游戏只是“卡住”,我无法移动玩家并且重力不起作用,尽管我仍然可以按键盘上的按钮并退出游戏,也尝试在某些行中打印一些内容,并且程序肯定不会卡住。
这是我的代码:
import pygame
pygame.init()
# global constants
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 640
RESOLUTION = (SCREEN_WIDTH, SCREEN_HEIGHT)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
# get sprite class attributes
super(Player, self).__init__()
# create the player image and hit box
self.image = pygame.Surface([32, 32])
self.image.fill(BLACK)
self.rect = self.image.get_rect()
# the player pos
self.rect.x = x
self.rect.y = y
self.facing = "left"
# player movement vectors
self.change_x = 0
self.change_y = 0
self.walls = None
# current level the player is in
self.level = None
# change the movement vectors
def change_speed(self, x, y):
self.change_x += x
self.change_y += y
def update(self):
# move the player
# calc the gravity effect
self.calc_gravity()
# move left/right
self.rect.x += self.change_x
# see if we hit anything
block_hit_list = pygame.sprite.spritecollide(self, self.level.block_list, False)
for block in block_hit_list:
# if we are moving right,
# set our right side to the left side of the item we hit
if self.change_x > 0:
self.rect.right = block.rect.left
elif self.change_x < 0:
# otherwise if we are moving left, do the opposite
self.rect.left = block.rect.right
# move up/down
self.rect.y += self.change_y
# check and see if we hit anything
block_hit_list = pygame.sprite.spritecollide(self, self.level.block_list, False)
for block in block_hit_list:
# reset our position based on the top/bottom of the object
if self.change_y > 0:
self.rect.bottom = block.rect.top
elif self.change_y < 0:
self.rect.top = block.rect.bottom
# stop our vertical movement
self.change_y = 0
def calc_gravity(self):
# calculate effect of gravity
if self.change_y == 0:
self.change_y = 1
else:
# maximum downward velocity
if self.change_y < 10:
# gravity
self.change_y += 0.45
else:
pass
# the player's jump
def jump(self):
# move down a bit and see if there is a platform below us
# move down 2 pixels because it doesn't work well if we only move down
# 1 when working with a platform moving down
self.rect.y += 2
block_hit_list = pygame.sprite.spritecollide(self, self.level.block_list, False)
self.rect.y -= 2
# If it is ok to jump, set our speed upwards
if len(block_hit_list) > 0 or self.rect.bottom >= SCREEN_HEIGHT:
self.change_y = -7
# player-controlled movement
def go_left(self):
self.change_x = -5
self.facing = "left"
def go_right(self):
self.change_x = 5
self.facing = "right"
def stop(self):
self.change_x = 0
# blocks the player can stand on or to limit his movement in the map
class Blocks(pygame.sprite.Sprite):
# create the block
def __init__(self, width, height):
super(Blocks, self).__init__()
self.image = pygame.Surface([width, height])
self.image.fill(BLUE)
self.rect = self.image.get_rect()
# super class for levels, each level will be a sub class of Level and have a different layout
class Level(object):
def __init__(self, player):
self.block_list = pygame.sprite.Group()
self.player = player
# updates the level
def update(self):
self.block_list.update()
# draw all the level objects
def draw(self, screen):
# the background
screen.fill(WHITE)
self.block_list.draw(screen)
# level one sub class
class LevelOne(Level):
def __init__(self, player):
super(LevelOne, self).__init__(player)
self.level_width = 2500
self.level_height = 1400
# level one blocks
blocks_loc = [[0, 0, 10, 800], [10, 790, 2500, 10], [2500, 0, 10, 800]]
for x in blocks_loc:
block = Blocks(x[2], x[3])
block.rect.x = x[0]
block.rect.y = x[1]
self.block_list.add(block)
# camera class that follows the player around the screen
class Camera(object):
def __init__(self, width, height):
self.camera = pygame.Rect(0, 0, width, height)
self.width = width
self.height = height
def apply(self, entity):
return entity.rect.move(self.camera.topleft)
def update(self, target):
x = -target.rect.x + int(SCREEN_WIDTH/2)
y = -target.rect.y + int(SCREEN_HEIGHT/2)
self.camera = pygame.Rect(x, y, self.width, self.height)
# create the game screen
screen = pygame.display.set_mode(RESOLUTION)
# window title
pygame.display.set_caption("test")
# create the player object
player = Player(600, 50)
# create the levels
levels_list = []
levels_list.append(LevelOne(player))
active_sprite_list = pygame.sprite.Group()
current_level_num = 0
current_level = levels_list[current_level_num]
player.level = current_level
active_sprite_list.add(player)
camera = Camera(current_level.level_width, current_level.level_height)
# the clock will be used for the frame rate of the game
clock = pygame.time.Clock()
# flag to know when the game is done
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.go_left()
if event.key == pygame.K_RIGHT:
player.go_right()
if event.key == pygame.K_UP:
player.jump()
if event.key == pygame.K_ESCAPE:
done = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT and player.change_x < 0:
player.stop()
if event.key == pygame.K_RIGHT and player.change_x > 0:
player.stop()
# update part
current_level.update()
active_sprite_list.update()
camera.update(player)
# draw part
current_level.draw(screen)
for sprite in active_sprite_list:
screen.blit(sprite.image, camera.apply(sprite))
# refresh part
pygame.display.flip()
clock.tick(60)
pygame.quit()
最佳答案
您还必须将摄像机偏移应用于关卡中的 block Sprite 。一个简单的解决方案是将相机传递给关卡实例的 draw
方法:
def draw(self, screen, camera):
screen.fill(WHITE)
for block in current_level.block_list:
screen.blit(block.image, camera.apply(block))
您还可以将关卡中的 block 添加到active_sprite_list
中。
关于python - pygame中相机不移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48596758/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!