Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在pygame/python中使一个精灵向另一个精灵移动_Python_Pygame - Fatal编程技术网

如何在pygame/python中使一个精灵向另一个精灵移动

如何在pygame/python中使一个精灵向另一个精灵移动,python,pygame,Python,Pygame,所以我已经在这个问题上做了很多研究,但我仍然无法实现其他人的解决方案来解决我的问题。我正试图让Mob2类向玩家类移动。如果您对我的代码有任何建议,甚至是如何改进我的代码,我们将不胜感激:)顺便说一句,我在下面编写的代码是用Atom编写的,如果您有任何问题,我将随时回答。非常感谢大家 # Pygame template - skeleton for a new pygame project import pygame import random import math from os import

所以我已经在这个问题上做了很多研究,但我仍然无法实现其他人的解决方案来解决我的问题。我正试图让Mob2类向玩家类移动。如果您对我的代码有任何建议,甚至是如何改进我的代码,我们将不胜感激:)顺便说一句,我在下面编写的代码是用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()
#Pygame模板-新Pygame项目的框架
导入pygame
随机输入
输入数学
从操作系统导入路径
工作目录=path.dirname(_文件)
从pygame.locals导入*
宽度=1000
高度=700
FPS=60
#定义颜色
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
绿色=(0,255,0)
蓝色=(0,0255)
黄色=(255,255,0)
#初始化pygame并创建窗口
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“病毒入侵者”)
clock=pygame.time.clock()
font\u name=pygame.font.match\u font('arial')
健康=4
def绘图文字(冲浪、文字、大小、x、y):
font=pygame.font.font(字体名称、大小)
text\u surface=font.render(文本、真、白色)
text_rect=text_surface.get_rect()
text_rect.midtop=(x,y)
冲浪板(文字表面,文字直线)
def newmob():
m=Mob()
所有精灵。添加(m)
暴徒。添加(m)
def newmob2():
n=Mob2()
所有精灵。添加(n)
mobs2.add(n)
def draw_health_bar(冲浪、x、y、健康):
如果运行状况==4:
healthImage=healthSheet.get_image(0、102、176、23)
blit(healthImage,[50,50])
如果运行状况==3:
healthImage=healthSheet.get_image(0、128、176、23)
blit(healthImage,[50,50])
如果运行状况==2:
healthImage=healthSheet.get_image(0、155、176、23)
blit(healthImage,[50,50])
如果运行状况==1:
healthImage=healthSheet.get_image(0、182、176、23)
blit(healthImage,[50,50])
如果运行状况==0:
healthImage=healthSheet.get_image(0209176,23)
blit(healthImage,[50,50])
职业玩家(pygame.sprite.sprite):
定义初始(自我,健康):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=dudeSpriteSheet.get_image(60,0,60,60)
self.rect=self.image.get_rect()
自半径=25
#pygame.draw.circle(self.image,红色,self.rect.center,self.radius)
self.rect.centerx=100
self.rect.centery=400.5
self.speedx=0
self.speeded=0
自我健康
def更新(自我):
self.speedx=0
self.speeded=0
keystate=pygame.key.get_pressed()
如果keystate[pygame.K_s]:
self.speeded=4
如果keystate[pygame.K_w]:
self.speedy=-4
如果keystate[pygame.K_d]:
self.speedx=4
如果keystate[pygame.K_a]:
self.speedx=-4
self.rect.x+=self.speedx
self.rect.y+=自加速
如果self.rect.right>WIDTH-80:
self.rect.right=宽度-80
如果self.rect.left<90:
self.rect.left=90
如果self.rect.bottom>HEIGHT-87:
self.rect.bottom=高度-87
如果self.rect.top<187:
self.rect.top=187
def喷射(自身、X、Y、方向):
如果方向==1:
self.image=dudeSpriteSheet.get_image(60,0,60,60)
elif方向==2:
self.image=dudeSpriteSheet.get_image(0,0,60,60)
elif方向==3:
self.image=dudeSpriteSheet.get_image(120,0,60,60)
elif方向==4:
self.image=dudeSpriteSheet.get_image(180,0,60,60)
X=X+self.speedx
Y=Y+自加速
项目符号=项目符号(self.rect.centerx,self.rect.centery,X,Y)
所有精灵。添加(项目符号)
项目符号。添加(项目符号)
类怪物(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=virus\u img
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.radius=int(self.rect.width*0.85/2)
#pygame.draw.circle(self.image,红色,self.rect.center,self.radius)
self.rect.x=宽度-200
自校正y=400.5
self.speedx=random.randrange(-4,4)
self.speedy=random.randrange(-4,4)
def更新(自我):
self.rect.x+=self.speedx
self.rect.y+=自加速
如果self.rect.bottom>=高度-87:
self.speedy=-self.speedy
如果self.rect.top 700或self.rect.right<
0或self.rect.left>1000:
self.kill()
类别精神表:
#用于加载和分析spritesheet的实用程序类
def uuu init uuu(self,文件名):
self.spritesheet=pygame.image.load(文件名).convert()
def get_图像(自身、x、y、宽度、高度):
#从较大的精灵表中抓取图像
image=pygame.Surface((宽度、高度))
图像.blit(自精神表,(0,0),(x,y,宽度,高度))
图像。设置颜色键(黑色)
返回图像
#加载所有游戏图形
background=pygame.image.load(path.join(工作目录),
“'GameScreen.png'))。convert()
background\u rect=background.get\u rect()
player\u img=pygame.image.load(path.join(working\u dir,'dude.png')).convert()
病毒\u img=
pygame.image.load(path.join(working_dir,'badguy1.png')).convert()
项目符号\u img=
pygame.image.load(path.join(working_dir,'bullet.png')).convert()
dudeSpriteSheet=Spritesheet(路径.连接(工作目录),
“DudeSpriteSheet2.png”)
healthSheet=Spritesheet(path.join(working_dir,'health.png'))
病毒2_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()
子弹=pygame.sprite.Group()
玩家=玩家(健康)
所有精灵。添加(玩家)
对于范围(8)中的i:
newmob()
newmob2()
分数=0
#游戏循环
R