坚持精灵运动

时间:2017-12-12 20:15:27

标签: python pygame

最近我一直在做一个我的小项目。 我有一个背景,我在其中产生了很多汽车。 我想让这些车沿着我定义自己的路径移动。当我打电话给我的移动方法时,我已经达到了我的一辆车移动到(0,0)位置的程度,而且,我不确定如何在路径上有一个平滑的动画,我不希望汽车突然出现在最后一个航路点立即定义。

这是我的代码:

import assets
import pygame

##this class spawns
class bus(pygame.sprite.Sprite):
    def __init__(self):
        super(bus,self).__init__()
        self.image = pygame.Surface((assets.bus_width,assets.bus_height))
        self.rect = self.image.get_rect()
    def set_position(self,x,y):
        self.rect.x = x
        self.rect.y = y
    def set_image(self, filename = None):
        if filename != None:
            self.image = pygame.image.load(filename).convert()
            self.rect = self.image.get_rect()
    def rotate(self,angle):
        self.image = pygame.transform.rotate(self.image,angle)
        self.rect = self.image.get_rect()

class car(pygame.sprite.Sprite):
    def __init__(self):
        super(car,self).__init__()
        self.image = pygame.Surface((assets.car_width,assets.car_height))
        self.rect = self.image.get_rect()
        self.speed = 2
    def set_position(self,x,y):
        self.rect.x = x
        self.rect.y = y
    def get_x_position(self):
        return self.rect.x
    def get_y_position(self):
        return self.rect.y
    def set_image(self, filename = None):
        if filename != None:
            self.image = pygame.image.load(filename).convert()
            self.rect = self.image.get_rect()
    def rotate(self,angle):
        self.image = pygame.transform.rotate(self.image,angle)
        self.rect = self.image.get_rect()
    #not sure what to do here
    def move_position(self,x,y):
        self.rect.x +=
        self.rect.y +=
        self.rect = self.image.get_rect()

class WayPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def getX(self):
        return self.x
    def getY(self):
        return self.y

class WayPointsList:
    def __init__(self):
        self.wayPoints = []
    def add_wayPoint(self, x, y):
        self.wayPoints.append(WayPoint(x,y))
    def __len__(self):
        return len(self.wayPoints)
    def get_wayPoint(self, i):
        return [self.wayPoints[i].getX(), self.wayPoints[i].getY()]



if __name__ == '__main__':
    pygame.init()
    window_size = window_width, window_height = assets.screen_width, assets.screen_height
    window = pygame.display.set_mode(window_size, pygame.RESIZABLE)

    pygame.display.set_caption(assets.caption)

    window.fill(assets.white)
    clock = pygame.time.Clock()
    car_group = pygame.sprite.Group()
    #mainloop
    running = True
    while running:
        #loading background
        bkg = pygame.image.load(assets.background)
        #event handling
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    car110 = car()
                    car110.set_image(assets.furore)
                    car110.rotate(180)
                    car110.set_position(0,273)
                    car_group.add(car110)
                elif event.key == pygame.K_2:
                    car109 = car()
                    car109.set_image(assets.hachura)
                    car109.rotate(180)
                    car109.set_position(0,306)
                    car_group.add(car109)
                    #i want to move this car along some waypoints I've defined in my head
                    #like so:
                    #lane = WayPointsList()
                    #lane.add_wayPoint(50, 250)
                    #lane.add_wayPoint(250, 350)
                    #after this i want to move my image along these waypoints I've defined
                elif event.key == pygame.K_3:
                    car108=car()
                    car108.set_image(assets.jefferson)
                    car108.rotate(180)
                    car108.set_position(0,343)
                    car_group.add(car108)
                elif event.key == pygame.K_4:
                    car107=car()
                    car107.set_image(assets.michelli)
                    car107.rotate(270)
                    car107.set_position(410,550)
                    car_group.add(car107)
                elif event.key == pygame.K_5:
                    car106=car()
                    car106.set_image(assets.traceAM)
                    car106.rotate(270)
                    car106.set_position(460,550)
                    car_group.add(car106)
                elif event.key == pygame.K_6:
                    car105=car()
                    car105.set_image(assets.traceAM)
                    car105.set_position(750,300)
                    car_group.add(car105)
                elif event.key == pygame.K_7:
                    car104=car()
                    car104.set_image(assets.rumbler)
                    car104.set_position(750,265)
                    car_group.add(car104)
                elif event.key == pygame.K_8:
                    car103=car()
                    car103.set_image(assets.rumbler)
                    car103.rotate(90)
                    car103.set_position(294,0)
                    car_group.add(car103)
                elif event.key == pygame.K_9:
                    car102=car()
                    car102.set_image(assets.rumbler)
                    car102.rotate(90)
                    car102.set_position(337,0)
                    car_group.add(car102)
                elif event.key == pygame.K_0:
                    car101=car()
                    car101.set_image(assets.rumbler)
                    car101.rotate(90)
                    car101.set_position(380,0)
                    car_group.add(car101)
                elif event.key == pygame.K_b:
                    car201=bus()
                    car201.set_image(assets.bus)
                    car201.set_position(700,229)
                    car_group.add(car201)
                elif event.key ==pygame.K_x:
                    car_group.remove(car101,car102,car103,car104,car105,car106,car107,car108,car109,car110,car201)
        car_group.update()
        window.fill(assets.white)
        window.blit(bkg,(0,0))
        car_group.draw(window)
        clock.tick(assets.FPS)
        pygame.display.update()
    pygame.quit()

如果有人能给我一些指示或告诉我我能做些什么来解决它,我会非常感激!

1 个答案:

答案 0 :(得分:3)

move_position中不要使用

self.rect = self.image.get_rect()

因为image无法保持位置且始终为(x,y) == (0,0)

在课程中创建update()并在move_position()内运行update()car_group.update()将在每个循环中执行它。

我将angle保存在self.angle中,以便我可以使用它向正确的方向移动

radians_angle = math.radians(self.angle)

self.rect.x -= self.speed * math.cos(radians_angle)
self.rect.y -= self.speed * math.sin(radians_angle)

示例无图像,因此每个人都可以运行它。

import pygame
import math

WHITE = (0,0,0)

##this class spawns
class bus(pygame.sprite.Sprite):

    def __init__(self):
        super(bus,self).__init__()
        self.image = pygame.Surface((800, 600)).convert_alpha()
        self.rect = self.image.get_rect()
        self.angle = 0 # <-- default direction

    def set_position(self,x,y):
        self.rect.x = x
        self.rect.y = y

    def set_image(self, filename = None):
        if filename != None:
            self.image = pygame.Surface((20, 20)).convert_alpha()
            self.image.fill((255,0,0))
            self.rect = self.image.get_rect()

    def rotate(self,angle):
        self.angle = angle # <-- keep it to move it in correct direction
        self.image = pygame.transform.rotate(self.image,angle).convert_alpha() # need alpha to correctly rotate
        self.rect = self.image.get_rect()

class car(pygame.sprite.Sprite):

    def __init__(self):
        super(car,self).__init__()
        self.image = pygame.Surface((20,20)).convert_alpha()
        self.image.fill((255,0,0))
        self.rect = self.image.get_rect()
        self.speed = 2
        self.angle = 0 # <-- default direction

    def set_position(self,x,y):
        self.rect.x = x
        self.rect.y = y

    def get_x_position(self):
        return self.rect.x

    def get_y_position(self):
        return self.rect.y

    def set_image(self, filename = None):
        if filename != None:
            self.image = pygame.Surface((20, 20)).convert_alpha() # need alpha to correctly rotate
            self.image.fill((0,255,0))
            self.rect = self.image.get_rect()

    def rotate(self,angle):
        self.angle = angle # <-- keep it to move it in correct direction
        self.image = pygame.transform.rotate(self.image, angle).convert_alpha() # need alpha to correctly rotate
        self.rect = self.image.get_rect()

    #not sure what to do here
    def move_position(self,x,y):

        # use angle to calculate direction
        radius_angle = math.radians(self.angle)
        self.rect.x -= self.speed * math.cos(radius_angle)
        self.rect.y -= self.speed * math.sin(radius_angle)
        #print('move', self.angle, self.rect.x, self.rect.y)

        #self.rect = self.image.get_rect() # <-- DON'T DO THIS

    def update(self):
        self.move_position(0,0)

class WayPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def getX(self):
        return self.x
    def getY(self):
        return self.y

class WayPointsList:
    def __init__(self):
        self.wayPoints = []
    def add_wayPoint(self, x, y):
        self.wayPoints.append(WayPoint(x,y))
    def __len__(self):
        return len(self.wayPoints)
    def get_wayPoint(self, i):
        return [self.wayPoints[i].getX(), self.wayPoints[i].getY()]

if __name__ == '__main__':
    pygame.init()
    window_size = window_width, window_height = 800, 600
    window = pygame.display.set_mode(window_size, pygame.RESIZABLE)

    window.fill(WHITE)
    clock = pygame.time.Clock()
    car_group = pygame.sprite.Group()
    #mainloop
    running = True
    while running:
        #loading background
        bkg = pygame.Surface((800,600)).convert()
        bkg.fill((0,0,255))                     
        #event handling
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    car110 = car()
                    #car110.set_image(assets.furore)
                    car110.rotate(180-45) 
                    car110.set_position(0,273)
                    car_group.add(car110)
                elif event.key == pygame.K_2:
                    car109 = car()
                    #car109.set_image(assets.hachura)
                    car109.rotate(180)
                    car109.set_position(0,306)
                    car_group.add(car109)
                    #i want to move this car along some waypoints I've defined in my head
                    #like so:
                    #lane = WayPointsList()
                    #lane.add_wayPoint(50, 250)
                    #lane.add_wayPoint(250, 350)
                    #after this i want to move my image along these waypoints I've defined
                elif event.key == pygame.K_3:
                    car108=car()
                    #car108.set_image(assets.jefferson)
                    car108.rotate(180)
                    car108.set_position(0,343)
                    car_group.add(car108)
                elif event.key == pygame.K_4:
                    car107=car()
                    #car107.set_image(assets.michelli)
                    car107.rotate(270)
                    car107.set_position(410,550)
                    car_group.add(car107)
                elif event.key == pygame.K_5:
                    car106=car()
                    #car106.set_image(assets.traceAM)
                    car106.rotate(270)
                    car106.set_position(460,550)
                    car_group.add(car106)
                elif event.key == pygame.K_6:
                    car105=car()
                    #car105.set_image(assets.traceAM)
                    car105.set_position(750,300)
                    car_group.add(car105)
                elif event.key == pygame.K_7:
                    car104=car()
                    #car104.set_image(assets.rumbler)
                    car104.set_position(750,265)
                    car_group.add(car104)
                elif event.key == pygame.K_8:
                    car103=car()
                    #car103.set_image(assets.rumbler)
                    car103.rotate(90)
                    car103.set_position(294,0)
                    car_group.add(car103)
                elif event.key == pygame.K_9:
                    car102=car()
                    #car102.set_image(assets.rumbler)
                    car102.rotate(90)
                    car102.set_position(337,0)
                    car_group.add(car102)
                elif event.key == pygame.K_0:
                    car101=car()
                    #car101.set_image(assets.rumbler)
                    car101.rotate(90)
                    car101.set_position(380,0)
                    car_group.add(car101)
                elif event.key == pygame.K_b:
                    car201=bus()
                    #car201.set_image(assets.bus)
                    car201.set_position(700,229)
                    car_group.add(car201)
                elif event.key ==pygame.K_x:
                    car_group.remove(car101,car102,car103,car104,car105,car106,car107,car108,car109,car110,car201)
        car_group.update()
        window.fill(WHITE)
        window.blit(bkg,(0,0))
        car_group.draw(window)
        clock.tick(25)
        pygame.display.update()
    pygame.quit()