首页 > 解决方案 > 在更新了我的类和我创建精灵的方式之后,移动的功能不再起作用

问题描述

在我设置了我的子类之后,我用来让它们与其他事物交互的功能不再起作用,我想知道通过设置一个列表来存储它们的位置或其他方式来解决这个问题的最佳方法,尽管我不是确定如何去做。其中一类:

 class Prey(pygame.sprite.Sprite):
        def __init__(Self):
            super().__init__()
            Self.preyImg=pygame.image.load('Prey.png')
            Self.preyX=300
            Self.preyY=700
            Self.screen= screen
            
             
        def Render(Self,Img,X,Y):
            Self.screen.blit(Img,(X,Y))
            
        def delete(Self):
            i.delete()

这是功能:

def Track(AgressorX,DefenderX,AgressorY,DefenderY):
global XMovement#make variables global so it actually works
global YMovement

if AgressorX > DefenderX:#finds whether its position then moves left/righ,up/down depending on its location
    XMovement=-0.25

elif AgressorX< DefenderX:
    XMovement=0.25
    
else:
    XMovement=0
    

if AgressorY > DefenderY:
    YMovement=-0.25
    
elif AgressorY < DefenderY: 
    YMovement=0.25
    
else:
    YMovement=0
    

我认为这可能是由于我如何设置渲染虽然我不完全确定

完整代码:

  #program to simulate wild life
#imports
import math
import random
import pygame,sys 
import random
import pdb
from pygame.locals  import *


timmer=1




class Animal(pygame.sprite.Sprite):
    def __init__(Self,):
        super().__init__()
        Self.Image=pygame.image.load('Blank.png').convert_alpha()
        Self.rect=Self.Image.get_rect()
        Self.Xpos=0
        Self.Xpos=0
        Self.Screen= screen
        #Self.Width=Width
        #Self.Height=Height
        #Self.Energy=0
        
        

    def BoundryX(entityX):
        if entityX<=0:
            entityX=0
        elif entityX>=600:
            entityX=600
            
    def BoundryY(entityY):
        if entityY<=0:
            entityY=0
        elif entityY>=800:
            entityY=800
            
   
        


        
class Predator(Animal):
    def __init__(Self):
        super().__init__()
        Self.Img=pygame.image.load('Icon.png')
        Self.PredatorX=0
        Self.PredatorY=0
        Self.screen= screen
        
        
    def Render(Self,Img,X,Y):
        Self.screen.blit(Img,(X,Y))
        
        



         
class Prey(pygame.sprite.Sprite):
    def __init__(Self):
        super().__init__()
        Self.preyImg=pygame.image.load('Prey.png')
        Self.preyX=300
        Self.preyY=700
        Self.screen= screen
        
         
    def Render(Self,Img,X,Y):
        Self.screen.blit(Img,(X,Y))
        
    def delete(Self):
        i.delete()



    
CarrotImg=pygame.image.load('carrot.png')
CarrotX=100
CarrotY=300
foodamount=7


def food():
    #CarrotX=random.randint(10,950)
    #CarrotY=random.randint(10,750)
    screen.blit(CarrotImg,(CarrotX,CarrotY))
    
    

#setup pygame
pygame.init()

#caption and Icons
pygame.display.set_caption("Game Of Life")

#predator icon

predatorImg=pygame.image.load('Icon.png')
predatorX=900
predatorY=100
predatorX_change=0


#Prey Icon
preyImg=pygame.image.load('Prey.png')
preyX=300
preyY=700
PreyX_change=0


        
#def delete():
        #prey.delete()
        
preyImg=pygame.image.load('Prey.png')
preyX=300
preyY=700
PreyX_change=0

#def Prey():
    #screen.blit(preyImg,(preyX,preyY))


#Finding closest prey
def FindClosestItem(AgressorX,DefenderX,AgressorY,DefenderY):
    dist = math.sqrt((AgressorX-DefenderX)**2 + (AgressorY-DefenderY)**2)#finds distance in pixels
    

#create pop out for game
screen=pygame.display.set_mode((1000,800))





def Track(AgressorX,DefenderX,AgressorY,DefenderY):
    global XMovement#make variables global so it actually works
    global YMovement
    
    if AgressorX > DefenderX:#finds whether its position then moves left/righ,up/down depending on its location
        XMovement=-0.25
    
    elif AgressorX< DefenderX:
        XMovement=0.25
        
    else:
        XMovement=0
        
    
    if AgressorY > DefenderY:
        YMovement=-0.25
        
    elif AgressorY < DefenderY: 
        YMovement=0.25
        
    else:
        YMovement=0
        
        
def EatPrey(predatorX,PreyX,predatorY,preyY):
    dist = math.sqrt((predatorX-preyX)**2 + (predatorY-preyY)**2)
    if dist < 20:
        return True
    else:
        return False


#setup test

predator=Predator()
prey=Prey()

#Sprite groups
all_sprites_Wolves=pygame.sprite.Group()


all_sprites_Rabbits=pygame.sprite.Group()


all_sprites_Carrots=pygame.sprite.Group()

    

#game loop
running=True
while running:

    #Back ground colour
    screen.fill((0,128,0))
    
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
    


    
   
    
    predator.Render(pygame.image.load('Icon.png'),600,700)
    prey.Render(pygame.image.load('Prey.png'),300,700)

    ClosestPrey=FindClosestItem(predatorX,preyX,predatorY,preyY)
    
    
    food()
    
    Track(predatorX,preyX,predatorY,preyY)
    predatorX+=XMovement
    predatorY+=YMovement
    #predatorX=BoundryX(predatorX)
    #predatorY=BoundryY(predatorY)
   
    
    Track(preyX,CarrotX,preyY,CarrotY)
    preyX+=XMovement
    preyY+=YMovement
    #preyX=BoundryX(preyX)
    #preyY=BoundryY(preyY)
    

    #Eat=EatPrey(preyX,preyY,predatorX,predatorY)
    
    #if Eat==True:
        #delete()
        #T=1
    
    #Boundry(prey)
    if preyX<=0:
        preyX=0
    elif preyX>=950:
        preyX=950
    if preyY<=0:
        preyY=0
    elif preyY>=750:
        preyY=750
        #preyY-=1

    #Boundry(predator)
    if predatorX<=0:
        predatorX=0
    elif predatorX>=950:
        predatorX=950
    elif predatorY<=0:
        predatorY=0
    elif predatorY>=750:
        predatorY=750


        
    pygame.display.update()
    
    timmer=timmer+1
    
   
    

标签: pythonpygame

解决方案


你的Sprites在固定位置渲染:

predator.Render(pygame.image.load('Icon.png'),600,700)
prey.Render(pygame.image.load('Prey.png'),300,700)

您必须分别在 ( preyX , preyY )位置( preyX , preyY ) 渲染Sprrite

predator.Render(predatorImg, predatorX, predatorY)
prey.Render(preyImg, preyX, preyY)

但是,您根本不需要变量。使用类的实例属性:

class Prey(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.img = pygame.image.load('Prey.png')
        self.x = 300
        self.y = 700
        self.screen = screen
             
    def Render(self):
        self.screen.blit(self.img, (self.x, self.y))
prey = Prey()

# [...]

running = True
while running:
    # [...]

    prey.Render()

    # [...]

    Track(prey.x, CarrotX, prey.y, CarrotY)
    prey.x += XMovement 
    prey.y += YMovement

最小的例子:

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

class Animal(pygame.sprite.Sprite):
    def __init__(self, image, x, y):
        super().__init__()
        self.x = x
        self.y = y
        self.image = image
        self.rect = self.image.get_rect(center = (x, y))
    def move(self, mx, my):
        self.x += mx
        self.y += my
        self.rect = self.image.get_rect(center = (self.x, self.y))
        
class Predator(Animal):
    def __init__(self):
        image = pygame.image.load('Icon.png')
        super().__init__(image, 600, 700)
         
class Prey(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.x = 300
        self.y = 700
        self.image = pygame.image.load('Prey.png')
        self.rect = self.image.get_rect(center = (self.x, self.y))
    def move(self, mx, my):
        self.x += mx
        self.y += my
        self.rect = self.image.get_rect(center = (self.x, self.y))

class Carrot(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.x = 100
        self.y = 700
        self.image = pygame.image.load('carrot.png')
        self.rect = self.image.get_rect(center = (self.x, self.y))
    def move(self, mx, my):
        self.x += mx
        self.y += my
        self.rect = self.image.get_rect(center = (self.x, self.y))

def Track(AgressorX,DefenderX,AgressorY,DefenderY):
    if AgressorX > DefenderX:
        XMovement=-0.25 
    elif AgressorX< DefenderX:
        XMovement=0.25
    else:
        XMovement=0
        
    if AgressorY > DefenderY:
        YMovement=-0.25
    elif AgressorY < DefenderY: 
        YMovement=0.25
    else:
        YMovement=0
    return XMovement, YMovement

pygame.init()
screen = pygame.display.set_mode((1000,800))
clock = pygame.time.Clock()

timmer = 1
predator = Predator()
prey = Prey()
carrot = Carrot()

all_sprites = pygame.sprite.Group()
all_sprites.add(predator)
all_sprites.add(prey)
all_sprites.add(carrot)

running=True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False

    mx, my = Track(predator.x, prey.x, predator.y, prey.y)
    predator.move(mx, my)

    mx, my = Track(prey.x, carrot.x, prey.y, carrot.y)
    prey.move(mx, my)

    screen.fill((0,128,0))
    all_sprites.draw(screen)
    pygame.display.update()
    timmer=timmer+1

pygame.quit()
exit()

推荐阅读