- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
乒乓 Racket 移动得如此之快,以至于在检测到碰撞之前,球在 Racket 内盘旋。问题是用户输入将桨移动了一个像素,所以我不知道如何减慢速度。解决方法是什么?这是代码:
import pygame, sys, os
from pygame import*
from pygame.locals import*
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0, 128)
RED = (255,0,0)
os.environ["SDL_VIDEO_CENTERED"]="1"
displaysize=600
DISPLAYSURF = pygame.display.set_mode((displaysize,displaysize))
rectwidth = 50
rectheight= 50
rectposx =0
rectposy =0
class Player(object):
def __init__(self):
self.rect = pygame.rect.Rect((rectposx, rectposy, rectwidth, rectheight))
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_LEFT] and (player.rect.x>0):
self.rect.move_ip(-1, 0)
if key[pygame.K_RIGHT] and (player.rect.x<600-rectwidth):
self.rect.move_ip(1, 0)
if key[pygame.K_UP] and (player.rect.y>0):
self.rect.move_ip(0, -1)
if key[pygame.K_DOWN] and (player.rect.y<600-rectheight):
self.rect.move_ip(0, 1)
def draw(self, DISPLAYSURF):
pygame.draw.rect(DISPLAYSURF, BLUE, self.rect)
def postext(self):
pygame.image.load(self.rect).convert_alpha()
pygame.init()
player =Player()
pygame.display.set_caption('Hello World!')
clock=pygame.time.Clock()
fontObj = pygame.font.Font(None,32)
textSurfaceObj = fontObj.render('Hello World!', True, GREEN, BLUE)
#textPosition =
dt=0.1
v = pygame.math.Vector2(5,5)
ballposx=200
ballposy=200
ballrad=10
#DISPLAYSURF.fill(WHITE)
#x=10
#y=10
#dx=5
#rectpos = pygame.Rect(x,y,50,50)
#rect = pygame.draw.rect(DISPLAYSURF, BLUE, rectpos)
pygame.display.update()
running = True
n=0
while running:
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
running = False
if event.type==QUIT:
pygame.quit()
sys.exit
player.handle_keys()
ballposx=ballposx+v[0]*dt
ballposy=ballposy+v[1]*dt
DISPLAYSURF.fill(WHITE)
DISPLAYSURF.blit(textSurfaceObj,(0,0))
player.draw(DISPLAYSURF)
ball=pygame.draw.circle(DISPLAYSURF, GREEN, (int(ballposx),int(ballposy)), ballrad)
rectposx1=player.rect.x
rectposy1=player.rect.y
rectvelx=-(rectposx-rectposx1)/dt
rectvely=-(rectposy-rectposy1)/dt
if ballposx-ballrad<0:
v[0]=-v[0]
if ballposy-ballrad<0:
v[1]=-v[1]
if ballposx+ballrad>600:
v[0]=-v[0]
if ballposy+ballrad>600:
v[1]=-v[1]
if player.rect.colliderect(ball):
pygame.math.Vector2.reflect_ip(v,-v+5*pygame.math.Vector2(rectvelx,rectvely))
#print (player.rect.x, rectposy, ball.x, ball.y)
ballmass=1
rectmass=5
rectposx=rectposx1
rectposy=rectposy1
print (v)
#raise SystemExit("You win!")
pygame.display.update()
clock.tick(120)
最佳答案
有两种策略可以使它无效。
移动球的方式,一旦检测到碰撞,球就会接触到球员但不会与球员相交。例如:
dx = ballposx - player.rect.centerx
dy = ballposy - player.rect.centery
if abs(dx) > abs(dy):
ballposx = player.rect.left-ballrad if dx < 0 else player.rect.right+ballrad
else:
ballposy = player.rect.top-ballrad if dy < 0 else player.rect.bottom+ballrad
仅当球的运动矢量指向“反对”球的方向时才反射(reflect)球的运动。例如:
if abs(dx) > abs(dy):
if (dx < 0 and v[0] > 0) or (dx > 0 and v[0] < 0):
v.reflect_ip(pygame.math.Vector2(1, 0))
else:
if (dy < 0 and v[1] > 0) or (dy > 0 and v[1] < 0):
v.reflect_ip(pygame.math.Vector2(0, 1))
另见 Sometimes the ball doesn't bounce off the paddle in pong game
将这 2 个修复应用到您的代码中,球将正确反射(reflect)在玩家身上。例如:
ball = pygame.Rect((0,0), (ballrad*2, ballrad*2))
ball.center = int(ballposx),int(ballposy)
if player.rect.colliderect(ball):
dx = ballposx - player.rect.centerx
dy = ballposy - player.rect.centery
if abs(dx) > abs(dy):
ballposx = player.rect.left-ballrad if dx < 0 else player.rect.right+ballrad
if (dx < 0 and v[0] > 0) or (dx > 0 and v[0] < 0):
v.reflect_ip(pygame.math.Vector2(1, 0))
else:
ballposy = player.rect.top-ballrad if dy < 0 else player.rect.bottom+ballrad
if (dy < 0 and v[1] > 0) or (dy > 0 and v[1] < 0):
v.reflect_ip(pygame.math.Vector2(0, 1))
如果你想避免玩家将球推出窗外,你需要将球限制在窗口区域并像台球一样将球从窗口边缘反射出去:
min_x, min_y, max_x, max_y = 0, 0, window.get_width(), window.get_height()
ballposx = ballposx + v[0]*dt
ballposy = ballposy + v[1]*dt
if ballposx-ballrad < min_x:
ballposx = ballrad+min_x
v[0]=-v[0]
if ballposy-ballrad < min_y:
ballposy = ballrad+min_y
v[1]=-v[1]
if ballposx + ballrad > max_x:
ballposx = max_x-ballrad
v[0]=-v[0]
if ballposy + ballrad > max_y:
ballposy = max_y-ballrad
v[1]=-v[1]
另见 Use vector2 in pygame. Collide with the window frame and restrict the ball to the rectangular area分别How to make ball bounce off wall with Pygame? .
当检测到碰撞时,球员的位置必须受到限制,以便球可以发生在寡妇边界和球员之间:
if abs(dx) > abs(dy):
if dx < 0:
ballposx = max(player.rect.left-ballrad, ballrad+min_x)
player.rect.left = int(ballposx)+ballrad
else:
ballposx = min(player.rect.right+ballrad, max_x-ballrad)
player.rect.right = int(ballposx)-ballrad
有了这些变化,球甚至可以被“挤压”在窗口边缘和球员之间:
最小的例子:
import pygame
class Player(object):
def __init__(self, x, y, w, h):
self.rect = pygame.rect.Rect(x, y, w, h)
def handle_keys(self):
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.rect.left = max(20, self.rect.left - 1)
if key[pygame.K_RIGHT]:
self.rect.right = min(window.get_height() - 20, self.rect.right + 1)
if key[pygame.K_UP]:
self.rect.top = max(20, self.rect.top - 1)
if key[pygame.K_DOWN]:
self.rect.bottom = min(window.get_width() - 20, self.rect.bottom + 1)
def draw(self, surface):
pygame.draw.rect(surface, (0, 0, 128), self.rect)
pygame.init()
window = pygame.display.set_mode((240, 240))
clock=pygame.time.Clock()
player = Player(20, 20, 50, 50)
v, vel = pygame.math.Vector2(1, 1), 0.5
ballPosX, ballPosY, ballRadius = 120, 120, 10
run = True
while run:
clock.tick(120)
for event in pygame.event.get():
if event.type==pygame.QUIT:
run = False
player.handle_keys()
min_x, min_y, max_x, max_y = 20, 20, window.get_width()-20, window.get_height()-20
ballPosX += v[0] * vel
ballPosY += v[1] * vel
if ballPosX - ballRadius < min_x:
ballPosX = ballRadius + min_x
v[0] = -v[0]
if ballPosY - ballRadius < min_y:
ballPosY = ballRadius + min_y
v[1] = -v[1]
if ballPosX + ballRadius > max_x:
ballPosX = max_x - ballRadius
v[0] = -v[0]
if ballPosY + ballRadius > max_y:
ballPosY = max_y - ballRadius
v[1] = -v[1]
ball = pygame.Rect((0,0), (ballRadius*2, ballRadius*2))
ball.center = int(ballPosX),int(ballPosY)
if player.rect.colliderect(ball):
dx = ballPosX - player.rect.centerx
dy = ballPosY - player.rect.centery
if abs(dx) > abs(dy):
if dx < 0:
ballPosX = max(player.rect.left-ballRadius, ballRadius+min_x)
player.rect.left = int(ballPosX)+ballRadius
else:
ballPosX = min(player.rect.right+ballRadius, max_x-ballRadius)
player.rect.right = int(ballPosX)-ballRadius
if (dx < 0 and v[0] > 0) or (dx > 0 and v[0] < 0):
v.reflect_ip(pygame.math.Vector2(1, 0))
else:
if dy < 0:
ballPosY = max(player.rect.top-ballRadius, ballRadius+min_y)
player.rect.top = int(ballPosY)+ballRadius
else:
ballPosY = min(player.rect.bottom+ballRadius, max_y-ballRadius)
player.rect.bottom = int(ballPosY)-ballRadius
ballPosY = player.rect.top-ballRadius if dy < 0 else player.rect.bottom+ballRadius
if (dy < 0 and v[1] > 0) or (dy > 0 and v[1] < 0):
v.reflect_ip(pygame.math.Vector2(0, 1))
window.fill((255, 255, 255))
pygame.draw.rect(window, (255,0,0), (18, 18, 203, 203), 2)
player.draw(window)
pygame.draw.circle(window, (0, 255, 0), (round(ballPosX), round(ballPosY)), ballRadius)
pygame.display.update()
pygame.quit()
exit()
关于python - 如何避免 PyGame 中圆形和矩形之间的小故障碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58139771/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!