简体   繁体   中英

Move_ip does not work, moving Sprites

I am trying to make my Sprite move on the screen, I have created function that should make it happen but it does not work> the problem lies in move_ip function, but I don't know how to fix it. These are my first attempts with classes so any suggestions are welcome.

import pygame 
pygame.init() 

finish = False 
white = ( 255, 255, 255)
black = (0, 0, 0)
grey = (211, 211, 211)
font = pygame.font.Font("C:/Windows/Fonts/BRITANIC.TTF", 20) 
screen = pygame.display.set_mode((600, 400)) 
pygame.display.set_caption("Game") 

class Sprite(object):
    def __init__(self, name):
        self.health = 3
        self.name = name
        self.points = 0
        self.x = 25
        self.y = 25


    def printName(self):
        print (self.name)

class Dog(Sprite):
    def __init__(self, name):
        super(Dog, self).__init__(name)
        self.dog_img = pygame.image.load("dog_left.png")
        self.dog_rect = self.dog_img.get_rect()


    def drawDog(self, screen):
        screen.blit(self.dog_img, (self.x, self.y))

    def takeBone(self, sp1, sp2):
        takebone = pygame.sprite.collide_rect(sp1, sp2)
        if takebone == True:
            self.points += 1

    def moving(self):
        self.player_move_x = 0
        self.player_move_y = 0
        self.move = self.dog_img.move_ip(player_move_x, player_move_y)

class Bone(Sprite):
    def __init__(self, name):
        super(Bone, self).__init__(name)
        self.neme = "Bone"
        self.bone = pygame.image.load("bone.png")
        self.bone_rect = self.bone.get_rect()
        self.x = 250
        self.y = 250

    def drawBone(self, screen):
        screen.blit(self.bone, (self.x, self.y))


end_pos = 170

player_x = 10
player_y = 10


background = pygame.image.load("grass.png") 
background_rect = background.get_rect() 
size =  background.get_size() 
screen2 = pygame.display.set_mode(size) 

player = Dog("Tom")
bone = Bone("Bone")


timer = pygame.time.Clock()

while finish == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_move_x = -5
            if event.key == pygame.K_RIGHT:
                player_move_x = 5
            if event.key == pygame.K_UP:
                player_move_y = -5
            if event.key == pygame.K_DOWN:
                player_move_y = 5

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player_move_x = 0
            if event.key == pygame.K_RIGHT:
                player_move_x = 0
            if event.key == pygame.K_UP:
                player_move_y = 0
            if event.key == pygame.K_DOWN:
                player_move_y = 0


    screen.blit(background, background_rect)   
    player.drawDog(screen)
    bone.drawBone(screen)         




    pygame.display.flip()

    timer.tick(25)

pygame.quit()

I have made changes to my code:

import pygame

pygame.init() 

finish = False 
white = ( 255, 255, 255)
black = (0, 0, 0)
grey = (211, 211, 211)
font = pygame.font.Font("C:/Windows/Fonts/BRITANIC.TTF", 20) 
screen = pygame.display.set_mode((600, 400)) 
pygame.display.set_caption("Game") 

class Sprite(object):
    def __init__(self, name):
        self.health = 3
        self.name = name
        self.points = 0
        self.x = 25
        self.y = 25


    def printName(self):
        print (self.name)

class Dog(Sprite):
    def __init__(self, name):
        super(Dog, self).__init__(name)
        self.dog_img = pygame.image.load("dog_left.png")
        self.dog_rect = self.dog_img.get_rect()


    def drawDog(self, screen):
        screen.blit(self.dog_img, (self.x, self.y))

    def takeBone(self, sp1, sp2):
        takebone = pygame.sprite.collide_rect(sp1, sp2)
        if takebone == True:
            self.points += 1

    def moving(self):
        self.player_move_x = 0
        self.player_move_y = 0
        self.move = self.dog_rect.move_ip(self.player_move_x, self.player_move_y)

class Bone(Sprite):
    def __init__(self, name):
        super(Bone, self).__init__(name)
        self.neme = "Bone"
        self.bone = pygame.image.load("bone.png")
        self.bone_rect = self.bone.get_rect()
        self.x = 250
        self.y = 250

    def drawBone(self, screen):
        screen.blit(self.bone, (self.x, self.y))

background = pygame.image.load("grass.png") 
background_rect = background.get_rect() 
size =  background.get_size() 
screen2 = pygame.display.set_mode(size) 

player = Dog("Tom")
bone = Bone("Bone")


timer = pygame.time.Clock()

while finish == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finish = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                self.player_move_x = -5
            if event.key == pygame.K_RIGHT:
                self.player_move_x = 5
            if event.key == pygame.K_UP:
                player.dog_rect.move_ip(-5, 0)
                player_move_y = -5
            if event.key == pygame.K_DOWN:
                self.player_move_y = 5

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                self.player_move_x = 0
            if event.key == pygame.K_RIGHT:
                self.player_move_x = 0
            if event.key == pygame.K_UP:
                player.dog_rect.move_ip(0, 0)
                player_move_y = 0
            if event.key == pygame.K_DOWN:
                self.player_move_y = 0


    screen.blit(background, background_rect)   
    player.drawDog(screen)
    player.moving()
    bone.drawBone(screen)         

    pygame.display.flip()

    timer.tick(25)

pygame.quit()

First of all, you shouldn't name your class Sprite , since the name collides with the Sprite class of pygame.

Also, if you want to work with the Rect class, your classes don't need a x and y field to store its position, since you can use the Rect for that.

Let's look at the moving function:

self.player_move_x = 0
self.player_move_y = 0
self.move = self.dog_rect.move_ip(self.player_move_x, self.player_move_y)

Here you set player_move_x and player_move_y to 0 , then you want to move dog_rect with these values. Beside the fact that you never actually use dog_rect for blitting the image at the right position, moving a Rect by 0, 0 doesn't do anything.

There are some more errors in both code sample you've given, but your code should probably look like this (I added some comments for explanation):

import pygame

pygame.init() 

background = pygame.image.load("grass.png") 
background_rect = background.get_rect() 
size =  background.get_size() 
# only call set_mode once
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Game") 

# no need for three different classes
class MySprite(pygame.sprite.Sprite):
    def __init__(self, name, img_path, pos):
        super(MySprite, self).__init__()
        self.name = name
        self.image = pygame.image.load(img_path)
        self.rect = self.image.get_rect(topleft=pos)

    # use rect for drawing
    def draw(self, screen):
        screen.blit(self.image, self.rect)

    # use rect for moving
    def move(self, dir):
        self.rect.move_ip(dir)

player = MySprite("Tom", "dog_left.png", (10, 10))
bone = MySprite("Bone", "bone.png", (250, 250))

timer = pygame.time.Clock()

def main():
    points = 0
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return points

        # get all pressed keys
        pressed = pygame.key.get_pressed()
        # pressed[some_key] is 1 if the key some_key is pressed
        l, r, u, d = [pressed[k] for k in pygame.K_a, pygame.K_d, pygame.K_w, pygame.K_s]
        # create a tuple describing the direction of movement 
        # TODO: normalizing/different speed
        player.move((-l + r, -u + d))

        if pygame.sprite.collide_rect(player, bone):
            points += 1

        screen.blit(background, background_rect)   
        player.draw(screen)
        bone.draw(screen)

        pygame.display.flip()
        timer.tick(25)

if __name__ == '__main__':
    print main()

You don't seem to have any calls to moving from your main loop. This probably is the issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM