Pygame:Spaceinvaders:无法射击子弹

时间:2015-05-12 02:15:13

标签: python python-3.x pygame

我目前正在构建太空入侵者的模型。 我想让用户拍摄东西,入侵者会死(1hit kill),但我似乎无法弄清楚如何做到这一点。我试过画一个小矩形,但后面的背景画了它。谢谢你的帮助!

import pygame, sys, random
from pygame.locals import *

# set up pygame
pygame.init()
mainClock = pygame.time.Clock()

# set up the window
windowwidth = 800
windowheight = 700
windowSurface = pygame.display.set_mode((windowwidth, windowheight), 0, 32)
pygame.display.set_caption('Sp@c3 inv@d3r5')

# set up movement variables
moveLeft = False
moveRight = False
moveUp = False
moveDown = False

# set up direction variables
DOWNLEFT = 1
DOWNRIGHT = 3
UPLEFT = 7
UPRIGHT = 9
LEFT = 4
RIGHT = 6
UP = 8
DOWN = 2

MOVESPEED = 10
MOVE = 2
# set up counting
score = 0

# set up the colors
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (135, 206, 250)

# set up font
font = pygame.font.SysFont(None, 50)


def makeship(windowwidth): # set up the bouncer and food data structures
    user = pygame.Rect(350, 600, 100, 25)
    return user
def drawwalls(walls):
    for i in range(6):
        wall = pygame.Rect(0,i+1,100,25)
        pygame.draw.rect(windowSurface,GREEN,wall)
        walls.append(wall)
def makeinvaders(invaders):
    y = 0
    for i in invaders: # each row
        x = 0
        for j in range(10):
            # create invader
            invader = pygame.Rect(75+x, 100+y, 40, 25)
            # append invader to invaders[row]
            i.append(invader)
            # increase invader's x attribute by 50
            x += 60
        # increase invaders y by 35
        y += 45
    return invaders

def movepaddle(user):
    # move the paddle
    if moveLeft and user.left > 0:
        user.left -= MOVESPEED
    if moveRight and user.right < windowwidth:
        user.right += MOVESPEED
    return user

def moveinvaders(invaders, invdir):
    # move the invaders
    for row in invaders:
        for invader in row:
            if invdir == RIGHT and invaders[1][9].right < windowwidth:
                invader.right += MOVE
            elif invaders[1][9].right > windowwidth:
                invader.left -= MOVE
                invdir = LEFT
            if invdir == LEFT and invaders[0][0].left > 0:
                invader.left -= MOVE
            elif invaders[0][0].left < 0:
                invader.right += MOVE
                invdir = RIGHT
    return invdir
def shootbullets(windowSurface,blue2):
    x = pygame.Rect(400,595,2,5)
    pygame.draw.rect(windowSurface,GREEN,x)
def movebullets(bullets):
    for bullet in bullets:
        pass
def drawstuff(user, invaders):
    # draw the user onto the surface
    pygame.draw.rect(windowSurface, BLACK, user)
    for i in invaders:
        for invader in i:
            if invader in invaders[0]:
                pygame.draw.rect(windowSurface, BLACK, invader)
            elif invader in invaders[1]:
                pygame.draw.rect(windowSurface, BLACK, invader)
            elif invader in invaders[2]:
                pygame.draw.rect(windowSurface, BLACK, invader)
            elif invader in invaders[3]:
                pygame.draw.rect(windowSurface, BLACK, invader)
            elif invader in invaders[4]:
                pygame.draw.rect(windowSurface, BLACK, invader)

invaders = [[],[],[],[],[]]
invdir = LEFT
walls = []
drawwalls(walls)
# make the figures
user = makeship(windowwidth)

# make invaders
invaders = makeinvaders(invaders)

# run the game loop
while True:
    # draw the black background onto the surface
    windowSurface.fill(WHITE)
    # check for the QUIT event
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            # change the keyboard variables
            if event.key == K_LEFT  or event.key == ord('a'):
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT or event.key == ord('d'):
                moveLeft = False
                moveRight = True
            if event.key == K_SPACE:
                shootbullets(windowSurface,RED)
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_LEFT or event.key == ord('a'):
                moveLeft = False
            if event.key == K_RIGHT or event.key == ord('d'):
                moveRight = False


    # draw stuff
    drawstuff(user, invaders)

    # move invaders
    invdir = moveinvaders(invaders, invdir)

    # paddle movement
    user = movepaddle(user)

    # draw the window onto the screen
    pygame.display.update()
    mainClock.tick(80)

1 个答案:

答案 0 :(得分:1)

看一看这个极小的太空入侵者,就像我为另一个问题写的游戏一样:

enter image description here

import pygame

# you'll be able to shoot every 450ms
RELOAD_SPEED = 450

# the foes move every 1000ms sideways and every 3500ms down
MOVE_SIDE = 1000
MOVE_DOWN = 3500

screen = pygame.display.set_mode((300, 200))
clock = pygame.time.Clock()

pygame.display.set_caption("Micro Invader")

# create a bunch of events 
move_side_event = pygame.USEREVENT + 1
move_down_event = pygame.USEREVENT + 2
reloaded_event  = pygame.USEREVENT + 3

move_left, reloaded = True, True

invaders, colors, shots = [], [] ,[]
for x in range(15, 300, 15):
    for y in range(10, 100, 15):
        invaders.append(pygame.Rect(x, y, 7, 7))
        colors.append(((x * 0.7) % 256, (y * 2.4) % 256))

# set timer for the movement events
pygame.time.set_timer(move_side_event, MOVE_SIDE)
pygame.time.set_timer(move_down_event, MOVE_DOWN)

player = pygame.Rect(150, 180, 10, 7)

while True:
    clock.tick(40)
    if pygame.event.get(pygame.QUIT): break
    for e in pygame.event.get():
        if e.type == move_side_event:
            for invader in invaders:
                invader.move_ip((-10 if move_left else 10, 0))
            move_left = not move_left
        elif e.type == move_down_event:
            for invader in invaders:
                invader.move_ip(0, 10)
        elif e.type == reloaded_event:
            # when the reload timer runs out, reset it
            reloaded = True
            pygame.time.set_timer(reloaded_event, 0)

    for shot in shots[:]:
        shot.move_ip((0, -4))
        if not screen.get_rect().contains(shot):
            shots.remove(shot)
        else:
            hit = False
            for invader in invaders[:]:
                if invader.colliderect(shot):
                    hit = True
                    i = invaders.index(invader)
                    del colors[i]
                    del invaders[i]
            if hit:
                shots.remove(shot)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]: player.move_ip((-4, 0))
    if pressed[pygame.K_RIGHT]: player.move_ip((4, 0))

    if pressed[pygame.K_SPACE]: 
        if reloaded:
            shots.append(player.copy())
            reloaded = False
            # when shooting, create a timeout of RELOAD_SPEED
            pygame.time.set_timer(reloaded_event, RELOAD_SPEED)

    player.clamp_ip(screen.get_rect())

    screen.fill((0, 0, 0))

    for invader, (a, b) in zip(invaders, colors): 
        pygame.draw.rect(screen, (150, a, b), invader)

    for shot in shots: 
        pygame.draw.rect(screen, (255, 180, 0), shot)

    pygame.draw.rect(screen, (180, 180, 180), player)    
    pygame.display.flip() 

它使用colliderect来检测您的代码缺失的冲突。

此外,一般的代码,尤其是移动代码比你的简单得多;所以也许它可以作为你的灵感。