2016-11-29 73 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',稍後'if current_time> = destroy_time:destroy_object' – furas

+0

如果在for循環中使用'list.remove()',那麼你可能會遇到一些問題 - 最好用你想保留的元素創建新列表。在循環之後用新列表替換舊列表。 – furas

回答

0

首先,pygame.time.delay()會暫停整個程序。您可以使用Clock.tick()來記錄時間,或者通過向更新功能添加類似代碼來檢查刀的x或y座標是否離開屏幕。

if self.x > display_width: 
    knifes.remove(self) 
if self.x < 0: 
    knifes.remove(self) 
if self.y < 0: 
    knifes.remove(self) 
if self.y > display_height: 
    knifes.remove(self) 
相關問題