2016-12-18 4 views
0

これは私がバックグラウンドを持っていないときに何が起こるかです: https://www.youtube.com/watch?v=S-bv-j8le24バックグラウンドを追加すると、私のキャラクターがクロックティックを無視するのはなぜですか?

これはコードです:

import pygame 

pygame.init() 

#####Variables##### 

white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
gameWindowWidth = 1280 
gameWindowHeight = 720 
gameRunning = True 
clock = pygame.time.Clock() 

################### 

#####Loading##### 

ninja01 = pygame.image.load("C:\\Users\Tom\Desktop\gameImages\charSprite\s_Idle__000.png") 
background = pygame.image.load("C:\\Users\Tom\Desktop\gameImages\Background\DistantCity\PNG\m_image.png") 

################# 

#####Classes##### 

class player(): 
    def __init__(self): 
     self.playerX = gameWindowWidth * 0.2 
     self.playerY = gameWindowHeight * 0.8 
     self.changeOnX = 0 

    def changingX(self): 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
      self.changeOnX = 5 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
      self.changeOnX = -5 
     if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
      self.changeOnX = 0 
     if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
      self.changeOnX = 0 

    def move(self): 
     self.playerX = self.playerX + self.changeOnX 

     gameWindow.blit(ninja01, (self.playerX, self.playerY)) 


################ 

ninja = player() 
gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight)) 
pygame.display.set_caption("Platformer Game") 

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


    #gameWindow.blit(background, (0, 0)) 
    ninja.changingX() 
    ninja.move() 
    pygame.display.update() 
    clock.tick(144) 

これは私がバックグラウンドを持っているときに何が起こるかです: https://www.youtube.com/watch?v=l89zZQ_8kzg

これはコードです:

import pygame 

pygame.init() 

#####Variables##### 

white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
gameWindowWidth = 1280 
gameWindowHeight = 720 
gameRunning = True 
clock = pygame.time.Clock() 

################### 

#####Loading##### 

ninja01 = pygame.image.load("C:\\Users\Tom\Desktop\gameImages\charSprite\s_Idle__000.png") 
background = pygame.image.load("C:\\Users\Tom\Desktop\gameImages\Background\DistantCity\PNG\m_image.png") 

################# 

#####Classes##### 

class player(): 
    def __init__(self): 
     self.playerX = gameWindowWidth * 0.2 
     self.playerY = gameWindowHeight * 0.8 
     self.changeOnX = 0 

    def changingX(self): 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
      self.changeOnX = 5 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
      self.changeOnX = -5 
     if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
      self.changeOnX = 0 
     if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
      self.changeOnX = 0 

    def move(self): 
     self.playerX = self.playerX + self.changeOnX 

     gameWindow.blit(ninja01, (self.playerX, self.playerY)) 


################ 

ninja = player() 
gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight)) 
pygame.display.set_caption("Platformer Game") 

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


    gameWindow.blit(background, (0, 0)) 
    ninja.changingX() 
    ninja.move() 
    pygame.display.update() 
    clock.tick(144) 

コード"gameWindow.blit(background、(0、0))"が最初のものでコメントアウトされているのとまったく同じです。

私のバックグラウンドを追加すると、なぜ私のキャラクターはとても遅くなるのですか?

また、2番目のものでは、clock.tickを以下に下げるまで、彼の移動速度は変わりません。

+0

'clock.tick(144)'は1秒間に144フレーム以下を表示することを意味しますが、それ以上の作業があれば表示することができます。 – furas

答えて

0

ゲームループ全体のタイミングは、Clock.tickメソッドによって制御されています。したがって、各フレームごとに入力と位置の更新コードを実行するだけです。スプライトが多くなればなるほど、このサイクルが遅くなります。これはバックグラウンドを含めるときに観察しているものです。入力サイクルと更新ロジックのタイミングをレンダリングサイクルから切り離すことができ、これにより問題が解決されます。私は下に行われているリファクタリング考えてみましょう:更新が忍者に呼び出されると

import pygame 

pygame.init() 

#####Variables##### 

white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
gameWindowWidth = 1280 
gameWindowHeight = 720 
gameRunning = True 
clock = pygame.time.Clock() 

################### 

#####Loading##### 

ninja01 = pygame.image.load("/path/to/your/ninja/sprite") 
background = pygame.image.load("/path/to/your/background/sprite") 

################# 

#####Classes##### 

class player(): 
    def __init__(self): 
     self.playerX = gameWindowWidth * 0.2 
     self.playerY = gameWindowHeight * 0.8 
     self.velocity = 0.0 

    def setVelocity(self, velocity): 
     self.velocity = velocity 

    def update(self, dt): 
     self.playerX += self.velocity * dt 

    def draw(self): 
     gameWindow.blit(ninja01, (self.playerX, self.playerY)) 


################ 

ninja = player() 
gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight)) 
pygame.display.set_caption("Platformer Game") 

fps = 60 
target_frame_time = 1.0/fps 
current_frame_time = 0.0 

while gameRunning == True: 
    dt = clock.tick() 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      gameRunning = False 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
      ninja.setVelocity(1) 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
      ninja.setVelocity(-1) 
     if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
      ninja.setVelocity(0) 
     if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
      ninja.setVelocity(0) 

    ninja.update(dt) 

    current_frame_time += dt 

    if current_frame_time >= target_frame_time: 
     gameWindow.blit(background, (0, 0)) 
     ninja.draw() 

     pygame.display.flip() 

     current_frame_time -= target_frame_time 

を、位置は以下の式で計算されます。これらのコード変更により

distance = velocity * time 

を、あなたは今、一貫性のあるフレームを達成することができます入力とゲームの更新ロジックが連続して実行されている間は、

0

clock.tick(144)は、レンダリング速度が144fpsより速く起こっている場合は、一時停止する可能性があります。それはフレームレートが十分に高く、レンダリングにはまだ時間がかかります。おそらくclock.tickがすぐに戻り、遅延は必要ありません。

バックグラウンドで描画する場合、レンダリングはもっと速く行われるため、まだ遅くてもすぐにclock.tickが返されます。これを除いてレンダリングは少し遅いので、レンダリングからの遅延に気づくでしょう。

関連する問題