- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
总的来说,我对 python 还很陌生(大约一周的知识),我正在制作一个相当基本的 pygame,并考虑到一个更大的项目。我编写的 pygame 可以正常工作,除了一件我似乎无法弄清楚为什么会发生的事情,那就是当我启动游戏时,角色有时是不可见的。这会随着瓷砖的不同而变化,每次游戏开始时都是不同的瓷砖。现在我终其一生都无法弄清楚为什么会这样,我希望这里有人能看到我看不到的东西。
提前致谢,这里有一些图片。
我的主要内容:
import pygame as pg
import sys
from os import path
from settings import *
from sprites import *
from tilemap import *
class Game:
def __init__(self):
pg.init()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption(TITLE)
self.clock = pg.time.Clock()
pg.key.set_repeat(500, 100)
self.load_data()
def load_data(self):
game_folder = path.dirname(__file__)
img_folder = path.join(game_folder, 'img')
self.map = Map(path.join(game_folder, 'map.txt'))
self.player_img = pg.image.load(path.join(img_folder, PLAYER)).convert_alpha()
self.floor_img = pg.image.load(path.join(img_folder, FLOOR)).convert()
self.wall_img = pg.image.load(path.join(img_folder, WALL)).convert()
self.water_img = pg.image.load(path.join(img_folder, WATER)).convert()
self.goal_img = pg.image.load(path.join(img_folder, GOAL)).convert()
def new(self):
# initialize all variables and do all the setup for a new game
self.all_sprites = pg.sprite.Group()
self.walls = pg.sprite.Group()
self.floors = pg.sprite.Group()
self.water = pg.sprite.Group()
self.goal = pg.sprite.Group()
for row, tiles in enumerate(self.map.data):
for col, tile in enumerate(tiles):
if tile == 'X':
Wall(self, col, row)
if tile == 'W':
Water(self, col, row)
if tile == '.':
Floor(self, col, row)
if tile == 'G':
Goal(self, col, row)
if tile == 'P':
self.player = Player(self, col, row)
Floor(self, col, row)
self.camera = Camera(self.map.width, self.map.height)
def run(self):
# game loop - set self.playing = False to end the game
self.playing = True
while self.playing:
self.dt = self.clock.tick(FPS) / 1000
self.events()
self.draw()
self.update()
def quit(self):
pg.quit()
sys.exit()
def update(self):
# update portion of the game loop
self.all_sprites.update()
self.camera.update(self.player)
def draw(self):
for sprite in self.all_sprites:
self.screen.blit(sprite.image, self.camera.apply(sprite))
pg.display.flip()
def events(self):
# catch all events here
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
self.quit()
if event.key == pg.K_LEFT:
self.player.move(dx=-1)
if event.key == pg.K_RIGHT:
self.player.move(dx=1)
if event.key == pg.K_UP:
self.player.move(dy=-1)
if event.key == pg.K_DOWN:
self.player.move(dy=1)
# create the game object
g = Game()
while True:
g.new()
g.run()
我的设置:
DARKGREY = (40, 40, 40)
# game settings
WIDTH = 1280 # 16 * 64 or 32 * 32 or 64 * 16
HEIGHT = 720 # 16 * 48 or 32 * 24 or 64 * 12
FPS = 60
TITLE = "Code Avontuur"
BGCOLOR = DARKGREY
TILESIZE = 100
GRIDWIDTH = WIDTH / TILESIZE
GRIDHEIGHT = HEIGHT / TILESIZE
PLAYER = 'player.png'
WALL = 'wall.jpg'
FLOOR = 'floor.jpg'
WATER = 'water.jpg'
GOAL = 'goal.jpg'
我的 map :
XXXXXXXXXXXXXXXX
XP.....X.....XWX
XXX.XX.XXX.XXXXX
XXX..X.XX..XXXXX
XXXX...X..XXXXXX
XWWWX.XX.XXWWWWX
XXXXX....XXXXXXX
XXXXXXXX......GX
XXXXXXXXXXXXXXXX
我的 Sprite :
import pygame as pg
from PIL import Image
from settings import *
class Player(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.player_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
def move(self, dx=0, dy=0):
if not self.collide(dx, dy):
self.x += dx
self.y += dy
def collide(self, dx=0, dy=0):
for wall in self.game.walls:
if wall.x == self.x + dx and wall.y == self.y + dy:
return True
for water in self.game.water:
if water.x == self.x +dx and water.y == self.y +dy:
return True
return False
def update(self):
self.rect.x = self.x * TILESIZE
self.rect.y = self.y * TILESIZE
class Wall(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.walls
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.wall_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
class Water(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.water
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.water_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
class Floor(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.floors
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.floor_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
class Goal(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.goal
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.goal_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
我的 map 处理程序:
import pygame as pg
from settings import *
class Map:
def __init__(self, filename):
self.data = []
with open(filename, 'rt') as f:
for line in f:
self.data.append(line.strip())
self.tilewidth = len(self.data[0])
self.tileheight = len(self.data)
self.width = self.tilewidth * TILESIZE
self.height = self.tileheight * TILESIZE
class Camera:
def __init__(self, width, height):
self.camera = pg.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(WIDTH / 2)
y = -target.rect.y + int(HEIGHT / 2)
#Limit scrolling off map
x = min(0, x)
y = min(0, y)
x = max(-(self.width - WIDTH), x)
y = max(-(self.height - HEIGHT), y)
self.camera = pg.Rect(x, y, self.width, self.height)
我希望这里的任何人都能看到我看不到的东西,因为此时我陷入困境并迷失了方向。
最佳答案
您的问题是绘制 Sprite 的顺序。
而不是常规的 Group
,使用 LayeredUpdates
团体。
然后给你的 Sprite 一个_layer
属性(*)。通过这种方式,您可以控制 Sprite 在屏幕上的绘制顺序。
Here's一个例子。
Game
类的更改:
...
def new(self):
# initialize all variables and do all the setup for a new game
self.all_sprites = pg.sprite.LayeredUpdates() # <<--- change here
self.walls = pg.sprite.Group()
self.floors = pg.sprite.Group()
self.water = pg.sprite.Group()
self.goal = pg.sprite.Group()
...
Player
类的更改:
class Player(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = game.player_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self._layer = 1 # <<--- add this line
编辑:
因为您实际上并没有使用 Group 进行绘图,所以您可以将其保留为简单的 Group
并且只需更改您的绘图函数以按层对 Sprite 进行排序:
for sprite in sorted(self.all_sprites, lambda i, s: s._layer):
...
或者对于 Python 3:
for sprite in sorted(self.all_sprites, key=lambda s: s._layer):
...
* 文档说的是layer
,其实是_layer
关于python - 为什么我在 pygame 中的玩家角色有时会消失在瓷砖后面,但仍然会移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46174038/
这个问题在这里已经有了答案: What does the question mark character ('?') mean in C++? (8 个答案) 关闭 7 年前。 这一行我看不懂为什么
在构建模式下甚至可以有两个玩家吗?查看 Roblox 开发者杂志文章“What did you sleigh?”,它在玩家列表中显示了两个“玩家”。 最佳答案 打开 Roblox Studio 转到任
在构建模式下甚至可以有两个玩家吗?查看 Roblox 开发者杂志文章“What did you sleigh?”,它在玩家列表中显示了两个“玩家”。 最佳答案 打开 Roblox Studio 转到任
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
“Clash of Clans”使用 Game Center 对玩家进行身份验证并将其与现有的远程存储游戏状态相关联。 据我所知,游戏仅在客户端提供玩家标识符。是否有支持的技术来安全地验证用户而不是仅
我正在开发多人游戏,但我无法找出如何将其他客户端连接到创建的游戏。我的意思是客户端 A 创建到服务器的套接字连接,其他客户端(A,B ...)如何连接到客户端 A?有人可以帮我吗? 附注我是网络编程新
我正在尝试使用浏览器控制台一步一步地制作井字游戏,并最终改进我的功能。然而,我被困在玩家2回合(ttt_player2_turn()),我必须检查箱子是否为空。看来我在这个例子中的论证有问题。感谢您的
如果我向上移动玩家 1 和玩家 2,假设我按下玩家 1 的向下键,我的玩家将停止向上移动。我找不到问题所在。有人可以帮助我并解释我做错了什么吗? package game; import java.a
我正在创建一个自上而下的 2D 游戏,并且使用 Box2D 来模拟物理,我的问题是: 如何使玩家保持与我的宇宙飞船的相对速度,并且仍然能够在飞船也在移动的情况下围绕我的玩家移动? 我在下面放了一个插图
我是 Java 新手,我正在尝试制作一个简单的游戏来娱乐。我首先尝试将 repaint 放入 PaintComponent() 中,它一直有效,直到我尝试添加一些背景。有谁知道如何让我的玩家在有或没有
//我正在尝试对玩家 2 的代码进行一些编辑,因此我删除了涉及玩家 1 的所有内容。但出于某种原因,如果没有玩家 1 的代码,玩家 2 根本不会执行任何操作。(假设使用 i、j、k 和 l 键 mov
我接到了一项任务,要编写一个由人类玩家和 AI 玩家组成的 NIM 游戏。游戏是“Misere”(最后一个必须拿起一根棍子的人输了)。 AI 应该使用 Minimax 算法,但它正在采取使其输得更快的
我是一名优秀的程序员,十分优秀!