如何在班级中同时使一个类的多个实例移动

时间:2018-10-23 20:19:33

标签: python class pygame

import pygame, os, sys
from pygame import *

pygame.init()

RED = ( 255, 0, 0)

class WPawn():
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.image = pygame.transform.scale(pygame.image.load('wpawn.png'), (100,100))

        self.move_x = 0
        self.move_y = 0

    def event_handler(self):

        for event in pygame.event.get():
            if event.type == KEYDOWN:
               if event.key == K_UP:
                   self.move_y = -100
               if event.key == K_DOWN:
                   self.move_y = 100

            elif event.type == KEYUP:
                if event.key in (K_UP, K_DOWN):
                    self.move_y = 0


    def update(self, screen):
        self.y = self.y + self.move_y

    def draw(self, screen):
        screen.blit(self.image, (self.x, self.y))


class Game():
    def __init__(self):
        screen_width = 900
        screen_height = 900
        self.screen = pygame.display.set_mode((screen_width,screen_height))
        pygame.display.set_caption ("Chess Project")        

        self.pawn1 = WPawn(50,650)
        self.pawn2 = WPawn(150,650)
        self.pawn3 = WPawn(250,650)
        self.pawn4 = WPawn(350,650)
        self.pawn5 = WPawn(450,650)
        self.pawn6 = WPawn(550,650)
        self.pawn7 = WPawn(650,650)
        self.pawn8 = WPawn(750,650)    

    def play(self):
        clock = pygame.time.Clock()


        RUNNING = True
        while RUNNING:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    RUNNING = False

            clock.tick(30)

            self.pawn1.event_handler()
            self.pawn2.event_handler()
            self.pawn3.event_handler()
            self.pawn4.event_handler()
            self.pawn5.event_handler()
            self.pawn6.event_handler()
            self.pawn7.event_handler()
            self.pawn8.event_handler()

            self.pawn1.update(self.screen)
            self.pawn2.update(self.screen)
            self.pawn3.update(self.screen)
            self.pawn4.update(self.screen)
            self.pawn5.update(self.screen)
            self.pawn6.update(self.screen)
            self.pawn7.update(self.screen)
            self.pawn8.update(self.screen)

            self.screen.fill(RED)

            self.pawn1.draw(self.screen)
            self.pawn2.draw(self.screen)
            self.pawn3.draw(self.screen)
            self.pawn4.draw(self.screen)
            self.pawn5.draw(self.screen)
            self.pawn6.draw(self.screen)
            self.pawn7.draw(self.screen)
            self.pawn8.draw(self.screen)

            pygame.display.update()

Game().play()
pygame.quit()

1 个答案:

答案 0 :(得分:0)

在处理KEY_UP事件(或其他事件)时会使用它。因此,无论哪个WPawn类首先获得事件,都会移动。

通常,事件驱动程序只有一个 事件循环。

通过在游戏对象之外进行事件处理来使这项工作更容易。让单个事件循环句柄记录按键,然后移动希望移动的每个WPawn

也许是这样的:

event = pygame.event.get()
if event.type == K_DOWN:
    foreach pawn in all_pawns:
        pawn.moveDown()
elif event.type == K_UP:
    foreach pawn in all_pawns:
        pawn.moveUp()