- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 2 个单独的列表变成一张图 block map 。
我使用两种不同的方法来创建图 block ,使用字符来表示图 block 。我可以让这两种方法单独工作,但想组合或使用它们?
我希望知道如何将两个列表中的两个结果结合起来,
#map of the colors or textured tiles
level1tile = ["------",
"-$$---",
"-$^^$-",
"------"
]
#level1tile is a simple mapping: char -> colour
colors = {'X': pygame.color.THECOLORS['blue'],
'-': pygame.color.THECOLORS['grey'],
'^': pygame.color.THECOLORS['brown'] ]
}
#map of the walls and level exits
level1wall = ["WWWWWW",
"W E",
"W WW W",
"WWWWWW"
]
#level1wall is collision detection W = wall, E = exit, P = Player
我将添加不可见的项目,因此我想保留两个单独的 map ,以便某些标题可以具有与墙相同的纹理,也可以不具有相同的纹理。
一些可能用途的示例:1.你可以穿过一些水砖,但不能穿过其他水砖2.流沙、隐形元素或陷阱
所以在第一张 map 中代表X蓝色的水 block
colors = {'X': pygame.color.THECOLORS['blue']}
在第二个中,我代表水,W代表墙碰撞检测。
我通过使用W作为墙来封锁区域以进行碰撞检测,在此示例中,蓝色或水和灰色或岩砖是玩家无法行走的区域。
我通过使用W作为墙壁来封锁区域以进行碰撞检测,在此示例中,蓝色或水和灰色或岩砖是玩家无法行走的区域。但我想保留两张 map ,以防我想添加不可见的区域或者一些可以行走的水等。
level = ["WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW",
"W WWWWWWWWW WW EW",
"W WWWWWWW W",
"W WW WWW W",
"W WW WWWWW W",
"W WWWWWWW W",
"W WWWWWW W",
"W WWWWWWW W",
"W WWWWWW W",
"W WW W",
"W W",
"W W W",
"W WWW W",
"W WWWWW W",
"W WWWWW W",
"W WWWWW W",
"W WWWWWW W",
"W WWW W",
"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"]
# W = wall, E = exit, P = Player
x = y = 0
for row in level:
for col in row:
if col == "W":
Wall((x, y))
if col == "E":
end_rect = pygame.Rect(x, y, 32, 32)
x += 32
y += 32
x = 0
我正在使用我从阅读成员(member) Sloth 帖子中学到的技术来创建颜色或纹理图 block map 。
levelB = ["------------------------------------",
"- $$$$$$$$$--------- -- $ $ $ $E-",
"- $ $$$$$$$$-------^^^^ $$-",
"-$ $$$$$$$$ -- ^^^^ XXX $-",
"- $$$$$$$ -- $ ^^^^ XXXXX -",
"- $$$$$$$ ^^^^ XXXXXXX -",
"- $$$$$$$$$$ ^^^^ XXXXXX -",
"- $$$$$$$$ ^^^^ XXXXXXX -",
"-$$$$$$$$$$$$$$ ^^^^ XXXXXX -",
"- $$$$$$$ ^^^^ XX -",
"- $ $$$ ^^^^ $ $ $ $ -",
"- $$$$$$ ^^^^- $$$$$$$$-",
"- $$$$$$ ^^^^--- $$$$$ $ $ -",
"- $$$$$ ^^^^----- $$$$$$$-",
"- $$$$$$$ ^^^^----- $ $ $ $ -",
"- $$$$$$$ ^^^^----- $$$$$$ $$-",
"- $$$$$$ ^^^^ ------ $ $ $ $ -",
"- $$$$$$$$ ^^^^ --- $$-",
"------------------------------------"]
#a simple mapping: char -> colour
colors = {'X': pygame.color.THECOLORS['blue'],
'-': pygame.color.THECOLORS['grey'],
'$': pygame.color.THECOLORS['green'],
'^': pygame.color.THECOLORS['brown'],
'E': pygame.color.THECOLORS['black']
}
blocksize = 32
我将用纹理贴图交换颜色
########################################
下面是我按照所提供的答案进行的尝试,但我只完成了一半的检查。
完整来源
import os
import random
import pygame
#map of the colors or textured tiles
level1tile = ["------------------------------------",
"- $$$$$$$$$--------- -- $ $ $ $E-",
"- $ $$$$$$$$-------^^^^ $$-",
"-$ $$$$$$$$ -- ^^^^ XXX $-",
"- $$$$$$$ -- $ ^^^^ XXXXX -",
"- $$$$$$$ ^^^^ XXXXXXX -",
"- $$$$$$$$$$ ^^^^ XXXXXX -",
"- $$$$$$$$ ^^^^ XXXXXXX -",
"-$$$$$$$$$$$$$$ ^^^^ XXXXXX -",
"- $$$$$$$ ^^^^ XX -",
"- $ $$$ ^^^^ $ $ $ $ -",
"- $$$$$$ ^^^^- $$$$$$$$-",
"- $$$$$$ ^^^^--- $$$$$ $ $ -",
"- $$$$$ ^^^^----- $$$$$$$-",
"- $$$$$$$ ^^^^----- $ $ $ $ -",
"- $$$$$$$ ^^^^----- $$$$$$ $$-",
"- $$$$$$ ^^^^ ------ $ $ $ $ -",
"- $$$$$$$$ ^^^^ --- $$-",
"------------------------------------"]
#a simple mapping: char -> color
colors = {'X': pygame.color.THECOLORS['blue'],
'-': pygame.color.THECOLORS['grey'],
'$': pygame.color.THECOLORS['green'],
'^': pygame.color.THECOLORS['brown'],
'E': pygame.color.THECOLORS['black']
}
blocksize = 32
#map of the walls and level exits
level1wall = ["WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW",
"W WWWWWWWWW WW EW",
"W WWWWWWW W",
"W WW WWW W",
"W WW WWWWW W",
"W WWWWWWW W",
"W WWWWWW W",
"W WWWWWWW W",
"W WWWWWW W",
"W WW W",
"W W",
"W W W",
"W WWW W",
"W WWWWW W",
"W WWWWW W",
"W WWWWW W",
"W WWWWWW W",
"W WWW W",
"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"]
# Class for the Player object
class Player(object):
def __init__(self):
self.rect = pygame.Rect(32, 32, 16, 16)
def move(self, dx, dy):
# Move each axis separately. Note that this checks for collisions both times.
if dx != 0:
self.move_single_axis(dx, 0)
if dy != 0:
self.move_single_axis(0, dy)
def move_single_axis(self, dx, dy):
# Move the rect
self.rect.x += dx
self.rect.y += dy
# If you collide with a wall, move out based on velocity
for wall in walls:
if self.rect.colliderect(wall.rect):
if dx > 0: # collide right
self.rect.right = wall.rect.left
if dx < 0: # collide left
self.rect.left = wall.rect.right
if dy > 0: # collide top
self.rect.bottom = wall.rect.top
if dy < 0: # collide bottom
self.rect.top = wall.rect.bottom
# Nice class to hold a wall rect
class Wall(object):
def __init__(self, pos):
walls.append(self)
self.rect = pygame.Rect(pos[0], pos[1], 32, 32)
#level1wall is collision detection W = wall, E = exit, P = Player
#Block
class Block(pygame.sprite.Sprite):
# Constructor. Pass in the color of the block, and its x and y position
def __init__(self, color, width, height, x, y):
# Call the parent class (Sprite) constructor
pygame.sprite.Sprite.__init__(self)
# Create an image of the block, and fill it with a color.
# This could also be an image loaded from the disk.
self.image = pygame.Surface([width, height])
self.image.fill(color)
# Fetch the rectangle object that has the dimensions of the image
# Update the position of this object by setting the values of rect.x and rect.y
self.rect = self.image.get_rect(top=y, left=x)
pygame.init()
# Set up the display
pygame.display.set_caption("Tiles and Walls!")
screen = pygame.display.set_mode((len(level[0])* blocksize, len(level*blocksize)))
#screen = pygame.display.set_mode((1150, 600))
clock = pygame.time.Clock()
walls = [] # List to hold the walls
player = Player() # Create the player
combined_list = [] # initialize a blank list
for i in range(len(level1tile)): # build your new list
combined_list.append(zip(level1tile[i], level1wall[i]))
# Parse the level string above. W = wall, E = exit
x = y = 0
for row in level1wall:
for col in row:
if col == "W":
Wall((x, y))
if col == "E":
end_rect = pygame.Rect(x, y, 32, 32)
x += 32
y += 32
x = 0
running = True
while running:
clock.tick(60)
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
running = False
# Move the player if an arrow key is pressed
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
player.move(-2, 0)
if key[pygame.K_RIGHT]:
player.move(2, 0)
if key[pygame.K_UP]:
player.move(0, -2)
if key[pygame.K_DOWN]:
player.move(0, 2)
# Just added this to make it slightly fun ;)
if player.rect.colliderect(end_rect):
raise SystemExit("Next Level!")
# Draw the scene
screen.fill((0, 0, 0))
for wall in walls:
pygame.draw.rect(screen, (255, 255, 255), wall.rect)
pygame.draw.rect(screen, (255, 0, 0), end_rect)
pygame.draw.rect(screen, (255, 200, 0), player.rect)
pygame.display.flip()
最佳答案
我可能建议使用 zip()
Python 中的函数。基本上它需要两个(或更多)列表作为参数并返回一个列表,其中每个元素都是该位置原始两个列表的值的元组。例如,您可以创建一个新列表,其中在 map 中的每个位置都有一个元组 (tile, wall)
:
combined_list = [] # initialize a blank list
for i in range(len(level1tile)): # build your new list
combined_list.append(zip(level1tile[i], level1wall[i]))
使用问题中的第一个示例返回:
combined_list =
[[('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W')],
[('-', 'W'), ('$', ' '), ('$', ' '), ('-', ' '), ('-', ' '), ('-', 'E')],
[('-', 'W'), ('$', ' '), ('^', 'W'), ('^', 'W'), ('$', ' '), ('-', 'W')],
[('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W'), ('-', 'W')]]
然后,您可以获取 map 中任何给定位置的图 block 和墙壁状态,(x, y)
,类似于:
(tile, wall) = combined_list[x][y]
然后您可以分别访问tile
和wall
:
>> (tile, wall) = combined_list[1][0]
>> tile
'-'
>> wall
'W'
这符合您正在寻找的内容吗?
可能有一种非常聪明的方法将这两个字符串列表与列表理解结合起来,但我无法完全让它为我工作。
有一个聪明的方法可以使用itertools
来做到这一点。 !嗯,有点像。我无法完全保留您的 2D 布局,而是设法将所有 (tile, wall)
元组放入单个 1 x n*m
长度列表中(如与 n x m
2D 列表相反):
import itertools as it
combined = list(it.izip(it.chain.from_iterable(level1tile), it.chain.from_iterable(level2tile)))
现在您可以通过以下方式访问位置(x, y)
处的(tile, wall)
值:
(tile, wall) = combined[x + y*n] # where "n" is how many columns you have in your map
可能仍然有一种更优雅的方式来使用itertools
(或不使用)来做到这一点,但希望这会有所帮助。
关于python - 在 Pygame 中组合纹理图 block 、墙壁和导出的单独关卡贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31505548/
我想填充 3D 等高线图 (contour3(X,Y,Z)),就像 2D 等高线填充图 (contourf(X,Y,Z))。但我无法弄清楚如何实现这一目标。 contour3 和 surf 的组合不是
我有一个 c3.js 折线图,表示 2 个值的演变。我需要折线图的工具提示是饼图(工具提示 = 另一个 c3.js 图形)。 这是我成功的: http://jsfiddle.net/owhxgaqm/
我有具有结构的 Pandas 数据框: A B 0 1 1 1 2 1 2 3 4 3 3 7 4 6 8 如何生成 Seaborn Violin 图,每列作为其自己的单独
我正在使用 D3DXSPRITE 方法将我的 map 图 block 绘制到屏幕上,我刚刚添加了一个缩放功能,当您按住向上箭头时会放大,但注意到您现在可以看到图 block 之间的间隙,这是一些屏幕截
今天我们开始学习目前学习到的最难最复杂的数据结构图。 简单回顾一下之前学习的数据结构,数组、单链表、队列等线性表中数据元素是一对一关系,而树结构中数据元素是一对多关系,而图结构中数据元素则是多对
1、系统环境如下图: 2、为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别;如下图,/dev/sdc 是新添加的硬盘; 3、fdisk /dev/sdc为新硬盘创建分区:
1、nagios简介 nagios是一款开源的电脑系统和网络监视工具,能有效监控windows、linux和unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发
越来越多人开始习惯用手机上网,浏览网页、查看邮件···移动化已经成为互联网发展必然趋势,包括facebook在内的很多互联网公司都将移动广告作为下一个淘金地
1.图片处理 1.圆角图片 复制代码 代码如下: /** * 转换成圆角 * &n
Microsoft SQL Server Management Studio是SQL SERVER的客户端工具,相信大家都知道。我不知道大伙使用导入数据的情况怎么样,反正我最近是遇到过。主要是因为没
debian6系统: 首先先安装mysql吧: 打开终端(root)用户登入 apt-get purge mysql-server-5.5 安装完成后: 默认情况下Mysql只允许本地登录
fedora16英文环境下支持中文输入法的方法 fedora16英文环境下支持FCITX的中文输入法: $ im-chooser 就会出现选择界面,选择第二个就行了。
Net预编译命令 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -? 显示说明 我们需要选择的命令为&n
有的时候电脑出现一些故障有的时候通过将其修改bios设置的方法来解决故障,那么在bios上设置能不能将电脑恢复出厂设置呢?其实也是可以的。方法也很简单的,只要会进入电脑的bios懂的上面英文的意思就
笔者曾介绍过Deepin 将对龙芯进行全面支持,打造最优美龙芯电脑桌面。现在Deepin团队移植工作取得了突破性的成果,Deepin桌面已经在龙芯3A和龙芯3B电脑上成功运行起来了。 以下为龙芯3
在安装一些软件之后,我们的电脑总是会发生一点小变化,不是桌面上多了几个网址图标,就是IE浏览器的默认主页被篡改成乱七八糟的网址。最可气的是,在IE设置中将默认主页改回来后,下次启动Win7后又变了回
“注册表编辑器怎么打开”虽说不是很难的问题,但是对于对电脑常识不是很擅长的网民来说,当电脑出现问题或需要更改设置时,着实还是件头疼的问题。因为需要打开注册表进行操作解决。那么如何打开注册表编辑器呢?
这篇文章重点介绍10个重要的WordPress安全插件和技巧,用来保护WordPress网站或者博客。 1. WP Security 人工帮助你修复被黑客入侵的网站,只要按照他们网站上的联系电话
其实运用object和javascript调用外部文件,也能实现不同栏目调用不同友情链接,即相当于调用不同栏目友情链接文件, {dede:field.typeid/}来获取当前栏目的ID。
我有一个复值矩阵。 如果我发出命令: plot(myMatrix) 然后它在图形设备上显示一种散点图,X 轴标记为 Re(myMatrix),Y 轴标记为 Im(myMatrix)。这显示了我正在寻找
我是一名优秀的程序员,十分优秀!