我正在使用pyglet/openGL在Python中构建基于tile的应用程序,其中我需要找到给定单元格的所有相邻单元格.我在笛卡尔网格的一个象限中工作.每个单元格都有一个x和y值,表示它在网格中的位置(x_coord和y_coord).这些不是像素值,而是网格位置.我正在寻找一种有效的方法来获得相邻的细胞.在max,有八个可能的相邻单元格,但由于网格的边界,可能只有3个.伪代码对于一个简单但可能效率低下的方法看起来像这样:
def get_adjacent_cells( self, cell ):
result = []
x_coord = cell.x_coord
y_coord = cell.y_coord
for c in grid.cells:
if c.x_coord == x_coord and c.y_coord == y_coord: # right
result.append( c )
if c.x_coord == x_coord - 1 and c.y_coord == y_coord + 1: # lower right
result.append( c )
if c.x_coord == x_coord - 1 and c.y_coord == y_coord: # below
result.append( c )
if c.x_coord == x_coord - 1 and c.y_coord == y_coord - 1: lower left
result.append( …Run Code Online (Sandbox Code Playgroud) 我的PC上安装了3个游戏库:pyglet,pygame和Panda3D.
我想创建一个2D游戏,并使其成为一个网络浏览器游戏,所以我可以把它放在Facebook上.
我知道Panda3D有一个网络浏览器插件.Panda3D的是3D游戏为主.
我不能使用Python 3中的Pyglet 1.2alpha1(它应该可以在Py3下运行).
我按照说明正确安装,但它不能在Py3上运行,但我知道我安装了一切正确,因为我可以在Python 2.7中使用它.
每次我尝试使用解释器导入piglet时,都会收到此错误:
>>> import pyglet
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./pyglet/__init__.py", line 276
print '[%d] %s%s %s' % (thread, indent, name, location)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
阅读errore消息很明显,错误是在Python 2样式(print foo而不是print(foo))中编写的.
所以我的问题是:是否可以在Python 3下运行pyglet?
我知道正确使用它的人,所以我该怎么办?可能是因为网站上有错误的Pyglet版本?我应该用2to3转换吗?
我正在编写一个小示例程序,我想覆盖默认的pyglet的ESC关闭应用程序的行为.我有一些程度:
window = pyglet.window.Window()
@window.event
def on_key_press(symbol, modifiers):
if symbol == pyglet.window.key.ESCAPE:
pass
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.
我正在制作一款具有可破坏地形的游戏(如游戏中的蠕虫或焦土),并通过蒙版使用像素完美碰撞检测.
关卡是单个表面,它现在的工作原理是我每帧都创建一个副本,绘制需要在其上绘制的所有精灵,然后将可见区域blit到显示表面.
有没有办法避免每帧复制整个水平表面,仍然能够使用pygame中找到的像素完美碰撞工具?
我首先尝试在水平面上进行blitting,然后在屏幕上对每个精灵进行blitting(由相机调整的blit坐标,除了坐标为静态的玩家角色),但在这种情况下,碰撞检测系统崩溃了,我可以'似乎能够解决它.
我设法使其工作方式如下:绘制精灵时,我将他们的游戏世界坐标(基本上是相对于水平位图原点的坐标)转换为屏幕坐标(相对于相机的坐标,这是当前的水平的可见区域).
在碰撞检测阶段I期间,使用相对于水平面定位的坐标和边界框; 就像上面一样.问题是相机的位置是否与玩家的位置绑定,而该位置不是也不应该是静态值(我真的不确定我是如何设法在这么长时间内没有意识到的).
虽然这解决了我的问题,但下面的答案更全面地介绍了如何在这种情况下提高性能.我也愿意接受使用其他库的建议,这些库可以使考验变得更容易或更快.我已经考虑过pyglet和rabbyt,但看起来存在同样的问题.
我开始在Python中使用OpenGL 4(通过Pyglet和一些框架代码我从网上下载/自己编写用于加载着色器/程序),但我认为我理解的东西相当不错,所以我认为没有我代码中的某个问题.
那我的问题是什么?似乎当numpy数组或缓冲区达到一定大小时,我画画时会发生奇怪的事情.请查看链接的图片,看看我的意思. http://i.imgur.com/8Oym6VA.png?1
在图片上你可以看到我正在画一些"机器人",每个机器人都是由8个盒子组成的.机器人的数据只计算一次,使用基本的立方体顶点/颜色/索引数据,然后适当地平移/缩放/旋转并附加到更大的阵列中.在左边的图片中,我在一个VAO中绘制了172个这样的机器人,右边的图片有173个机器人.正如你所看到的,当我翻过那个"神奇"的数字时会发生奇怪的事情.看起来好像所有顶点都以某种方式连接到要在屏幕上绘制的第一个点(第一个绘制的机器人"身体"的右上方部分).如果我将第一个机器人移动到其他地方,所有点仍然连接到该点 - 以说明我确保图片中的点不以(0,0,0)或类似的为中心.左图有顶点和颜色数据,有131328个浮点数,索引数据长49248.右图有顶点和颜色数据,有132096个浮点数,而索引数据有49536个浮点数.如果我将数据分成多个VAO,那么我可以轻松地绘制100倍价值的机器人(当然有100个VAO)没有任何问题(即使1000个VAO的1000个机器人也运行良好,除了服用了很多记忆和工作约0.2 FPS).
为了测试Pyglets类(或我自己的)是否有任何问题,我还用OpenGL调用重写了整个事情,我遇到了同样的问题.那么,维也纳国际中心是不是意味着那么大(我不知何故怀疑维多利亚州立大学每个只有大约17k个三角形)?或者它与Numpy有关(我之前在Numpy中使用过更大的阵列,我不记得有任何问题)?哦顺便说一句,浮点数的大小似乎并不重要(如果所有顶点都在[-1,1]范围内,如果上升到[-35000,35000],则会发生同样的事情.
我已经非常广泛地搜索了这个主题,但我在搜索中没有遇到任何类似的东西 - 如果有的话,我道歉.我所能找到的只是使用非常大的numpy数组时的MemoryError,但是我的数组远远不能达到生成它所需的大小.
我的系统规格是:
虽然我几乎可以肯定我的代码没有任何问题,但我仍然会在这里弹出与绘图相关的片段(同样,我也尝试过基础OpenGL调用,但它没有更好的工作) .
首先,我有一个"Handler"类,它用于存储大量静态数据,因此我可以使用一个glDraw*调用(例如游戏级别或类似的东西)绘制它.它创建了添加到其数据的方法,初始化其VBO和VAO的方法以及绘制函数,该函数获取堆栈并使用它.它还获取它绘制的程序(顶点/颜色着色器).
class Handler:
def __init__(self, program):
self.vertexData = numpy.array((), dtype=GLfloat)
self.colorData = numpy.array((), dtype=GLfloat)
self.indexData = numpy.array((), dtype=GLshort)
self.program = program
def initBuffers(self):
self.vao = GLuint()
glGenVertexArrays(1, self.vao)
glBindVertexArray(self.vao)
#=======================================================================
# Vertices
#=======================================================================
self.vertexBufferObject = pyglet.graphics.vertexbuffer.create_buffer(self.vertexData.nbytes, GL_ARRAY_BUFFER, GL_STATIC_DRAW)
self.vertexBufferObject.bind()
self.vertexBufferObject.set_data(self.vertexData.ctypes.data)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0)
#=======================================================================
# …Run Code Online (Sandbox Code Playgroud) 我使用Python 2.7运行Mac OS X Mountain Lion.我做了一个Pyglet的源代码安装,似乎没有错误,但是每当我尝试运行程序时,我都会得到一个我不理解的长错误.听起来它与QuickTime有关?
我尝试过的每个程序都会出现同样的错误.我尝试运行的程序是源代码中的示例,示例如下:http://guzalexander.com/2012/08/17/playing-a-sound-with-python.html
我得到的错误说:
File "examples/media_player.py", line 44, in <module>
from pyglet.gl import *
File "/Library/Python/2.7/site-packages/pyglet/gl/__init__.py", line 510, in <module>
import pyglet.window
File "/Library/Python/2.7/site-packages/pyglet/window/__init__.py", line 1669, in <module>
from pyglet.window.carbon import CarbonPlatform, CarbonWindow
File "/Library/Python/2.7/site-packages/pyglet/window/carbon/__init__.py", line 69, in <module>
framework='/System/Library/Frameworks/QuickTime.framework')
File "/Library/Python/2.7/site-packages/pyglet/lib.py", line 90, in load_library
return self.load_framework(kwargs['framework'])
File "/Library/Python/2.7/site-packages/pyglet/lib.py", line 226, in load_framework
lib = ctypes.cdll.LoadLibrary(realpath)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
self._handle = …Run Code Online (Sandbox Code Playgroud) 我正在使用Python 2.6.6和pyglet 1.1.4.在我的"Erosion"文件夹中,我有"Erosion.py"和一个名为"Images"的文件夹.在图像内部,有.png图像.一张图片名为"Guard.png".
在"Erosion.py"中有一段如下:
pyglet.resource.path = ['Images']
pyglet.resource.reindex()
self.image = pyglet.resource.image('%s%s' % (character, '.png'))
Run Code Online (Sandbox Code Playgroud)
当我跑这个,我得到了
File "C:\Python26\lib\site-packages\pyglet\resource.py", line 394, in file raise ResourceNotFoundException(name)
ResourceNotFoundException: Resource "Guard.png" was not found on the path. Ensure that the filename has the correct captialisation.
Run Code Online (Sandbox Code Playgroud)
我尝试将路径更改为['./''和['../Images'].我也尝试删除路径和reindex调用,并将Erosion.py和Guard.png放在同一个文件夹中.
这是代码.5000弹跳旋转红色正方形.(16x16 png)在pygame版本上,我得到30 fps但是带有pyglet的10 fps.对于这种事情,Isnt OpenGl应该更快吗?
pygame版本:
import pygame, sys, random
from pygame.locals import *
import cProfile
# Set FPS
FPS = 60.0
clock = pygame.time.Clock()
# Set window
WINDOWWIDTH= 800
WINDOWHEIGHT = 600
pygame.init()
screen = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
screen.fill((0,0,0))
background = screen.copy().convert()
image = pygame.image.load("square.png").convert()
class Square(object):
def __init__(self,x,y):
self.x = x
self.y = y
self.v_x = random.randint(1,100)
self.v_y = random.randint(1,100)
self.v_r = random.randint(-100,100)
self.rotation = 0
def __rep__(self):
return "Square %d,%d"%(self.x,self.y)
def update(self,dt):
if self.x > WINDOWWIDTH:
self.v_x *= -1 …Run Code Online (Sandbox Code Playgroud) 我的问题从这里开始:
gTTS运行良好,从文本文件中获取文本,但首先创建mp3文件,然后如果我想听,我必须调用这个mp3,所以这是好的,但如果我可以避免任何音频文件,并且只是从文本文件.也许不知何故,我可以使用谷歌语音从文本文件中读取..?无论如何,现在主要问题是其他问题
如果我只能使用gTTS在Windows 10-64位,Python 3.5上播放mp3的最佳方法是什么
好吧用os:
import os
os.startfile("D:\my path/rec1.mp3")
Run Code Online (Sandbox Code Playgroud)
这很好,但我不想使用默认播放器,需要像simpleaudio这样的mp3 ...
与pygame我有安装问题,但不确定,这样使用它有多好:
from pygame import mixer
mixer.init()
mixer.music.load('D:/my path/rec1.mp3')
mixer.music.play()
Run Code Online (Sandbox Code Playgroud)
vlc只是如何安装它?与easy_install vlc我有错误:could not find suitable distribution for requirement.parse ('vlc')与pip install vlc错误:could not find a version that satisfies the requirement vlc (from versions: ) no matching distribution found for vlc
import vlc
p = vlc.MediaPlayer("file:/my path/rec1.mp3")
p.play()
p.stop()
Run Code Online (Sandbox Code Playgroud)
与pyglet:
import pyglet
music=pyglet.media.load('D:/my path/rec1.mp3')
music.play()
pyglet.app.run()
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
'AVbin is required to decode compressed …Run Code Online (Sandbox Code Playgroud) pyglet ×10
pygame ×4
python ×4
python-2.7 ×2
python-3.x ×2
activepython ×1
grid ×1
macos ×1
numpy ×1
opengl ×1
pydub ×1
vbo ×1
vlc ×1