Danyon Farrell
Danyon Farrell

Reputation: 21

How do I make one Sprite move towards another in pygame/python

So I've been doing quite a lot of research on this question, and I still haven't been able to implement other people's solutions to solve mine. I'm trying to make the Mob2 class move towards the Player class. Any suggestions to my code, or even how to improve my code would be greatly appreciated :) BTW, the code I've written below has been made in Atom, if you have any questions I'll be around to answer them. Thank you all so much!!

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

Upvotes: 2

Views: 2006

Answers (1)

Pyrolle
Pyrolle

Reputation: 51

First compare Mob.rect.x with Player.rect.x to see if it should move left or right, then do the same with rect.y to see if it should move up or down. The its simply getting Mob to move in that direction.

Upvotes: 1

Related Questions