在Python中开发2D游戏有哪些工具包?我听说过的一个选项是Pygame,但还有什么东西可以做更多的事情吗?模块有哪些好处和坏处?
我试图将PNG图像blit到表面上,但由于某种原因,图像的透明部分变黑,这是简单的代码:
screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32)
world = pygame.Surface((800, 600), pygame.SRCALPHA, 32)
treeImage = pygame.image.load("tree.png")
world.blit(treeImage, (0,0), (0,0,64,64))
screen.blit(world, pygame.rect.Rect(0,0, 800, 600))
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决问题?图像具有Alpha透明度,我在PhotoShop中将其打开,背景变为透明,而不是黑色或白色或任何其他颜色.
感谢您的支持 :)
我正在用Python创建一个游戏(带有pygame),这需要我为每个新游戏生成随机但漂亮的"海洋".经过长时间的搜索,我决定采用一种算法,该算法涉及padlib.py中定义的Bezier曲线.我现在需要弄清楚padlib生成的曲线何时与线段相交.
蛮力方法只是使用padlib生成的近似线段集来找到答案.但是,我怀疑可以通过分析找到更好的答案.我只有几十个样条线段 - 搜索它们应该比数千个线段更快.
一点点搜索让我沿着这条路走:Bezier Curve - > Kochanek-Bartels Spline - > Cubic Hermite spline
在最后一页,我发现了这个功能:
p(t)= h 00(t)p 0 + h 10(t)m 0 + h 01(t)p 1 + h 11(t)m 1
其中p(t)实际上是一个点(二维向量),h ij(t)函数是三次多项式,p 0,p 1,m 0和m 1是我可以从padlib代码得到的点.
现在,我可以看到我的问题的解决方案是p(t)= u + v*t 1,其中u和v是我的线段的结尾.
然而,制定分析解决方案超出了我的范围.这里有人知道现有的解决方案吗?或者可以帮我解决方程式?
我使用pygame在认知科学中运行实验,并且我经常需要大量I/O,因此我喜欢将这些任务分离到单独的进程(使用多核机器时)以提高代码的性能.但是,我遇到了一些代码可以在我的同事的Linux机器(Ubuntu LTS)上运行但不在我的mac上的情况.下面是代表最小可再现示例的代码.我的mac是2011 Macbook Air运行10.7.2并使用默认的python 2.7.1.我尝试通过预先构建的二进制文件安装pygame ,然后我也尝试从源代码安装SDL和pygame.
import pygame
import multiprocessing
pygame.init()
def f():
while True:
pygame.event.pump() #if this is replaced by pass, this code works
p = multiprocessing.Process(target=f)
p.start()
while True:
pass
Run Code Online (Sandbox Code Playgroud)
正如代码中所指出的,罪魁祸首似乎是pygame.event.pump()在一个单独的过程中.当我在我的Mac上运行它时,我首先在终端中重复打印以下内容:
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
Run Code Online (Sandbox Code Playgroud)
然后我收到一份崩溃报告,复制到这个要点.
有关如何解决此问题的任何建议?
目前,每次按下一个键时,精灵只会移动1个像素.当按住左或右键时,我怎么能让管道工精灵不断移动?
while running:
setup_background()
spriteimg = plumberright
screen.blit(spriteimg,(x1, y1))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
x1 = x1 + 0
y1 = y1 - 1
elif event.key == pygame.K_DOWN:
x1 = x1 + 0
y1 = y1 + 1
elif event.key == pygame.K_LEFT:
x1 = x1 -1
y1 = y1 + 0
elif event.key == pygame.K_RIGHT:
x1 = x1 + 1
y1 = y1 + 0
pygame.display.flip() …Run Code Online (Sandbox Code Playgroud) 我运行一个python脚本,它曾经工作,甚至在我的笔记本电脑上,但不是在我的其他计算机上 - 我只是得到错误代码:
<<进程以退出代码-1073741515(0xC0000135)>>结束
我没有得到任何其他结果 - 甚至没有从文件开头的"打印"命令.
我没有找到任何特定的东西..我重新安装了python(2.7.9),pygame(1.9.1)甚至pycharm(首先尝试4.5,现在用5.0 - 相同的结果)
有谁知道错误代码是什么意思?我找不到任何关于它的东西.
问题
我试图将python文件转换为EXE文件,但是我似乎每次都遇到同样的问题,无论是CX_Freeze还是Pyinstaller.我刚刚尝试使用pyinstaller,并使用该命令创建了一个EXE文件
pyinstaller --onefile thepyfile
Run Code Online (Sandbox Code Playgroud)
一切正常.它在dist文件中创建exe.但是,当我打开exe时,它会向我显示一个命令窗口,然后快速关闭.我设法捕获错误即时通讯使用打印屏幕,它说pygame错误:无法打开图像family.jpg.我正在使用pygame模块.
我试过了什么?
Iv确保图像与我的python文件位于同一目录和相同的文件夹中.当我运行它时,我的.py工作正常,它只是exe.无论如何只是为了确保在我加入路径的路径中加载图像没有问题
os.path.join
Run Code Online (Sandbox Code Playgroud)
它再次适用于py文件,但它在exe中不起作用.我还检查了我是否正确安装了pyinstaller,它适用于其他不涉及导入图像的exe程序.我也尝试创建一个文件夹,然后使用
os.path.join(folder,file)
Run Code Online (Sandbox Code Playgroud)
但它再次在py文件中工作,但不是pyinstaller/cx_freeze exe.
线索?
当我在使用CX__freeze时,我发现pygame也无法导入图像.然而它给了我一个更大的错误案例,不确定它是否有用但它可能是一个线索?
请帮忙
我已经遇到这个问题超过5个星期了,我迫切需要帮助.
一些代码
这是我导入图像的方式(再次在py文件中工作但不在exe文件中)
family_image = pygame.image.load(os.path.join('folder',"family.jpg")).convert()
Run Code Online (Sandbox Code Playgroud)
如果需要继承我的cx_Freeze setup.py,这也使exe文件仍然给我图像不能加载错误.
import cx_Freeze
import sys
import pygame
import random
import math
import os
os.environ['TCL_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tc18.6"
os.environ['TK_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tk8.6"
base = None
if sys.platform == 'win32':
base = "Win32GUI"
executables = [cx_Freeze.Executable("Treg&Shelly.py",shortcutName="Cards",shortcutDir="DesktopFolder",base = base)]
cx_Freeze.setup(
name = "HAPPY NEW YEARS",
options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":["family.jpg","newyears.png"]}},
version = "0.01",
description = "New Years Card",
executables = …Run Code Online (Sandbox Code Playgroud) 编辑
这是一个未解决的问题,似乎与alsa音频有关。
一种解决方法是关闭音频混合器,或从源代码安装pyGame。
pygame.init()
pygame.mixer.quit()
Run Code Online (Sandbox Code Playgroud)
我刚刚开始使用pyGame进行开发,并且发现应该使用以下方法来控制CPU时间:
fps = 30
clock = pygame.time.Clock()
while True:
# Logic...
clock.tick(fps)
Run Code Online (Sandbox Code Playgroud)
我似乎遇到的问题是,最基本的以1 FPS运行的方形程序会消耗完整的CPU内核。
import pygame
pygame.init()
size = ( 16, 16 )
screen = pygame.display.set_mode(size)
pygame.display.set_caption("High CPU")
clock = pygame.time.Clock()
run=True
while run:
print("Rendering...")
for event in pygame.event.get():
if event.type == pygame.QUIT:
run=False
screen.fill((255,255,255))
# Render
pygame.display.flip()
clock.tick(1)
# When done
pygame.quit()
Run Code Online (Sandbox Code Playgroud)
一旦调用此脚本,我的计算机的单个核心就会达到100%,尽管消息仅以预期的1 FPS更新速率打印到控制台。
$ ps aux | grep python
mclark 25867 97.4 0.1 652232 29088 pts/0 Sl+ 13:10 0:06 python highCPU.py …Run Code Online (Sandbox Code Playgroud) 只是好奇,如果有人知道学习和理解PyGame的好网站.我已经用Python编写了一堆,所以我装备精良.只是好奇,如果有人知道一个好的网站或更多的学习PyGame.
谢谢你的帮助!
我是Vector和制作课程的新手.我正在尝试构建自己的vector类,但是当我通过我的代码传递它时:
position + = heading*distance_moved
其中position和heading都是向量.标题是标准化的.我的目标是重复我的代码,直到position = destination.这堂课怎么了?
导入数学
class Vector(object):
#defaults are set at 0.0 for x and y
def __init__(self, x=0.0, y=0.0):
self.x = x
self.y = y
#allows us to return a string for print
def __str__(self):
return "(%s, %s)"%(self.x, self.y)
# from_points generates a vector between 2 pairs of (x,y) coordinates
@classmethod
def from_points(cls, P1, P2):
return cls(P2[0] - P1[0], P2[1] - P1[1])
#calculate magnitude(distance of the line from points a to points b
def get_magnitude(self): …Run Code Online (Sandbox Code Playgroud)