2017-05-09 10 views
1

私はxwingが銃を撃ち殺してゲームを作成しようとしています。私はスペースバーを押すと、xwingから撮影画像が表示されないだけです。私はこの質問が以前に尋ねられたことを知っていますが、私はそれを得ることができません。私はPythonと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

を割り当てていないということです。 (第12章で授業の仕方が説明されています)。矩形で物を撃つには、少しだけ自分でやる必要があります。

スペースを押して最初に1発の銃弾を撃つ(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 

をし、それらをブリット:あなたのイベントループにこれらの3行を追加します。

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

あなたはそうevent.typeはそれと一致することはありません。この

if event.type == space: 

しかし

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

をテストしています。あなたが他のキーをテストしているよう

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

あなたはこのようなものが必要。

あなたの次の問題は、私はrectsのリストの代わりにpygame spritesとスプライトグループを使用する方が良いと思いますがshotどこでも

+0

私はこれをしなかったが、私はPythonとpygameのに非常に新しいです。私は何をすべきかわからない。これを行う方法の例を私に教えてください。 – joe

関連する問題