2017-12-12 8 views
0

最近、私は少しプロジェクトを進めてきました。 私は多くの車を産んでいる背景があります。 私は自分が定義した道に沿ってそれらの車を動かすことを望んでいます。私は私の移動方法を呼び出すときに私の車の1つが(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() 

誰かが私にいくつかのポインタを与えるか、私はそれを本当に感謝し、私はそれを修正するために何ができるかを教えてことができれば! imageはポジションを維持していないと、それは常に(x,y) == (0,0)

クラスでupdate()を作成し、update()car_group.update()内を実行しているため、move_position

+0

'car'クラスでは、正しい方向にわずかなピクセルしか移動させないメソッドupdate()を作成する必要があります。 'car_group.update()'はすべての車に対して 'update()'を呼び出すでしょう。 – furas

+0

BTW: 'Surface'、' Sprite'や 'Car'、' Bus'のようなクラスに対して 'UpperCaseNames'を使います。 Stackoverflowでもこのルールを知っていて、明るい青色を使用してクラスを表示します。コードを読みやすくします。 [PEP 8 - スタイルガイド(Pythonコード)](https://www.python.org/dev/peps/pep-0008/)の多くの規則/提案は – furas

+0

'self.rect = self.imageをしないでください。 get_rect() 'を' move_position'で実行してください。 'image.get_rect()'は常に '(0,0)'の位置にあります。 – furas

答えて

3

self.rect = self.image.get_rect() 

を使用していないすべてのループでそれを実行します。

私はので、私は誰もがそれを実行することができますので、画像なしで動作し、正しい方向に

radians_angle = math.radians(self.angle) 

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

例を移動するために使用することができself.angleangleを保存します。

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() 
+0

この修正は私を大いに助けました!今私は車を動かすことができます。今私がやらなければならないことは、私の車がウェイポイントに沿って動くように、ウェイポイントクラスを実装することだけです。解決していただきありがとうございます! –

関連する問題