由于最近我要考试忙不过来没修改回答,谢谢评论区大们的指正,我认识到的pygame库确实可以做游戏,但是pygame限制很多,特别是做大型游戏方面,3D还没有相关的优化方法等(3D游戏,pygame表示闻所未闻),而且平时我练习pygame的时候都是做2D游戏。对大型游戏特别是3D没有相关的经验,见谅啦
而且画繁花曲线的那个确实有问题,不断增加的数组会拖慢速度,但是开始前我们不确定究竟要画多少个点,因此我暂且采用append方法。
我改一下结论,pygame库不太适合做大型游戏,这下不背锅了吧~
谢谢大家的积极指正!
“Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚”
————————
不太可能,python有一个库叫pygame,是可以做游戏的,pygame采用轮询和帧更新的方式来是游戏变得动态起来。轮询就是不断询问用户输入。帧就是不断更新画面。换句话说,主要的机制就是画一幅幅画,随着时间的推移,它会变得动态起来。
有一个很大的问题是,pygame在绘制比较复杂的图形的时候,难免会导致“卡顿”的现象,也就是我们经常说的“看连环画”。pygame在处理小游戏的时候表现还很出色,但是在大型游戏方面,我觉得需要提升和优化pygame的性能。
有一个比较典型的案例就是画繁花曲线
源代码如下,其中r1是大圆的半径,r2小圆,r3是小圆圆孔,也就是画点的地方距离小圆圆孔的距离。这三个值理论上可以随便改,但是我觉得,由于屏幕大小是600*600,因此r1<=300,r2最好比r1小,因此r1>=r2,同理,r2>=r3
import pygame as pg
from math import sin,cos
from pygame.locals import *
o=0.00;
r1=300;r2=130;r3=r1-r2;r4=80
k1=r3/r1;k2=r2/r1;
ps=[]
pg.init()
zt3=zt1=pg.font.SysFont('stkaiti',20)
def prt(font,text,x,y,color=(255,255,255)):
img=font.render(text,True,color)
scr.blit(img,(x,y))
text="大圆:"+str(r1)+"小圆:"+str(r3)+"圆孔:"+str(r4)
white=255,255,255
red=255,0,0
green=0,255,0
blue=0,0,255
scr=pg.display.set_mode((600,600))
pg.display.set_caption("繁花曲线")
while True:
for eve in pg.event.get():
if eve.type == QUIT:
exit()
scr.fill(white)
po=(round(300+r3*cos(k1*o)),round(300+r3*sin(k1*o)))
pos=(round(300+r2*cos(k1*o)+r4*cos(k2*o)),round(300+r2*sin(k1*o)-r4*sin(k2*o)))
ps.append(pos)
prt(zt3,text,12,12,color=(0,0,0))
for i in ps:
pg.draw.circle(scr,blue,i,1,0)
pg.display.update()
o=o+0.03
你运行的时候就可以看出新画的点运行的越来越慢,这就是采用帧的方式,拖累了速度,每一次都必须画新的图像,并储存已经画了点。
更别说3D了,3D游戏需要不断的计算三角函数。由此来更新从用户视角上所看到的画面,经典做3D的是unity3D,4399小游戏经常遇到。但是pygame不太适合。计算三角函数会消耗很多的资源,因此正确的做法是在游戏开始之前计算好所有的三角函数然后存在内存里面。
以下我分享一个我编写的小游戏,以此为案例
游戏名:接球大战
介绍:游戏会随机出现QQ表情中的任意一个,然后移动鼠标,移动屏幕下面的挡板,挡板会接住QQ表情,如果接住了就加分,表情速度是随机的。
如果没有接触就会生命值-1
import sys
from random import choice,random
import pygame as pg
from pygame.locals import *
from time import sleep
gg=255,165,0
green=0,255,0
red=255,0,0
pg.init()
scr=pg.display.set_mode((600,600))
pg.display.set_caption('接球大战')
ft=pg.font.SysFont('stkaiti',24)
zt3=zt1=pg.font.SysFont('stkaiti',40)
kais=pg.image.load("/游戏图片/kais.jpg").convert()
beij=pg.image.load('/游戏图片/QQ.jpg').convert()
biaoq=[]
for i in range(1,41):
biaoq.append(pg.image.load('/游戏图片/表情/'+str(i)+'.png').convert_alpha())
x=231
y=30
vx=1
vy=1
jf=2
zf=0
lv=3
s=False
bq=biaoq[-1]
sudu=[1,2,3]
while True:
scr.blit(kais,(0,0))
for eve in pg.event.get():
if eve.type== QUIT:
exit()
mx,my=pg.mouse.get_pos()
but1,but2,but3=pg.mouse.get_pressed()
x=x+vx
y=y+vy
scr.blit(bq,(x-25,y-25))
if x<25 or x>575:
vx=-vx
if y<25 or y>575:
vy=-vy
if but1:
if abs(mx-284)<84 and abs(my-478)<36 :
break
pg.display.update()
def nextqiu():
x=int(random()*500+50)
y=30
vx=choice([-3,-2,-1,0,1,2,3])
vy=choice([1,2,3])
jf=vx+vy
def prt(font,text,x,y,color=(255,255,255)):
img=font.render(text,True,color)
scr.blit(img,(x,y))
x=231
y=30
vx=1
vy=1
while True:
scr.blit(beij,(0,0))
for eve in pg.event.get():
if eve.type== QUIT:
sys.exit()
mx,my=pg.mouse.get_pos()
pg.draw.rect(scr,green,(mx,570,100,30),0)
#画球
scr.blit(bq,(x-25,y-25))
x=x+vx
y=y+vy
if x>575 or x<25:
vx=-vx
if y>550 and abs(mx+50-x)<50:
zf=zf+jf
x=int(random()*500+50)
y=30
vx=choice([-3,-2,-1,0,1,2,3])
vy=choice([1,2,3])
jf=vx+vy
sleep(0.25)
bq=choice(biaoq)
elif y>550 and abs(mx+50-x)>50:
lv=lv-1
prt(zt3,'没接到',x,y-40,color=(255,0,0))
x=int(random()*500+50)
y=30
vx=choice([-3,-2,-1,0,1,2,3])
vy=choice([1,2,3])
bq=choice(biaoq)
jf=vx+vy
s=True
if lv<0:
break
sleep(0.005)
prt(ft,'生命值 :'+str(lv),452,20,color=(255,0,0))
prt(ft,'分数 :'+str(zf),452,50,color=green)
pg.display.update()
if s:
sleep(1)
s=False
hua=pg.image.load('/游戏图片/画.jpg').convert()
scr.blit(hua,(0,0))
zt1=pg.font.SysFont('stkaiti',100)
zt2=pg.font.SysFont('stkaiti',50)
prt(zt1,'游戏结束',70,150,color=red)
prt(zt2,'得分 :'+str(zf),80,310,color=red)
pg.display.update()
请注意,源代码是不能直接运行的,请下载游戏图片,然后把源代码中的游戏图片路径改成正确的(也就是图片下载后保存在电脑上的位置)即可