2017-05-03 103 views
2

我有两个矩形(条纹)我想单击条纹上下移动鼠标,然后使用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 
+0

欢迎来到SO!更好地发布[完整示例](http://stackoverflow.com/help/mcve),因为这会让我们更容易帮助您。 – skrx

+0

我发布了整个代码 – Bartnick81

+0

感谢您的编辑。 – skrx

回答

1

如下我构造的代码:如果点击鼠标和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 
+1

如果您有后续问题或需要进行调整,请告诉我。 – skrx

+1

您的解决方案完美无缺!非常感谢你教我这种方法,你摇滚!我有很多关于这个项目的问题(比如如何将条纹运动捕捉到网格中),但是我当然会尝试使用这个论坛作为我的最后手段。 – Bartnick81

+0

嗨,是否有可能添加到变量selected_stripe另一个矩形对象作为stripe1但具有不同的y_pos和颜色,将随着条纹1(唯一)一起移动。我试过了,但它不起作用。 – Bartnick81