tkinter VS Pygame (以打飞机为例)
本帖最后由 Robot_Steve 于 2020-3-14 13:50 编辑tkinterVSPygame
Pygame编游戏有点复杂,而 tkinter 呢,资料太少
于是就只能用 Pygame 编游戏了
tkinter 能很好的构建 GUI 窗口,但是不适用于编写游戏。
而 Pygame 能很好的编写游戏(里边有现成的碰撞检测和动画精灵函数),但是不能很好的构建 GUI ,像按钮或者是标签。
我上网查过。别人说 Pygame 设计按钮需要找一个图片把图片给P上去,在检测鼠标有没有点击到图片(说白了就是检测坐标)
额... 说了这么多,好像是废话 ...
咳咳,言归正传。今天呢,就是来一场 tkinter 和 Pygame 的 “对战”
以打飞机游戏作为今天的 “考题”
我是先用 tkinter 做了一个打飞机游戏 (因为我只会用 tkinter,Pygame 有点太复杂)
链接如下:
链接: https://pan.baidu.com/s/1D2fuWRB5aRL65U2WqZ75hQ
提取码: 5f26
先别着急着复制链接,先看下面的使用问题,以免你碰到
这个呢需要你手动的复制,然后找一个网页,把链接复制上去
======================================
使用问题:
问1: 如果他让你下载一个软件,怎么办?
答1: 你不要去下载它,打开那个文件夹,把里边的文件全部勾选,然后再点击普通下载。他会给你下载一个批量文件
------------------------------------------------------------
问2: 无法 exe 下载怎么办?
答2: 先下载图片,后面有具体代码
------------------------------------------------------------
问3(最担心的问题): 会不会过期?
答3(最担心的问题): 不会过期,是永久的
======================================
呃,在这里我不能给大家发图片,我没有拍图片(实际上是我没有权限发图片,这句话你不要看)
大家可以体验体验。额,由于 tkinter 的“碰撞检测”不太完美,请谅解!
好啦,先给代码上来(代码敲得过于着急没有加注释,见谅):
注:如果代码有中文(除了注释),把翻译关掉就好了
from pygame import init,mixer
from random import randint
from tkinter import *
version = "Beta-0.2"
root = Tk()
root.title("Plane-warVercion: "+version)
root.iconbitmap("planeicon.ico")
root.geometry("375x500")
root.resizable(0, 0)
px = 180
py = 465
player_dkill = False
score = 0
w = Canvas(root,width=600,height=500)
w.pack()
bg = PhotoImage(file="bg.png")
w.create_image(10,10,image=bg)
Label(w,text="Score: "+str(score),bg="Lavender",font=("楷体",16)).place(relx=0.001,rely=0.001)
def move(move_position):
if player_dkill == False:
global px
global py
global p
if move_position == "A":
px = px - 10
w.delete(p)
p = w.create_image(px, py, image=photo)
else:
px = px + 10
w.delete(p)
p = w.create_image(px, py, image=photo)
# print(str(py) + "-----" + str(px))
def amove(ok):
move("A")
def dmove(ok):
move("D")
bullet = PhotoImage(file="bullet.png")
enemy1 = PhotoImage(file="enemy1.png")
by = py
bx = px
b = w.create_image(bx, by, image=bullet)
def bulletmove():
if player_dkill == False:
global b
global by
global bx
by = by - 30
w.delete(b)
b= w.create_image(bx, by, image=bullet)
if by <= -20:
w.delete(b)
by = py - 10
bx = px + 20
# global bmafter
global bmafter
bmafter = w.after(50, bulletmove)
else:
w.after_cancel(bmafter)
bulletmove()
photo = PhotoImage(file="player.png")
p = w.create_image(px, py, image=photo)
enemy_plane1_list = {}
epid = -1
clear_plane = PhotoImage(file="d.png")
plane_kill = PhotoImage(file="enemy_plane1_kill.png")
player_kill = PhotoImage(file="player_destro.png")
class Enemy_plane1():
def __init__(self):
global epid
self.ep1_x = int(str(randint(5, 32)) + "0")
self.ep1_y = 15
epid = epid + 1
self.epids = "id: "+str(epid)
enemy_plane1_list =
self.tp = w.create_image(self.ep1_x, self.ep1_y, image=enemy1)
self.enemy_plane1_move()
self.epaddafter = w.after(1000, Enemy_plane1)
self.epmafter = w.after(1,self.enemy_plane1_kill)
def enemy_plane1_move(self):
while_times = len(enemy_plane1_list) - 1
start_while_times = 0
while start_while_times != while_times:
x = enemy_plane1_list["id: "+str(start_while_times)]
x = x
y = enemy_plane1_list["id: "+str(start_while_times)]
y = y
if x != None:
w.create_image(x, y, image=clear_plane)
y = y + 30
self.tp = w.create_image(x, y, image=enemy1)
enemy_plane1_list["id: "+str(start_while_times)] =
start_while_times = start_while_times + 1
else:
start_while_times = start_while_times + 1
def enemy_plane1_kill(self):
while_times = len(enemy_plane1_list) - 1
start_while_times = 0
while start_while_times != while_times:
x = enemy_plane1_list["id: " + str(start_while_times)]
x = x
y = enemy_plane1_list["id: " + str(start_while_times)]
y = y
if x != None:
if x == bx:
init()
mixer.music.load("bomm.mp3")
mixer.music.play(0, 1)
w.create_image(x,y, image=plane_kill)
global score
score = score + 100
Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 16)).place(relx=0.001, rely=0.001)
kill = None
enemy_plane1_list["id: " + str(start_while_times)] =
start_while_times = start_while_times + 1
else:
start_while_times = start_while_times + 1
else:
start_while_times = start_while_times + 1
self.kill_player()
def kill_player(self):
while_times2 = len(enemy_plane1_list) - 1
start_while_times2 = 0
while start_while_times2 != while_times2:
y1 = enemy_plane1_list["id: " + str(start_while_times2)]
y1 = y1
x1 = enemy_plane1_list["id: " + str(start_while_times2)]
x1 = x1
if x1 != None:
if y1 == py and x1 == px:
mixer.music.load("bomm.mp3")
mixer.music.play(0, 1)
w.create_image(px, py, image=player_kill)
w.after_cancel(bmafter)
w.after_cancel(self.epaddafter)
w.after_cancel(self.epmafter)
w.after_cancel(bmafter)
global player_dkill
player_dkill = True
for i in range(2000):
pass
Label(w,text="Game Over",bg="Lavender",font=("楷体",35)).place(relx=0.2,rely=0.45)
Label(w, text="Score: " + str(score), bg="Lavender", font=("楷体", 20)).place(relx=0.27, rely=0.55)
start_while_times2 = start_while_times2 + 1
else:
start_while_times2 = start_while_times2 + 1
else:
start_while_times2 = start_while_times2 + 1
Enemy_plane1()
root.bind("<Key-d>",dmove)
root.bind("<Key-a>",amove)
mainloop()
=================================
PVP 开始
=================================
tkinter 分数:0
Pygame 分数: 0
----------------------------------------------------------
第一轮,碰撞检测函数:
呃,好像第一轮 tkinter 就要败下阵来tkinter 是做界面的,可以说他对游戏 “一无所知”
如上代码示例:tkinter 只有当子弹“穿过”小飞机时,小飞机才能爆炸,但是 Pygame (虽然我没有给你 Pygame 做的游戏) 只要轻轻一碰就可以使小飞机爆炸。
但是它也有弊端,如果你碰撞检测函数没有写好,小飞机没有碰到玩家飞机时,游戏就 Game Over 了。
但总体来说,Pygame 略胜一筹!
分数:
tkinter 分数:0
Pygame 分数: 1
---------------------------------------------------------
第二轮,播放音乐:
呃,好像第二轮 tkinter 又要败下阵来了。
如上代码示例:我并没有使用 tkinter 来播放音乐,我使用的是 Pygame。
为了播放音乐,我查过好多资料。但是“一无所获”,tkinter 没有提供可以播放音乐的工具。而 Pygame 作为专门制作游戏的工具,它提供了播放音乐这个功能。
所以这一轮,Pygame 获胜!
小提示:如果 Pygame 正在播放一个音乐,如打飞机的背景音乐,但是如果你突然子弹打到小飞机,播放了一个BOOM的音乐,背景音乐就会停止。
分数:
tkinter 分数:0
Pygame 分数: 2
---------------------------------------------------------
第三轮,简易性:
嗯,什么叫简易性?对我来说简易性就是简单 {:10_256:}
小甲鱼说过,Pygame 是由 C 语言编写,为了提升效率。所以按照这个逻辑,Pygame 的一些东西,他是不是有个专门的模块或者是什么别的东西。
对我来说,Pygame 没有 tkinter 简单。以例子服人:
例子:在屏幕上显示hello, world
tkinter:
from tkinter import *
root = Tk()
Label(root, text="hello, world").pack()
mainloop() # 这句话必须写
Pygame:
import pygame
from sys import exit# 用来退出程序
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((600,400))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:# 退出
exit()
screen.fill((255, 255, 255)) # 设置窗口背景颜色
font = pygame.font.SysFont('楷体', 60) # 设置字体
surface = font.render('hello python!', False, (255, 200, 10)) # 显示字体
screen.blit(surface, (100, 100)) # 填充
pygame.display.update() # 画面刷新
大家说相比起来哪个更简单?
对了,tkinter !
但是 Pygame 是专门做游戏的,他对字体不太擅长,但相比其他的而言,Pygame 略胜一筹(碰撞检测、动画精灵)
所以 Pygame 得一分...
哎哎,跑题了,我们说的是简易性,而不是“其他”...
所以,分数是:
tkinter 分数:1
Pygame 分数: 2
----------------------------------------------------------
第四轮(最后一轮),窗口设计:
哎呀!这应该不用我说了吧。
前面就说到了。
但是我还要说一次,但并不是让 Pygame 出丑
我说过,tkinter 设计 GUI 是特别擅长的,但是 Pygame 就落后了一点。
在这里。我所指的 GUI 并一般人理解的 GUI,而是窗口设计!
观众: 你说的什么呀?两个不就一样吗?
我:NO,NO,NO
我这里所指的窗口设计,是整个窗口的布局,而不是一般代码能替代的。
之前也许我一直都说错。tkinter 是对那些GUI组件(像 Label 组件、Button 组件...)擅长,而不是窗口布局。
tkinter 能精准到毫米的布局管理器只有 place
tkinter 每一次布局,都必须运行代码查看位置适合不适合。所以说,用 tkinter 设计窗口比较麻烦,但对于那些 GUI 组件 特别擅长。
意思注释:
擅长: 他提供的组建非常多。
怎么又跑题了?
tkinter 比 Pygame 更擅长 GUI设计
分数:
tkinter 分数:2
Pygame 分数: 2
=================================
结果:
=================================
虽然他们俩平局了,但是我还是有个希望的。
我不偏向哪一边。但是我希望(即使这个希望无法实现):
Pygame 能和 tkinter 结合
他们俩能够结合那将是史无前例的无敌。
秘密:
**** Hidden Message ***** 学习 学习 学习 惊了 你不是说云盘不会过期吗?{:10_277:} {:10_277:} 学习了 cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?
应该是百度文盘长时间检测到没有人,自动撤回
cupbbboom 发表于 2020-4-16 14:52
你不是说云盘不会过期吗?
不过上面有原代码 1 看一下 哈哈 有趣 {:10_334:} ? 本帖最后由 Robot_Steve 于 2021-8-7 00:25 编辑
学习 666
打开查看秘密 学习 学习了
页:
[1]
2