如何让一个Sprite在pygame / python中移向另一个Sprite

时间:2017-04-25 09:10:16

标签: python pygame

所以我在这个问题上做了很多研究,但我仍然无法实现其他人的解决方案来解决我的问题。我正在尝试使Mob2类向Player类移动。我对代码的任何建议,甚至如何改进我的代码都会非常感激:)顺便说一句,我在下面写的代码是在Atom中编写的,如果你有什么问题我将会回答它们。非常感谢你们!!

# Pygame template - skeleton for a new pygame project
import pygame
import random
import math
from os import path

working_dir = path.dirname(__file__)

from pygame.locals import *

WIDTH = 1000
HEIGHT = 700
FPS = 60

# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Virus Invaders")
clock = pygame.time.Clock()
font_name = pygame.font.match_font('arial')

health = 4

def draw_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, WHITE)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

def newmob():
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

def newmob2():
    n = Mob2()
    all_sprites.add(n)
    mobs2.add(n)

def draw_health_bar(surf, x, y, health):
    if health==4:
        healthImage = healthSheet.get_image(0, 102, 176, 23)
        screen.blit(healthImage, [50, 50])
    if health==3:
        healthImage = healthSheet.get_image(0, 128, 176, 23)
        screen.blit(healthImage, [50, 50])
    if health==2:
        healthImage = healthSheet.get_image(0, 155, 176, 23)
        screen.blit(healthImage, [50, 50])
    if health==1:
        healthImage = healthSheet.get_image(0, 182, 176, 23)
        screen.blit(healthImage, [50, 50])
    if health==0:
        healthImage = healthSheet.get_image(0, 209, 176, 23)
        screen.blit(healthImage, [50, 50])




class Player(pygame.sprite.Sprite):
    def __init__(self, health):
        pygame.sprite.Sprite.__init__(self)
        self.image = dudeSpriteSheet.get_image(60, 0, 60, 60)
        self.rect = self.image.get_rect()
        self.radius = 25
        #pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
        self.rect.centerx = 100
        self.rect.centery = 400.5
        self.speedx = 0
        self.speedy = 0
        self.health = health

    def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_s]:
            self.speedy = 4
        if keystate[pygame.K_w]:
            self.speedy = -4
        if keystate[pygame.K_d]:
            self.speedx = 4
        if keystate[pygame.K_a]:
            self.speedx = -4
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.right > WIDTH-80:
            self.rect.right = WIDTH-80
        if self.rect.left < 90:
            self.rect.left = 90
        if self.rect.bottom > HEIGHT-87:
            self.rect.bottom = HEIGHT-87
        if self.rect.top < 187:
            self.rect.top = 187

    def shoot(self, X, Y, direction):
        if direction == 1:
            self.image = dudeSpriteSheet.get_image(60, 0, 60, 60)
        elif direction == 2:
            self.image = dudeSpriteSheet.get_image(0, 0, 60, 60)
        elif direction == 3:
            self.image = dudeSpriteSheet.get_image(120, 0, 60, 60)
        elif direction == 4:
            self.image = dudeSpriteSheet.get_image(180, 0, 60, 60)
        X = X+self.speedx
        Y = Y+self.speedy
        bullet = Bullet(self.rect.centerx, self.rect.centery, X, Y)
        all_sprites.add(bullet)
        bullets.add(bullet)

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = virus_img
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.radius = int(self.rect.width * 0.85 / 2)
        #pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
        self.rect.x = WIDTH - 200
        self.rect.y = 400.5
        self.speedx = random.randrange(-4, 4)
        self.speedy = random.randrange(-4, 4)

    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.bottom >= HEIGHT - 87:
            self.speedy = -self.speedy
        if self.rect.top <= 193:
            self.speedy = -self.speedy
        if self.rect.left <= 94:
            self.speedx = -self.speedx
        if self.rect.right >= WIDTH - 96:
            self.speedx = -self.speedx

class Mob2(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = virus2_img
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.radius = int(self.rect.width * 0.85 / 2)
        pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
        self.rect.x = WIDTH - 200
        self.rect.y = 300
        self.rot = 0
        self.speed = 3

    def update(self, Player):



class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, X, Y):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.radius = 25
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = Y
        self.speedx = X
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        # Kill if it moves off the top of the screen
        if self.rect.bottom < 0 or self.rect.top > 700 or self.rect.right < 
           0 or self.rect.left > 1000:
            self.kill()

class Spritesheet:
    #Utility class for loading and parsing spritesheets
    def __init__(self, filename):
    self.spritesheet = pygame.image.load(filename).convert()

    def get_image(self, x, y, width, height):
        #Grab an image out of a larger spritesheet
        image = pygame.Surface((width, height))
        image.blit(self.spritesheet, (0, 0), (x, y, width, height))
        image.set_colorkey(BLACK)
        return image

# Load all game graphics
background = pygame.image.load(path.join(working_dir, 
'GameScreen.png')).convert()
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(working_dir,'dude.png')).convert()
virus_img = 
pygame.image.load(path.join(working_dir,'badguy1.png')).convert()
bullet_img = 
pygame.image.load(path.join(working_dir,'bullet.png')).convert()
dudeSpriteSheet = Spritesheet(path.join(working_dir, 
'DudeSpriteSheet2.png'))
healthSheet = Spritesheet(path.join(working_dir, 'health.png'))
virus2_img =  
pygame.image.load(path.join(working_dir,'badguy2(2).png')).convert()

all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
mobs2 = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player(health)
all_sprites.add(player)

for i in range(8):
    newmob()
    newmob2()

score = 0
# Game loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
            player.shoot(10, 0, 1)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
            player.shoot(0, -10, 2)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
            player.shoot(0, 10, 3)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
            player.shoot(-10, 0, 4)
    # Update
    all_sprites.update()

    #Check to see if bullet hits a mob
    hits = pygame.sprite.groupcollide(mobs, bullets, True, 
           pygame.sprite.collide_circle)
    for hit in hits:
        score += 1
        newmob()
    # Check to see if a virus hits a player
    hits = pygame.sprite.spritecollide(player, mobs, True,
           pygame.sprite.collide_circle)
    for hit in hits:
        health -= 1
        newmob()
        if health <= 0:
            running = False

    # Draw / render
    screen.fill(BLACK)
    screen.blit(background, background_rect)
    all_sprites.draw(screen)
    draw_text(screen, str(score), 18, WIDTH / 2, 10)
    draw_health_bar(screen, 5, 5, health)
    # *after* drawing everything, flip the display
    pygame.display.flip()

pygame.quit()

1 个答案:

答案 0 :(得分:0)

首先将Mob.rect.xPlayer.rect.x进行比较,看看它是向左还是向右移动,然后对rect.y执行相同操作,以查看它是应该向上还是向下移动。它只是让Mob朝那个方向前进。