Pygame鼠标/键盘控制条件
我有两个矩形(条纹)我想单击条纹上下移动鼠标,然后使用K_UP和K_DOWN键移动相同的条纹。随着我写的代码,我可以用鼠标移动条纹,但键同时移动两个条纹,而不是单独移动。我只有一周编码器,请帮忙!Pygame鼠标/键盘控制条件
import pygame
import pygame.gfxdraw
pygame.init()
width, height = 800, 600
gameWindow = pygame.display.set_mode((width, height))
pygame.display.set_caption("Koordynacja LoL")
clock = pygame.time.Clock()
# Colors
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
green = (0, 102, 0)
yellow = (255, 204, 0)
grid_color = (224, 224, 224)
k = 5
class Stripe():
def __init__(self, color, size, pos_x, pos_y):
self.size = size
self.image = pygame.Surface(size)
self.image.fill(color)
self.rect = self.image.get_rect()
self.pos_x = pos_x
self.pos_y = pos_y
self.rect.x = pos_x
self.rect.y = pos_y
self.speed = 5
def move(self, xdir, ydir):
self.rect.x += xdir * self.speed
self.rect.y += ydir * self.speed
P1_len = 250
stripe1 = Stripe(green, (15, P1_len), 100, 200)
stripe_1a = Stripe(0, (15, 1000), 100, 0)
stripe_1aa = gameWindow.blit(stripe_1a.image, stripe_1a.rect)
P2_len = 110
stripe2 = Stripe(red, (15, P2_len), 200, 100)
stripe_2a = Stripe(0, (15, 1000), 200, 0)
stripe_2aa = gameWindow.blit(stripe_2a.image, stripe_2a.rect)
zielone2 = gameWindow.blit(stripe2.image, stripe2.rect)
pygame.display.update()
FPS = 15
Running = True
stripe_move = None
while Running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
Running = False
(mouseX, mouseY) = pygame.mouse.get_pos()
(p1, p2, p3) = pygame.mouse.get_pressed()
if stripe_1aa.collidepoint(mouseX, mouseY) and p1 == 1:
stripe1 = Stripe(green, (15, 250), 100, mouseY-P1_len)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
stripe1.move(0, 1)
print("lol")
if event.key == pygame.K_UP:
stripe1.move(0, -1)
elif stripe_2aa.collidepoint(mouseX, mouseY) and p1 == 1:
stripe2 = Stripe(red, (15, 110), 200, mouseY - P2_len)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
stripe2.move(0, 1)
if event.key == pygame.K_UP:
stripe2.move(0, -1)
print("wut?")
elif event.type == pygame.MOUSEBUTTONUP:
stripe_move = None
gameWindow.fill((255, 255, 255))
# Draw stuff here
""" Greedy Grid """
for i in range(width):
grid_x = k * i
grid_y = k * i
pygame.draw.line(gameWindow, grid_color, (grid_x, 0), (grid_x, height), 1)
pygame.draw.line(gameWindow, grid_color, (0, grid_y), (width, grid_y), 1)
pygame.draw.line(gameWindow, black, (2 * k, height - 2 * k), (width - 2 * k, height - 2 * k), 3)
pygame.draw.line(gameWindow, black, (2 * k, height - 2 * k), (2 * k, 2 * k), 3)
pygame.draw.aaline(gameWindow, black, (2 * k, 2 * k), (width - 2 * k, 2 * k), 3)
pygame.draw.aaline(gameWindow, blue, (200, 115), (500, 70), True)
gameWindow.blit(stripe1.image, stripe1.rect)
gameWindow.blit(stripe2.image, stripe2.rect)
# End draw stuff here
pygame.display.update()
clock.tick(FPS)
pygame.quit()
quit()
enter code here
如下我构造的代码:如果点击鼠标和event.pos
碰撞的条纹,该条纹分配给一个变量(selected_stripe
),并且如果用户点击别处设置为None
。只要鼠标按钮关闭,也可将scrolling
变量设置为True
。在事件循环之外,您可以将选定条带的y位置设置为鼠标pos。对于向上和向下键,您可以使用所选条带的move
方法。
selected_stripe = None
scrolling = True
while Running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
Running = False
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
scrolling = True
if stripe_1aa.collidepoint(event.pos):
selected_stripe = stripe1
elif stripe_2aa.collidepoint(event.pos):
selected_stripe = stripe2
else:
selected_stripe = None
elif event.type == pygame.MOUSEBUTTONUP:
scrolling = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
if selected_stripe:
selected_stripe.move(0, 1)
if event.key == pygame.K_UP:
if selected_stripe:
selected_stripe.move(0, -1)
if selected_stripe and scrolling:
mouse_x, mouse_y = pygame.mouse.get_pos()
selected_stripe.rect.y = mouse_y
如果您有后续问题或需要进行调整,请告诉我。 – skrx
您的解决方案完美无缺!非常感谢你教我这种方法,你摇滚!我有很多关于这个项目的问题(比如如何将条纹运动捕捉到网格中),但是我当然会尝试使用这个论坛作为我的最后手段。 – Bartnick81
嗨,是否有可能添加到变量selected_stripe另一个矩形对象作为stripe1但具有不同的y_pos和颜色,将随着条纹1(唯一)一起移动。我试过了,但它不起作用。 – Bartnick81
欢迎来到SO!更好地发布[完整示例](http://stackoverflow.com/help/mcve),因为这会让我们更容易帮助您。 – skrx
我发布了整个代码 – Bartnick81
感谢您的编辑。 – skrx