Python 试图使球对象从桨上反弹
我是python新手,正在为我的python简介类做最后一个项目。我已经完成了大部分的桨式球类游戏,但不知道如何让球从我的桨式球类物体上弹起 我已经研究了Stackoverflow一段时间,花了几个小时试图自己解决它,但没有任何成功。如果有人有任何想法,我真的需要帮助 如果有什么我需要更好地解释,以便您更好地理解,请发表评论 GUI文件:Python 试图使球对象从桨上反弹,python,tkinter,Python,Tkinter,我是python新手,正在为我的python简介类做最后一个项目。我已经完成了大部分的桨式球类游戏,但不知道如何让球从我的桨式球类物体上弹起 我已经研究了Stackoverflow一段时间,花了几个小时试图自己解决它,但没有任何成功。如果有人有任何想法,我真的需要帮助 如果有什么我需要更好地解释,以便您更好地理解,请发表评论 GUI文件: 导入tkinter、random、particle和helpers 从tkinter进口* 从球进口* 从桨进口* 不定期进口* 划桨类: 定义初始化(自,窗
导入tkinter、random、particle和helpers
从tkinter进口*
从球进口*
从桨进口*
不定期进口*
划桨类:
定义初始化(自,窗口):
“构建桨球图形用户界面”
self.window=window
self.window.protocol('WM\u DELETE\u window',self.safe\u exit)
自宽=700
自身高度=900
self.canvas=canvas(self.window,bg='black',width=self.width,height=self.height,highlightthickness=0)
self.canvas.bind_all(“,self.move_left”)
self.canvas.bind_all(“,self.move_right”)
self.canvas.pack()
#创建指示说明的标签
说明=标签(窗口,text=“控件:左右箭头键”)
说明.包装(侧面=底部,展开=是)
#创建一个按钮以清除球
重新启动按钮=按钮(窗口,text=“Play”,command=self.reset)
重新启动按钮包(侧面=底部,展开=是)
self.ball=ball(350350)
self.paile=桨(300850400860,0,0)
self.terminated=False
self.render()
def ballobject(自):
self.ball=ball(350350)
self.paile=桨(300850400860,0,0)
self.render()
def重置(自):
self.terminated=True
def安全出口(自):
''关闭GUI之前关闭事件循环''
self.terminated=True
self.window.destroy()
#渲染一切
def渲染(自):
#当程序未终止时
如果不是自终止的:
#擦除画布
self.canvas.delete(全部)
#移动球
self.ball.move(self.canvas,self.pable)
#渲染球
self.ball.render(self.canvas)
#渲染桨
self.palle.render(self.canvas)
#使用distance()检测球和桨之间的碰撞。
''球反弹(自我)''
#设置粒子运动的动画
self.canvas.after(10,self.render)
其他:
#擦除画布
self.canvas.delete(全部)
self.terminated=False
self.canvas.after(50,self.ballobject)
def向左移动(自身,事件):
自我。划桨。向左移动(事件)
def向右移动(自身、事件):
自我。划桨。向右移动(事件)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
root.option_add('*font',('Verdana',12',粗体斜体')#位于http://effbot.org/tkinterbook/tkinter-widget-styling.htm
根目录。可调整大小(0,0)#位于https://mail.python.org/pipermail/tutor/2001-September/008504.html
root.title(‘桨球’)
root.wm_属性(“-topmest”,-1)
app=浆球(根)
root.mainloop()
球类文件:
班级舞会:
'''
Ball为可以渲染到画布的单个球建模
'''
定义初始(self,x,y,半径=15,):
'''
建造师
'''
自我。x=x
自我。_y=y
自身水平=randint(-10,10)
self.\u velY=randint(-10,-5)
自半径=半径
自身颜色=‘白色’
自我测试。_tx=350
自整度=400
self.\u t=“”
self.\u tfill=“红色”
self._t字体=(“Arial”,35,“粗体-斜体”)
#此方法渲染球
def渲染(自我,画布):
画布。创建椭圆(self.\ux-self.\u半径,self.\u y-self.\u半径,self.\ux+self.\u半径,self.\u y+self.\u半径,填充=self.\u颜色)
canvas.create_text(self.\u tx,self.\u ty,text=self.\u t,fill=self.\u tfill,font=self.\u tfont)
#这种方法可以移动球
def移动(自身、画布、桨):
#更新位置
self._x+=self._velX
自我。_y+=自我
#如果球击中任何一面墙,则速度为负
如果(self.\u x+self.\u radius>canvas.winfo_reqwidth()和self.\u velX>0)或(self.\u x-self.\u radius<0和self.\u velX<0):
self.\u velX=-self.\u velX
如果(自整角+自整角半径<0且自整角<0):
self.\u velY=-self.\u velY
如果(self.\u y+self.\u radius>canvas.winfo\u reqheight()和self.\u velY>0):
自我评价=0
自身水平=0
self.\u t=“游戏结束!\n单击播放按钮再次播放。”
#*****这就是我遇到的问题******
#确定球是否击中球拍
如果((自×自×自×自×自×半径>桨叶、自×自×和自×水平>0)或(自×自×自×自×半径<桨叶、自×自×半径<桨叶、自×半径<桨叶、自×半径<桨叶、自×水平>0)和(自×自):
self.\u velX=-self.\u velX
桨类文件:
#导入数学和帮助程序
从tkinter进口*
输入数学
从gui导入*
班级桨:
定义初始值(self,x,y,x2,y2,velX,velY):
'''
建造师
'''
自我。x=x
自我。_y=y
自身._x2=x2
自身._y2=y2
self._velX=velX
自已的
自身颜色=‘白色’
def getpadx(自身):
返回自我
def getpady(自我):
回归自我
def getpadx1(自身):
返回自我
def getpady2(自身):
返回自我
#此方法渲染桨
def渲染(自我,画布):
画布。创建矩形(self.\ux,self.\uy,self.\ux2,self.\uy2,fill=self.\ucolor)
#此方法移动桨
def移动(自我,画布):
#更新位置
Import tkinter, random, particle, and helpers
from tkinter import *
from ball import *
from paddle import *
from time import *
class PaddleBall:
def __init__(self, window):
''' Construct the paddle ball GUI '''
self.window = window
self.window.protocol('WM_DELETE_WINDOW', self.safe_exit)
self.width = 700
self.height = 900
self.canvas = Canvas(self.window, bg='black', width=self.width, height=self.height, highlightthickness=0)
self.canvas.bind_all("<KeyPress-Left>", self.move_left)
self.canvas.bind_all("<KeyPress-Right>", self.move_right)
self.canvas.pack()
# Create a label to indicate instructions
instructions = Label(window, text="Controls: Left & Right Arrow Keys")
instructions.pack(side=BOTTOM, expand=YES)
# Create a button to clear Ball
restart_button = Button(window, text="Play", command=self.reset)
restart_button.pack(side=BOTTOM, expand=YES)
self.ball = Ball(350, 350)
self.paddle = Paddle(300, 850, 400, 860, 0, 0)
self.terminated = False
self.render()
def ballobject(self):
self.ball = Ball(350, 350)
self.paddle = Paddle(300, 850, 400, 860, 0, 0)
self.render()
def reset(self):
self.terminated = True
def safe_exit(self):
''' Turn off the event loop before closing the GUI '''
self.terminated = True
self.window.destroy()
# Render everything
def render(self):
# While program is not terminated
if not self.terminated:
# Erase Canvas
self.canvas.delete(ALL)
# Move ball
self.ball.move(self.canvas, self.paddle)
# Render ball
self.ball.render(self.canvas)
# Render paddle
self.paddle.render(self.canvas)
# use distance() to detect collision between ball and paddle.
'''Ball.bounce(self)'''
# Animate the particles movement
self.canvas.after(10, self.render)
else:
# Erase Canvas
self.canvas.delete(ALL)
self.terminated = False
self.canvas.after(50, self.ballobject)
def move_left(self, event):
self.paddle.move_left(event)
def move_right(self, event):
self.paddle.move_right(event)
if __name__ == '__main__':
root = Tk()
root.option_add('*font', ('Verdana', 12, 'bold italic')) # Found at http://effbot.org/tkinterbook/tkinter-widget-styling.htm
root.resizable(0,0) # Found at https://mail.python.org/pipermail/tutor/2001-September/008504.html
root.title('Paddle Ball')
root.wm_attributes("-topmost", -1)
app = PaddleBall(root)
root.mainloop()
class Ball:
'''
Ball models a single ball that may be rendered to a canvas
'''
def __init__(self, x, y, radius = 15,):
'''
Constructor
'''
self._x = x
self._y = y
self._velX = randint(-10,10)
self._velY = randint(-10,-5)
self._radius = radius
self._color = 'white'
self._tx = 350
self._ty = 400
self._t = ""
self._tfill = "red"
self._tfont = ("Arial", 35, "bold italic")
# This method renders the ball
def render(self, canvas):
canvas.create_oval(self._x - self._radius, self._y - self._radius, self._x + self._radius, self._y + self._radius, fill = self._color)
canvas.create_text(self._tx, self._ty, text = self._t, fill = self._tfill, font = self._tfont)
# This method moves the ball
def move(self, canvas, Paddle):
# Update Position
self._x += self._velX
self._y += self._velY
# If the ball hits any of the wall negate the velocity
if (self._x + self._radius > canvas.winfo_reqwidth() and self._velX > 0) or (self._x - self._radius < 0 and self._velX < 0):
self._velX = -self._velX
if (self._y + self._radius < 0 and self._velY < 0):
self._velY = -self._velY
if (self._y + self._radius > canvas.winfo_reqheight() and self._velY > 0):
self._velY = 0
self._velX = 0
self._t = " GAME OVER! \n Click the play button to play again."
#*****THIS IS WHAT I'M HAVING TROUBLE WITH******
# Determine if the ball hits the paddle
if ((self._x + self._radius > Paddle._x(self) and self._velX > 0) or (self._x + self._radius < Paddle._x2(self))) and (self._y < Paddle._y(self)):
self._velX = -self._velX
# Import math and helpers
from tkinter import *
import math
from gui import *
class Paddle:
def __init__(self, x, y, x2, y2, velX, velY):
'''
Constructor
'''
self._x = x
self._y = y
self._x2 = x2
self._y2 = y2
self._velX = velX
self._velY = velY
self._color = 'white'
def getpadx(self):
return self._x
def getpady(self):
return self._y
def getpadx1(self):
return self._x2
def getpady2(self):
return self._y2
# This method renders the paddle
def render(self, canvas):
canvas.create_rectangle(self._x, self._y, self._x2, self._y2, fill = self._color)
# This method moves the paddle
def move(self, canvas):
# Update Position
# If the paddle hits any of the wall negate the velocity
if (self._x + self._radius > canvas.winfo_reqwidth() and self._velX > 0) or (self._x - self._radius < 0 and self._velX < 0):
self._velX = -self._velX
def move_left(self, event):
self._x -= 35
self._x2 -= 35
def move_right(self, event):
self._x += 35
self._x2 += 35
`if (self._x > Paddle._x) and (self._x < Paddle._x2):
if (self._y + self._radius > Paddle._y):
self._velY = -self._velY
self._velX = self._velX + randint(-2,2)`