2017-04-25 12 views
2

私はこの質問についてかなりの研究をしてきましたが、私はまだ私の解決のために他の人のソリューションを実装できませんでした。私はMob2クラスをPlayerクラスに移動しようとしています。私のコードへの提案、またはコードの改善方法についても大変感謝しています:)私は以下に書いたコードはAtomで作成されています。本当にありがとうございました!pygame/pythonでスプライトを別のものに移動させるにはどうすればいいですか

# 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() 
+0

私はあなたが何を記述しているかを示す同様の質問[ここ](http://stackoverflow.com/a/42093505/6486738)に答えました。 –

+0

うわー!これは私の男のために働いたとき私はとても恍惚だった!ありがとう、スプライトに別のものを追いかける方法を教えてくれただけでなく、速度、位置、方向を扱う良い方法を教えてくれました。あなたが私に多くの仕事を保存してくれてありがとう、ありがとう。 –

答えて

0

まず、それが上下に移動する必要があるかどうかを確認するためにrect.yと同じことを行う、その後、左または右に移動する必要があるかどうかを確認するためにPlayer.rect.xMob.rect.xを比較します。そのモブを単にその方向に動かすこと。

関連する問題