2017-05-09 47 views
1

我想創建一個遊戲,我的xwing射擊並殺死了tiefighters。當我按下空格鍵時,我無法從xwing中看到拍攝圖像。我知道這個問題以前曾被問過,但我無法得到它。我對python和pygame有點新鮮。謝謝!如何在pygame中進行角色拍攝?

import sys 
import random 
import pygame as pg 


pg.init() 
screen = pg.display.set_mode((1280, 800)) 
display_width = 1280 
display_height= 800 

black= (0,0,0) 
white= (255,255,255) 
red = (255,0,0) 
blue_violet = (138,43,226) 

bullets= [] 

xwingImg = pg.image.load('X-Wing.bmp').convert() 
tieImg= pg.image.load('tiefighter.png').convert() 
space=pg.image.load('space.jpg').convert() 
xbullet = pg.image.load('bullet.png').convert() 

BG_image = pg.image.load('space.jpg').convert() 

def rot_center(image, angle): 
    """rotate a Surface, maintaining position.""" 
    loc = image.get_rect().center #rot_image is not defined 
    rot_sprite = pg.transform.rotate(image, angle) 
    rot_sprite.get_rect().center = loc 
    return rot_sprite 

    # or return tuple: (Surface, Rect) 
     # return rot_sprite, rot_sprite.get_rect() 

def main(): 
    clock = pg.time.Clock() 
    # Surfaces/images have a `get_rect` method which 
    # returns a rect with the dimensions of the image. 
    player_rect = xwingImg.get_rect() 
    player_rect.center = (640,400) 
    change_x = 0 
    change_y = 0 
    enemies = [] 
    spawn_counter = 30 


    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == space: 
       shot.play() 
      for b in range(len(bullets)) : 
       bullets [b] [0] -=10 
      for bullet in bullets: 
       if bullet [0] <0: 
        bullet.remove(bullet) 
       bullets.append ([event.pos[0], 500]) 

      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_d: 
        change_x = 5 
       if event.key == pg.K_w: 
        change_y = -5 
       if event.key == pg.K_s: 
        change_y= 5 
       if event.key == pg.K_a: 
        change_x = -5 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_d and change_x > 0: 
        change_x = 0 
       if event.key == pg.K_a and change_x < 0: 
        change_x = 0 
       if event.key == pg.K_w and change_y<0: 
        change_y=0 
       if event.key == pg.K_s and change_y>0: 
        change_y=0 



     # Spawn enemies if counter <= 0 then reset it. 
     spawn_counter -= 1 
     if spawn_counter <= 0: 
      # Append an enemy rect. You can pass the position directly as an argument. 
      enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -800))) 
      spawn_counter = 30 


     # Update player_rect and enemies. 
     player_rect.x += change_x 
     player_rect.y += change_y 
     for enemy_rect in enemies: 
      enemy_rect.y += 5 
      # Collision detection with pygame.Rect.colliderect. 
      if player_rect.colliderect(enemy_rect): 
       done = True 

     # Draw everything. 
     screen.blit(BG_image, (0,0)) 
     for bullet in bullets: 
      screen.blit(xbullet, pg.Rect (bullet[0], bullet [1], 0, 0)) 

     for enemy_rect in enemies: 
      screen.blit(tieImg, enemy_rect) 
     screen.blit(xwingImg, player_rect) 
     if player_rect.x >display_width: 
      player_rect.x = 0 
     if player_rect.x < 0: 
      player_rect.x= 1280 
     if player_rect.y>display_height: 
      player_rect.y = 0 
     if player_rect.y < 0: 
      player_rect.y= 800 


     pg.display.flip() 
     clock.tick(40) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 

回答

2

我認爲這將是更好地使用pygame sprites和雪碧組而不是rects名單。 (第12章解釋了班級是如何工作的。)要用逆折射擊事物,你需要自己做更多的事情。

通過按空格鍵首次拍攝單個項目符號矩形(將它們附加到bullets列表中)。在while循環

if event.type == pg.KEYDOWN: 
    if event.key == pg.K_SPACE: 
     bullets.append(xbullet.get_rect(center=player_rect.midtop)) 

移動子彈:這三個行添加到您的事件循環

for bullet in bullets: 
    bullet.y -= 4 

而且他們的blit:

for bullet in bullets: 
    screen.blit(xbullet, bullet) 

現在到了最困難的部分。我們必須檢查哪個敵人與子彈相撞,然後過濾enemies列表,以便它只包含倖存的敵人。

# We'll use the hit_enemies list to check which enemy has survived. 
hit_enemies = [] 
for enemy_rect in enemies: 
    enemy_rect.y += 5 
    # Collision detection with player. 
    if player_rect.colliderect(enemy_rect): 
     done = True 
    # Collision detection with bullets. 
    for bullet in bullets: 
     if bullet.colliderect(enemy_rect): 
      hit_enemies.append(enemy_rect) 

# Filter the destroyed enemies out. We create a new list and 
# append the surviving enemies to it. 
survivors = [] 
for enemy in enemies: 
    if enemy not in hit_enemies: 
     survivors.append(enemy) 
enemies = survivors # Now `enemies` is the list of survivors. 
# You can also do it in one line with a list comprehension. 
# enemies = [enemy for enemy in enemies if enemy not in hit_enemies] 

您必須對項目符號進行刪除它們。另外,如果敵人和子彈離開屏幕,則應該將它們過濾掉,否則這些列表會一直在增長。

下面是完整的例子:

import sys 
import random 
import pygame as pg 


pg.init() 
screen = pg.display.set_mode((1280, 800)) 
display_width = 1280 
display_height = 800 

xwingImg = pg.image.load('X-Wing.bmp').convert() 
tieImg= pg.image.load('tiefighter.png').convert() 
space=pg.image.load('space.jpg').convert() 
xbullet = pg.image.load('bullet.png').convert() 
BG_image = pg.image.load('space.jpg').convert() 


def main(): 
    clock = pg.time.Clock() 
    player_rect = xwingImg.get_rect() 
    player_rect.center = (640, 400) 
    change_x = 0 
    change_y = 0 
    enemies = [] 
    bullets = [] 
    spawn_counter = 30 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_SPACE: 
        bullets.append(xbullet.get_rect(center=player_rect.midtop)) 
       if event.key == pg.K_d: 
        change_x = 5 
       if event.key == pg.K_w: 
        change_y = -5 
       if event.key == pg.K_s: 
        change_y= 5 
       if event.key == pg.K_a: 
        change_x = -5 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_d and change_x > 0: 
        change_x = 0 
       if event.key == pg.K_a and change_x < 0: 
        change_x = 0 
       if event.key == pg.K_w and change_y<0: 
        change_y=0 
       if event.key == pg.K_s and change_y>0: 
        change_y=0 

     # Spawn enemies if counter <= 0 then reset it. 
     spawn_counter -= 1 
     if spawn_counter <= 0: 
      # Append an enemy rect. You can pass the position directly as an argument. 
      enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -100))) 
      spawn_counter = 30 

     # Update player_rect. 
     player_rect.x += change_x 
     player_rect.y += change_y 

     # Update bullets. 
     for bullet in bullets: 
      bullet.y -= 4 

     # Detect collisions and move the enemies. 
     hit_enemies = [] 
     for enemy_rect in enemies: 
      enemy_rect.y += 5 
      # Collision detection with pygame.Rect.colliderect. 
      if player_rect.colliderect(enemy_rect): 
       done = True 
      # Collision detection with bullets. 
      for bullet in bullets: 
       if bullet.colliderect(enemy_rect): 
        hit_enemies.append(enemy_rect) 

     # Filter the destroyed enemies out. 
     survivors = [] 
     for enemy in enemies: 
      if enemy not in hit_enemies: 
       survivors.append(enemy) 
     enemies = survivors # Now `enemies` is the list of survivors. 

     # Draw everything. 
     screen.blit(BG_image, (0,0)) 
     for bullet in bullets: 
      screen.blit(xbullet, bullet) 

     for enemy_rect in enemies: 
      screen.blit(tieImg, enemy_rect) 
     screen.blit(xwingImg, player_rect) 
     if player_rect.x >display_width: 
      player_rect.x = 0 
     if player_rect.x < 0: 
      player_rect.x= 1280 
     if player_rect.y>display_height: 
      player_rect.y = 0 
     if player_rect.y < 0: 
      player_rect.y= 800 

     pg.display.flip() 
     clock.tick(40) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 
1

您正在測試此

if event.type == space: 

space = pg.image.load('space.jpg').convert() 

所以event.type永遠不會匹配。

你需要的東西是這樣的:

if event.type == pg.KEYUP: 
    if event.key == pg.K_SPACE: 

就像你正在測試的其他鍵。

你的下一個問題是,你還沒有分配任何地方shot

+0

我這樣做,但我很新的Python和pygame的。我不知道該怎麼辦。你能給我一個如何做到這一點的例子嗎? – joe

相關問題