- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Kivy 的新手,找不到关于添加和删除标签的任何真正答案。我按照自己的方式完成了 Pong 教程(您可能已经猜到了),并将其改编为适合 4 名玩家。现在,我尝试添加一个标签来显示文本 Winner!
,然后单击该文本以重新启动游戏。
至此,一切正常。问题是,我无法让标签在新游戏开始后再次消失。另外,我不明白格式 - 我似乎无法让我的标签变大或将它移到面板中的较低位置。
我将发布所有代码,因为希望你无论如何都想玩这个游戏(一旦它被修复),而且我肯定有一个更好的、更少卡顿的方式来添加和删除文本。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import NumericProperty, ReferenceListProperty,\
ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint
class PongPaddle(Widget):
score = NumericProperty(0)
orientation = ObjectProperty([0, 0])
can_move = ObjectProperty(0)
def bounce_ball(self, ball):
if self.collide_widget(ball):
vx, vy = ball.velocity
if self.orientation[0] == 25:
offset = (ball.center_y - self.center_y) / (self.height / 2)
bounced = Vector(-1 * vx, vy)
vel = bounced * 1.1
ball.velocity = vel.x, vel.y + offset
else:
offset = (ball.center_x - self.center_x) / (self.width / 2)
bounced = Vector(vx, -1 * vy)
vel = bounced * 1.1
ball.velocity = vel.x + offset, vel.y
class PongBall(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
def move(self):
self.pos = Vector(*self.velocity) + self.pos
class PongGame(Widget):
ball = ObjectProperty(None)
player1 = ObjectProperty(None)
player2 = ObjectProperty(None)
player3 = ObjectProperty(None)
player4 = ObjectProperty(None)
def initialize(self):
SCORE = 1
self.player1.orientation = [25, 200]
self.player2.orientation = [25, 200]
self.player3.orientation = [200, 25]
self.player4.orientation = [200, 25]
self.player1.score = SCORE
self.player2.score = SCORE
self.player3.score = SCORE
self.player4.score = SCORE
self.player1.can_move = 1
self.player2.can_move = 1
self.player3.can_move = 1
self.player4.can_move = 1
self.serve_ball()
def serve_ball(self, vel=(4, 0)):
self.ball.center = self.center
self.ball.velocity = vel
def update(self, dt):
self.ball.move()
#bounce of paddles
self.player1.bounce_ball(self.ball)
self.player2.bounce_ball(self.ball)
self.player3.bounce_ball(self.ball)
self.player4.bounce_ball(self.ball)
#bounce ball off bottom or top
if ((self.ball.y < self.y) and not self.player3.can_move) \
or ((self.ball.top > self.top) and not self.player4.can_move):
self.ball.velocity_y *= -1
if ((self.ball.x < self.x) and not self.player1.can_move) \
or ((self.ball.right > self.width) and not self.player2.can_move):
self.ball.velocity_x *= -1
#went off to a side to score point?
if self.ball.x < self.x and self.player1.can_move == 1:
self.player1.score -= 1
self.serve_ball(vel=(4, randint(1, 4)))
if self.player1.score <= 0:
self.player1.can_move = 0
elif self.ball.x > self.width and self.player2.can_move == 1:
self.player2.score -= 1
self.serve_ball(vel=(-4, randint(1, 4)))
if self.player2.score <= 0:
self.player2.can_move = 0
elif self.ball.y > self.height and self.player4.can_move == 1:
self.player4.score -= 1
self.serve_ball(vel = (randint(1, 4), -4))
if self.player4.score <= 0:
self.player4.can_move = 0
elif self.ball.y < self.y and self.player3.can_move == 1:
self.player3.score -= 1
self.serve_ball(vel = (randint(1, 4), 4))
if self.player3.score <= 0:
self.player3.can_move = 0
if self.player1.can_move + self.player2.can_move + \
self.player3.can_move + self.player4.can_move == 1:
self.ball.velocity = (0, 0)
global win_label
win_label = Label(size_hint=(None, None),
text='[ref=winner]Winner![/ref]',
markup=True, text_size=(70, None))
#win_label.texture_update()
win_label.pos = (self.width / 2, self.height / 2 - 70)
## win_label.size = win_label.texture_size[0] + 20, \
## win_label.texture_size[1] + 20
win_label.bind(on_ref_press=self.click_win_label)
win_label.texture_update()
self.add_widget(win_label)
def click_win_label(self, instance, value):
self.initialize()
self.remove_widget(win_label)
def on_touch_move(self, touch):
if touch.x < self.width / 3 and touch.y > self.height / 6 \
and touch.y < 5 * self.height / 6 and self.player1.can_move:
self.player1.center_y = touch.y
if touch.x > self.width - self.width / 3 and touch.y > self.height / 6 \
and touch.y < 5 * self.height / 6 and self.player2.can_move:
self.player2.center_y = touch.y
if touch.y < self.height / 3 and touch.x > self.width / 6 \
and touch.x < 5 * self.width / 6 and self.player3.can_move:
self.player3.center_x = touch.x
if touch.y > 2* self.height / 3 and touch.x > self.width / 6 \
and touch.x < 5 * self.width / 6 and self.player4.can_move:
self.player4.center_x = touch.x
class PongApp(App):
def build(self):
game = PongGame()
game.initialize()
game.serve_ball()
Clock.schedule_interval(game.update, 1.0 / 60.0)
return game
if __name__ == '__main__':
PongApp().run()
和 .kv 文件:
#:kivy 1.0.9
<PongBall>:
size: 50, 50
canvas:
Ellipse:
pos: self.pos
size: self.size
<PongPaddle>:
size: root.orientation[0], root.orientation[1]
canvas:
Rectangle:
pos:self.pos
size:self.size
<PongGame>:
ball: pong_ball
player1: player_left
player2: player_right
player3: player_top
player4: player_bottom
Label:
font_size: 50
center_x: root.width / 6
top: root.top - root.height / 2 + 50
text: str(root.player1.score)
Label:
font_size: 50
center_x: root.width * 5 / 6
top: root.top - root.height / 2 + 50
text: str(root.player2.score)
Label:
font_size: 50
center_x: root.width / 2
top: root.height / 6
text: str(root.player3.score)
Label:
font_size: 50
center_x: root.width / 2
top: 5 * root.height / 6
text: str(root.player4.score)
PongBall:
id: pong_ball
center: self.parent.center
PongPaddle:
id: player_left
x: root.x
center_y: root.center_y
PongPaddle:
id: player_right
x: root.width-self.width
center_y: root.center_y
PongPaddle:
id: player_top
y: root.y
center_x: root.center_x
PongPaddle:
id: player_bottom
y: root.height - self.height
center_x: root.center_x
最佳答案
Label
正在被删除,问题是您正在添加无限数量的标签 :) 因为这里计划每 1/60 秒调用一次更新方法:
Clock.schedule_interval(game.update, 1.0 / 60.0)
如果您的计算机不会死机,您需要在添加小部件之前取消计划:
Clock.unschedule(self.update)
下面的代码有效。我想建议不要使用全局变量(这只是一种非常糟糕的做法)。我也修改了那个。在这种情况下,您甚至不需要类属性,因为参数 instance
包含与 self.win_label
完全相同的参数。此外,我更改了居中方式 (self.win_label.center = self.center
)。最后,使用 [Button][1]
而不是 Label
会更容易,因为您可以绑定(bind)其他方法,例如 on_press
或 on_release
。实际上,您不需要为此使用 ref
。您可以简单地绑定(bind) on_touch_down
。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import NumericProperty, ReferenceListProperty,\
ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint
class PongPaddle(Widget):
score = NumericProperty(0)
orientation = ObjectProperty([0, 0])
can_move = ObjectProperty(0)
def bounce_ball(self, ball):
if self.collide_widget(ball):
vx, vy = ball.velocity
if self.orientation[0] == 25:
offset = (ball.center_y - self.center_y) / (self.height / 2)
bounced = Vector(-1 * vx, vy)
vel = bounced * 1.1
ball.velocity = vel.x, vel.y + offset
else:
offset = (ball.center_x - self.center_x) / (self.width / 2)
bounced = Vector(vx, -1 * vy)
vel = bounced * 1.1
ball.velocity = vel.x + offset, vel.y
class PongBall(Widget):
velocity_x = NumericProperty(0)
velocity_y = NumericProperty(0)
velocity = ReferenceListProperty(velocity_x, velocity_y)
def move(self):
self.pos = Vector(*self.velocity) + self.pos
class PongGame(Widget):
ball = ObjectProperty(None)
player1 = ObjectProperty(None)
player2 = ObjectProperty(None)
player3 = ObjectProperty(None)
player4 = ObjectProperty(None)
def initialize(self):
SCORE = 1
self.player1.orientation = [25, 200]
self.player2.orientation = [25, 200]
self.player3.orientation = [200, 25]
self.player4.orientation = [200, 25]
self.player1.score = SCORE
self.player2.score = SCORE
self.player3.score = SCORE
self.player4.score = SCORE
self.player1.can_move = 1
self.player2.can_move = 1
self.player3.can_move = 1
self.player4.can_move = 1
self.serve_ball()
def serve_ball(self, vel=(4, 0)):
self.ball.center = self.center
self.ball.velocity = vel
def update(self, dt):
self.ball.move()
#bounce of paddles
self.player1.bounce_ball(self.ball)
self.player2.bounce_ball(self.ball)
self.player3.bounce_ball(self.ball)
self.player4.bounce_ball(self.ball)
#bounce ball off bottom or top
if ((self.ball.y < self.y) and not self.player3.can_move) \
or ((self.ball.top > self.top) and not self.player4.can_move):
self.ball.velocity_y *= -1
if ((self.ball.x < self.x) and not self.player1.can_move) \
or ((self.ball.right > self.width) and not self.player2.can_move):
self.ball.velocity_x *= -1
#went off to a side to score point?
if self.ball.x < self.x and self.player1.can_move == 1:
self.player1.score -= 1
self.serve_ball(vel=(4, randint(1, 4)))
if self.player1.score <= 0:
self.player1.can_move = 0
elif self.ball.x > self.width and self.player2.can_move == 1:
self.player2.score -= 1
self.serve_ball(vel=(-4, randint(1, 4)))
if self.player2.score <= 0:
self.player2.can_move = 0
elif self.ball.y > self.height and self.player4.can_move == 1:
self.player4.score -= 1
self.serve_ball(vel = (randint(1, 4), -4))
if self.player4.score <= 0:
self.player4.can_move = 0
elif self.ball.y < self.y and self.player3.can_move == 1:
self.player3.score -= 1
self.serve_ball(vel = (randint(1, 4), 4))
if self.player3.score <= 0:
self.player3.can_move = 0
if self.player1.can_move + self.player2.can_move + \
self.player3.can_move + self.player4.can_move == 1:
self.ball.velocity = (0, 0)
Clock.unschedule(self.update)
self.win_label = Label(size_hint=(None, None),
text='[ref=winner]Winner![/ref]',
markup=True, font_size=70, color=[1,0,0,1])
#win_label.texture_update()
#self.win_label.pos = (self.width / 2, self.height / 2 - 70)
self.win_label.center = self.center
## win_label.size = win_label.texture_size[0] + 20, \
## win_label.texture_size[1] + 20
self.win_label.bind(on_ref_press=self.click_win_label)
self.win_label.texture_update()
self.add_widget(self.win_label)
def click_win_label(self, instance, value):
self.remove_widget(self.win_label)
#self.remove_widget(instance) # this should also work:
self.initialize()
Clock.schedule_interval(self.update, 1.0 / 60.0)
def on_touch_move(self, touch):
if touch.x < self.width / 3 and touch.y > self.height / 6 \
and touch.y < 5 * self.height / 6 and self.player1.can_move:
self.player1.center_y = touch.y
if touch.x > self.width - self.width / 3 and touch.y > self.height / 6 \
and touch.y < 5 * self.height / 6 and self.player2.can_move:
self.player2.center_y = touch.y
if touch.y < self.height / 3 and touch.x > self.width / 6 \
and touch.x < 5 * self.width / 6 and self.player3.can_move:
self.player3.center_x = touch.x
if touch.y > 2* self.height / 3 and touch.x > self.width / 6 \
and touch.x < 5 * self.width / 6 and self.player4.can_move:
self.player4.center_x = touch.x
class PongApp(App):
def build(self):
game = PongGame()
game.initialize()
#game.serve_ball()
Clock.schedule_interval(game.update, 1.0 / 60.0)
return game
if __name__ == '__main__':
PongApp().run()
关于python - Kivy - 添加和删除标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17984856/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!