2016-11-29 13 views
0

クラスを使用して画面上を飛ぶナイフを作成していますが、画面を離れた後に削除したいと思っています。 pygame.time.delay()を使用してみましたが、プログラムがクラッシュして、list.remove()を使用しようとしましたが、その作業を行うことができませんでした。一定時間後にクラスを使用して作成したアイテムを削除します

import pygame 
import sys 
from pygame.locals import * 
import time 
from anim import Anim 

LEFT, RIGHT = 0, 1 

def resetanim(): 
    global ninja_anim 
    if x_change !=0: 
     ninja_anim=ninja_run 
    elif x_change==0: 
     ninja_anim = ninja_stand 
    old_dir = ninja_anim.dir 
    ninja_anim.face(old_dir) 
    ninja_anim.reset() 

pygame.init() 
display_width=1000 
display_height=800 
game_display=pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption("EPQ Game") 
forest_img=pygame.image.load("forest.jpg") 
game_display.blit(forest_img,(0,0)) 
clock=pygame.time.Clock() 
ninja_stand=Anim(lambda _: "Idle__000.png",1, 10, (95, 180), True, 1) 
ninja_stand.load() 
kunai=pygame.image.load("Kunai.png") 
kunai=pygame.transform.scale(kunai, (13,55)) 
ninja_run=Anim("Run__00%s.png".__mod__, 0, 9, (150, 180), True, 10) 
ninja_run.load() 
ninja_slide=Anim("Slide__00%s.png".__mod__, 0, 9, (150, 145), True, 10) 
ninja_slide.load() 
ninja_jump=Anim("Jump__00%s.png".__mod__, 0, 9, (150, 180), True, 15) 
ninja_jump.load() 
ninja_throw = Anim("Throw__00%s.png".__mod__, 0, 9, (150, 180), False, 10, oncomplete=resetanim) 
ninja_throw.load() 
ninja_anim = ninja_stand 

def ninja(x,y): 
    game_display.blit(ninja_anim.next(),(x,y)) 

class Knife(): 
    def __init__(self, vx): 
     self.x=display_width//2+30 
     self.y=int(ground+65) 
     self.vx=vx 
     self.angle = 0 
     self.vangle = 30 
    def update(self): 
     self.x+=self.vx 
     self.angle += self.vangle 

    def draw(self): 
     game_display.blit(pygame.transform.rotate(kunai, self.angle), (self.x, self.y)) 

x= 0  
ground = (display_height * 0.6) 
y = ground - 10 
x_change = 0 
y_change = 0 
gravity = 1 
jump_speed = 15 
img_width = 1600 
img_facing_right = True 
bx=0 
ix=0 
knifes=[] 


while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type==pygame.KEYDOWN: 
      if event.key==pygame.K_LEFT: 
       ninja_anim=ninja_run 
       ninja_anim.face(LEFT) 
       img_facing_right=False 
       x_change = 5 
      elif event.key==pygame.K_RIGHT: 
       ninja_anim=ninja_run 
       ninja_anim.face(RIGHT) 
       img_facing_right=True 
       x_change = -5 
      elif event.key == pygame.K_UP and y >= ground: 
       y_change -= jump_speed 
       old_dir = ninja_anim.dir 
       ninja_anim=ninja_jump 
       ninja_anim.face(old_dir) 
       ninja_anim.reset() 
      elif event.key == pygame.K_DOWN and y >=ground: 
       ninja_anim=ninja_slide 
       if img_facing_right==True: 
        ninja_anim.face(RIGHT) 
       elif img_facing_right==False: 
        ninja_anim.face(LEFT) 
      elif event.key == pygame.K_SPACE and y >= ground: 
       knifes.append(Knife(20 if img_facing_right else -20)) 
       old_dir = ninja_anim.dir 
       ninja_anim = ninja_throw 
       ninja_anim.face(old_dir) 
       ninja_anim.reset() 
     if event.type==pygame.KEYUP: 
      if event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT: 
       x_change = 0 
       ninja_anim=ninja_stand 
       if img_facing_right==True: 
        ninja_anim.face(RIGHT) 
       elif img_facing_right==False: 
        ninja_anim.face(LEFT) 
       ninja_anim.reset() 
      elif event.key==pygame.K_DOWN: 
       if x_change !=0: 
        ninja_anim=ninja_run 
       elif x_change == 0: 
        ninja_anim=ninja_stand 
       ninja_anim.reset() 

    x -= x_change 
    bx+=x_change 
    ix+=x_change 
    if y < ground: 
     y_change += gravity 
    y += y_change 
    if y > ground: 
     y = ground 
     y_change = 0 
     if x_change !=0: 
      ninja_anim=ninja_run 
     elif x_change==0: 
      ninja_anim=ninja_stand 
     ninja_anim.reset() 
    game_display.fill([255,255,255]) 
    if ix < -1600 or ix > 1600: 
     ix = 0 
    game_display.blit(forest_img, (ix,0)) 
    game_display.blit(forest_img, (ix+1600,0)) 
    game_display.blit(forest_img, (ix-1600,0)) 

    for knife in knifes: 
     knife.draw() 
     knife.update() 



    ninja(500, y) 
    pygame.display.update() 
    clock.tick(60) 

誰かが私を助けてくれますか?ありがとう。

+0

pygameクロックモジュールを使用し、clock.tick()を使用して時間を記録します。 Clock.tick()は最後の呼び出しからの時間を返します。 – Fredrik

+1

オブジェクトを制御するために[pygame.time.get_ticks](http://pygame.org/docs/ref/time.html#pygame.time.get_ticks)を使用します。 - destroy_time = current_time + delay'とそれ以降は 'current_time> = destroy_time:destroy_object' – furas

+0

for-loopで 'list.remove()'を使うと、何か問題が起きる可能性があります。そして、for-loopの後に古いリストを新しいリストに置き換えます。 – furas

答えて

0

まず、pygame.time.delay()は、ENTIREプログラムを一時停止します。 Clock.tick()のいずれかを使用して時間を記録したり、ナイフのx座標またはy座標が更新機能にこのようなコードを追加してスクリーンから外れているかどうかを確認することができます。

関連する問題