Python pygame.display.update() 时钟滴答(60) pygame.quit()
问题是您正在设置Python pygame.display.update() 时钟滴答(60) pygame.quit(),python,python-3.x,pygame,Python,Python 3.x,Pygame,问题是您正在设置ball\u x和ball\u y,但这些位置没有绘制球。球实际上是在被称为ball\u pos的向量中的坐标处绘制的 要解决此问题: 正如您可能猜到的,有一个非常简单的解决方案:只需重置球位置即可 另外,我重置了向量球的水平,这样球在再次移动到中心后不会移动 您可能还需要添加重置汽车位置的代码。此外,只有在有“红色球门”的情况下,球才会重置 以下是固定代码: import pygame import pygame as pg from pygame.math import Ve
ball\u x
和ball\u y
,但这些位置没有绘制球。球实际上是在被称为ball\u pos
的向量中的坐标处绘制的
要解决此问题:
球的水平,这样球在再次移动到中心后不会移动
import pygame
import pygame as pg
from pygame.math import Vector2
pygame.init()
WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
# Images.
bgImg = pygame.image.load("Football_pitch.png")
REDGOAL = pg.Surface((50, 150), pg.SRCALPHA)
REDGOAL.fill((255, 0, 0))
redgoal_rect = REDGOAL.get_rect(topleft=(0, 340))
redgoal_mask = pg.mask.from_surface(REDGOAL)
BLUEGOAL = pg.Surface((50, 150), pg.SRCALPHA)
BLUEGOAL.fill((0, 0, 255))
bluegoal_rect = REDGOAL.get_rect(topleft=(1100, 340))
bluegoal_mask = pg.mask.from_surface(REDGOAL)
BLUECAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
BLUECAR_ORIGINAL, (0, 0, 255), [(0, 30), (50, 20), (50,10), (0, 0)])
bluecar = BLUECAR_ORIGINAL
REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
REDCAR_ORIGINAL, (255, 0, 0), [(0, 0), (50, 10), (50, 20), (0, 30)])
redcar = REDCAR_ORIGINAL
score = 0
redspeed = 7
bluespeed = 7
ball_x = 575
ball_y = 400
dx = 0
dy = 0
x = 800
y = 500
BALL = pygame.Surface((30, 30), pygame.SRCALPHA)
pygame.draw.circle(BALL, [0,0,0], [15, 15], 15)
# Ball variables.
ball_pos = Vector2(ball_x, ball_y)
ballrect = BALL.get_rect(center=ball_pos)
ball_vel = Vector2(dx, dy)
ball_mask = pg.mask.from_surface(BALL)
# Car variables.
pos_red = Vector2(x,y)
vel_red = Vector2(redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
pos_blue = Vector2(275,300)
vel_blue = Vector2(bluespeed,0)
bluerect = bluecar.get_rect(center=pos_red)
blueangle = 0
# Masks.
mask_blue = pygame.mask.from_surface(bluecar)
mask_red = pygame.mask.from_surface(redcar)
mask_ball = pygame.mask.from_surface(BALL)
ballrect = BALL.get_rect(center=ball_pos)
vel_red.rotate_ip(-180)
def redgoal():
print("Red Goal!!!")
ball_vel.x = 0
ball_vel.y = 0
ball_pos.x = 575
ball_pos.y = 400
def bluegoal():
print("Blue Goal!!!")
boostedspeedred = 10
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if y <0:
y = 10
if y > 450:
y = 440
if x > 480:
x = 470
if ballrect.top < 0 and ball_vel.y < 0:
ball_vel.y *= -1
elif ballrect.bottom > screen.get_height() and ball_vel.y > 0:
ball_vel.y *= -1
if ballrect.left < 0 and ball_vel.x < 0:
ball_vel.x *= -1
elif ballrect.right > screen.get_width() and ball_vel.x > 0:
ball_vel.x *= -1
if redrect.top < 0 and redrect.y < 0:
redrect.y *= +10
elif redrect.bottom > screen.get_height() and redrect.y > 0:
redrect.y *= -10
if redrect.left < 0 and redrect.x < 0:
redrect.x *= -10
elif redrect.right > screen.get_width() and redrect.x > 0:
redrect.x *= -10
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
redangle += 5
vel_red.rotate_ip(-5)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
# We need a new mask after the rotation.
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
redangle -= 5
vel_red.rotate_ip(5)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_UP]:
redspeed == 10
if keys[pygame.K_a]:
blueangle += 5
vel_blue.rotate_ip(-5)
bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
bluerect = bluecar.get_rect(center=bluerect.center)
mask_blue = pygame.mask.from_surface(bluecar)
elif keys[pygame.K_d]:
blueangle -= 5
vel_blue.rotate_ip(5)
bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
bluerect = bluecar.get_rect(center=bluerect.center)
mask_blue = pygame.mask.from_surface(bluecar)
# Move the cars.
pos_red += vel_red
redrect.center = pos_red
pos_blue += vel_blue
bluerect.center = pos_blue
# Move the ball.
ball_vel *= .99 # Friction.
ball_pos += ball_vel
ballrect.center = ball_pos
# Red car collision.
# We need the offset between the redrect and the ballrect.
offset_red = redrect[0] - ballrect[0], redrect[1] - ballrect[1]
# Pass the offset to the `overlap` method. If the masks collide,
# overlap will return a single point, otherwise `None`.
overlap_red = mask_ball.overlap(mask_red, offset_red)
# Blue car collision.
offset_blue = bluerect[0] - ballrect[0], bluerect[1] - ballrect[1]
overlap_blue = mask_ball.overlap(mask_blue, offset_blue)
offset = redgoal_rect[0] - ballrect[0], redgoal_rect[1] - ballrect[1]
redgoaloverlap = ball_mask.overlap(redgoal_mask, offset)
offset = bluegoal_rect[0] - ballrect[0], bluegoal_rect[1] - ballrect[1]
bluegoaloverlap = ball_mask.overlap(bluegoal_mask, offset)
if redgoaloverlap:
redgoal()
if bluegoaloverlap:
bluegoal()
if overlap_red and overlap_blue: # Both collide with the ball.
# Not sure what should happen here.
ball_vel = vel_red + vel_blue * 1.4
elif overlap_red: # Red collides with the ball.
ball_vel = Vector2(vel_red) * 1.4
elif overlap_blue: # Blue collides with the ball.
ball_vel = Vector2(vel_blue) * 1.4
# Drawing.
screen.blit(bgImg, (0, 0))
screen.blit(BALL, ballrect)
screen.blit(redcar, redrect)
screen.blit(bluecar, bluerect)
screen.blit(REDGOAL, redgoal_rect)
screen.blit(BLUEGOAL, bluegoal_rect)
pygame.display.flip()
pygame.display.update()
clock.tick(60)
pygame.quit()
导入pygame
导入pygame作为pg
从pygame.math导入向量2
pygame.init()
宽度=1150
高度=800
screen=pygame.display.set_模式((宽度、高度))
clock=pygame.time.clock()
#图像。
bgImg=pygame.image.load(“Football\u pitch.png”)
REDGOAL=pg.Surface((50150),pg.SRCALPHA)
REDGOAL.fill((255,0,0))
redgoal_rect=redgoal.get_rect(左上方=(0340))
redgoal\u mask=从曲面(redgoal)开始的pg.mask
BLUEGOAL=pg.Surface((50150),pg.SRCALPHA)
BLUEGOAL.fill((0,0255))
bluegoal_rect=REDGOAL.get_rect(左上方=(1100340))
bluegoal_mask=从_表面(REDGOAL)开始的pg.mask
BLUECAR_ORIGINAL=pygame.Surface((50,30),pygame.SRCALPHA)
pygame.draw.polygon(
蓝车原版,(0,0255),[(0,30),(50,20),(50,10),(0,0)])
bluecar=bluecar\u原件
REDCAR_ORIGINAL=pygame.Surface((50,30),pygame.SRCALPHA)
pygame.draw.polygon(
红车原版,(255,0,0),[(0,0),(50,10),(50,20),(0,30)])
redcar=redcar\u原件
分数=0
redspeed=7
蓝速=7
球x=575
球y=400
dx=0
dy=0
x=800
y=500
BALL=pygame.Surface((30,30),pygame.SRCALPHA)
pygame.draw.circle(球[0,0,0],[15,15],15)
#球变量。
球位置=矢量2(球x,球y)
ballrect=球。get_rect(中心=球位置)
球水平=矢量2(dx,dy)
ball_mask=pg.mask.自_表面(ball)
#汽车变量。
位置红色=矢量2(x,y)
vel_red=矢量2(红色速度,0)
redrect=redcar.get_rect(中心=pos_red)
红色角度=180
位置蓝色=矢量2(275300)
蓝色水平=矢量2(蓝色速度,0)
bluerect=bluecar.get_rect(中心=位置红色)
蓝角=0
#面具。
mask_blue=pygame.mask.from_曲面(bluecar)
mask_red=pygame.mask.from_surface(redcar)
mask_ball=pygame.mask.from_曲面(球)
ballrect=球。get_rect(中心=球位置)
红色水平。旋转ip(-180)
def redgoal():
打印(“红色目标!!!”)
球体x级=0
滚珠y级=0
球头位置x=575
球头位置y=400
def bluegoal():
打印(“蓝色目标!!!”)
boostedspeedred=10
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果y 450:
y=440
如果x>480:
x=470
如果ballrect.top<0且ball_.Level.y<0:
球级别y*=-1
elif ballrect.bottom>screen.get_height()和ball_vel.y>0:
球级别y*=-1
如果ballrect.left<0且ball_.x<0:
球级别x*=-1
elif ballrect.right>screen.get_width()和ball_Level.x>0:
球级别x*=-1
如果redrect.top<0且redrect.y<0:
修正y*=+10
elif redrect.bottom>screen.get_height()和redrect.y>0:
redrect.y*=-10
如果redrect.left<0且redrect.x<0:
redrect.x*=-10
elif redrect.right>screen.get_width()和redrect.x>0:
redrect.x*=-10
keys=pygame.key.get_pressed()
如果键[pygame.K_左]:
红色角度+=5
红色水平。旋转ip(-5)
redcar=pygame.transform.rotate(redcar\u原始,redangle)
redrect=redcar.get_rect(center=redrect.center)
#旋转后我们需要一个新的面具。
mask_red=pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
红色角度-=5
红色水平。旋转ip(5)
redcar=pygame.transform.rotate(redcar\u原始,redangle)
redrect=redcar.get_rect(center=redrect.center)
mask_red=pygame.mask.from_surface(redcar)
elif keys[pygame.K_UP]:
redspeed==10
如果键[pygame.K_a]:
蓝角+=5
蓝色水平。旋转ip(-5)
bluecar=pygame.transform.rotate(bluecar_ORIGINAL,blueangle)
bluerect=bluecar.get_rect(中心=bluerect.center)
mask_blue=pygame.mask.from_曲面(bluecar)
elif keys[pygame.K_d]:
蓝角-=5
蓝色水平。旋转ip(5)
bluecar=pygame.transform.rotate(bluecar_ORIGINAL,blueangle)
bluerect=bluecar.get_rect(中心=bluerect.center)
mask_blue=pygame.mask.from_曲面(bluecar)
#把车开走。
位置红色+=水平红色
redrect.center=pos_red
位置蓝色+=水平蓝色
bluerect.center=位置为蓝色
#移动球。
球体水平*=0.99#摩擦力。
球位+=球位
ballrect.center=球位置
#红色汽车相撞。
#我们需要redrect和ballrect之间的偏移量。
偏移量\u red=redrect[0]-ballrect[0],redrect[1]-ballrect[1]
#将偏移量传递给“重叠”方法。如果面具相撞,
#重叠将返回单个点,否则为“无”。
重叠\红色=遮罩\球。重叠(遮罩\红色,偏移\红色)
#蓝色汽车相撞。
偏移量_blue=bluerect[0]-ballrect[0],bluerect[1]-ballrect[1]
重叠\蓝色=遮罩\球。重叠(遮罩\蓝色,偏移\蓝色)
偏移量=redgoal_-rect[0]-ballrect[0],redgoal_-rect[1]-ballrect[1]
RedGoalLoverLap=球\u遮罩。重叠(redgoal\u遮罩,偏移)
偏移量=bluegoal_-rect[0]-ballrect[0],bluegoal_-rect[1]-ballrect[1]
BlueGoalLoverLap=球罩。重叠(bluegoal罩,偏移)
如果红色GoalLoverLap:
redgoal()
如果BlueGoalLoverLap:
蓝目标()
如果重叠红色和重叠蓝色:#两者都与球碰撞。
#不知道这里会发生什么。
球形=红色+蓝色*1.4
elif重叠红色:#红色coll
import pygame
import pygame as pg
from pygame.math import Vector2
pygame.init()
WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
# Images.
bgImg = pygame.image.load("Football_pitch.png")
REDGOAL = pg.Surface((50, 150), pg.SRCALPHA)
REDGOAL.fill((255, 0, 0))
redgoal_rect = REDGOAL.get_rect(topleft=(0, 340))
redgoal_mask = pg.mask.from_surface(REDGOAL)
BLUEGOAL = pg.Surface((50, 150), pg.SRCALPHA)
BLUEGOAL.fill((0, 0, 255))
bluegoal_rect = REDGOAL.get_rect(topleft=(1100, 340))
bluegoal_mask = pg.mask.from_surface(REDGOAL)
BLUECAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
BLUECAR_ORIGINAL, (0, 0, 255), [(0, 30), (50, 20), (50,10), (0, 0)])
bluecar = BLUECAR_ORIGINAL
REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
REDCAR_ORIGINAL, (255, 0, 0), [(0, 0), (50, 10), (50, 20), (0, 30)])
redcar = REDCAR_ORIGINAL
score = 0
redspeed = 7
bluespeed = 7
ball_x = 575
ball_y = 400
dx = 0
dy = 0
x = 800
y = 500
BALL = pygame.Surface((30, 30), pygame.SRCALPHA)
pygame.draw.circle(BALL, [0,0,0], [15, 15], 15)
# Ball variables.
ball_pos = Vector2(ball_x, ball_y)
ballrect = BALL.get_rect(center=ball_pos)
ball_vel = Vector2(dx, dy)
ball_mask = pg.mask.from_surface(BALL)
# Car variables.
pos_red = Vector2(x,y)
vel_red = Vector2(redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
pos_blue = Vector2(275,300)
vel_blue = Vector2(bluespeed,0)
bluerect = bluecar.get_rect(center=pos_red)
blueangle = 0
# Masks.
mask_blue = pygame.mask.from_surface(bluecar)
mask_red = pygame.mask.from_surface(redcar)
mask_ball = pygame.mask.from_surface(BALL)
ballrect = BALL.get_rect(center=ball_pos)
vel_red.rotate_ip(-180)
def redgoal():
print("Red Goal!!!")
ball_vel.x = 0
ball_vel.y = 0
ball_pos.x = 575
ball_pos.y = 400
def bluegoal():
print("Blue Goal!!!")
boostedspeedred = 10
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if y <0:
y = 10
if y > 450:
y = 440
if x > 480:
x = 470
if ballrect.top < 0 and ball_vel.y < 0:
ball_vel.y *= -1
elif ballrect.bottom > screen.get_height() and ball_vel.y > 0:
ball_vel.y *= -1
if ballrect.left < 0 and ball_vel.x < 0:
ball_vel.x *= -1
elif ballrect.right > screen.get_width() and ball_vel.x > 0:
ball_vel.x *= -1
if redrect.top < 0 and redrect.y < 0:
redrect.y *= +10
elif redrect.bottom > screen.get_height() and redrect.y > 0:
redrect.y *= -10
if redrect.left < 0 and redrect.x < 0:
redrect.x *= -10
elif redrect.right > screen.get_width() and redrect.x > 0:
redrect.x *= -10
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
redangle += 5
vel_red.rotate_ip(-5)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
# We need a new mask after the rotation.
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
redangle -= 5
vel_red.rotate_ip(5)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_UP]:
redspeed == 10
if keys[pygame.K_a]:
blueangle += 5
vel_blue.rotate_ip(-5)
bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
bluerect = bluecar.get_rect(center=bluerect.center)
mask_blue = pygame.mask.from_surface(bluecar)
elif keys[pygame.K_d]:
blueangle -= 5
vel_blue.rotate_ip(5)
bluecar = pygame.transform.rotate(BLUECAR_ORIGINAL, blueangle)
bluerect = bluecar.get_rect(center=bluerect.center)
mask_blue = pygame.mask.from_surface(bluecar)
# Move the cars.
pos_red += vel_red
redrect.center = pos_red
pos_blue += vel_blue
bluerect.center = pos_blue
# Move the ball.
ball_vel *= .99 # Friction.
ball_pos += ball_vel
ballrect.center = ball_pos
# Red car collision.
# We need the offset between the redrect and the ballrect.
offset_red = redrect[0] - ballrect[0], redrect[1] - ballrect[1]
# Pass the offset to the `overlap` method. If the masks collide,
# overlap will return a single point, otherwise `None`.
overlap_red = mask_ball.overlap(mask_red, offset_red)
# Blue car collision.
offset_blue = bluerect[0] - ballrect[0], bluerect[1] - ballrect[1]
overlap_blue = mask_ball.overlap(mask_blue, offset_blue)
offset = redgoal_rect[0] - ballrect[0], redgoal_rect[1] - ballrect[1]
redgoaloverlap = ball_mask.overlap(redgoal_mask, offset)
offset = bluegoal_rect[0] - ballrect[0], bluegoal_rect[1] - ballrect[1]
bluegoaloverlap = ball_mask.overlap(bluegoal_mask, offset)
if redgoaloverlap:
redgoal()
if bluegoaloverlap:
bluegoal()
if overlap_red and overlap_blue: # Both collide with the ball.
# Not sure what should happen here.
ball_vel = vel_red + vel_blue * 1.4
elif overlap_red: # Red collides with the ball.
ball_vel = Vector2(vel_red) * 1.4
elif overlap_blue: # Blue collides with the ball.
ball_vel = Vector2(vel_blue) * 1.4
# Drawing.
screen.blit(bgImg, (0, 0))
screen.blit(BALL, ballrect)
screen.blit(redcar, redrect)
screen.blit(bluecar, bluerect)
screen.blit(REDGOAL, redgoal_rect)
screen.blit(BLUEGOAL, bluegoal_rect)
pygame.display.flip()
pygame.display.update()
clock.tick(60)
pygame.quit()