Issue with script using Pygame

2019-08-22 02:29发布

问题:

I'm writing a small game in my spare time. This is what I have so far:

from pygame import * #import relevant modules
from PIL import Image
import os, sys

init() #initialise

class sprite:

    def __init__(self, object, x = 0, y = 0, w = 0, h = 0):
        self.image = image.load(object).convert()
        self.posx = x
        self.posy = y
        self.position = ((x, y, w, h))

    def resize(self, sh, sw):
        self.image = transform.scale(self.image, (sh, sw))
        return self.image

    def move(self, window, background, right, down):
        self.posx = x + right
        self.posy = y + down
        window.blit(background, self.position, self.position)
        self.position.move(right, down)
        window.blit(self, self.position)
        window.update()




os.chdir('C:\\Users\\alesi\\Documents\\Pygame\\Project\\') #current folder change

win = display.set_mode((736, 552))#load window
Clock = time.Clock() #handy clock

background = image.load('background.jpg').convert()#load images
player = sprite('ball.png', 350, 275, 20, 20)
player = player.resize(20, 20)

win.blit(background, (0, 0))
win.blit(player, (350, 275))
display.update()

while True:
    event.pump()
    keys = key.get_pressed()
    if keys[K_ESCAPE]:
        sys.exit()
    elif keys[K_RIGHT]:
        player.move(win, background, 20, 0)
    elif keys[K_LEFT]:
        player.move(win, background, -20, 0)
    elif keys[K_DOWN]:
        player.move(win, background,0, 20)
    elif keys[K_UP]:
        player.move(win, background, 0, -20)

In short, it should create an object on a background and allow you to move the object using the arrow keys. However, I get the error:

C:\Users\alesi\Documents\Pygame\Project>python2 game2.py
Traceback (most recent call last):
  File "game2.py", line 51, in <module>
    player.move(win, background, -20, 0)
AttributeError: 'pygame.Surface' object has no attribute 'move'

I'm struggling to understand why my player instance of the sprite class is not recognising the move method. Also, I'm confused by why during the win.blit() function, I have to give the argument player instead of player.image, the attribute which I've stored the image.

Any advice would be appreciated.

回答1:

In code

def resize(self, sh, sw):
    self.image = transform.scale(self.image, (sh, sw))
    return self.image

you returns image which is Surface instance - so in line

player = player.resize(20, 20)

you replace sprite instance with Surface instance

But you don't have to assign it to player again.

Do:

def resize(self, sh, sw):
    self.image = transform.scale(self.image, (sh, sw))
    # without return

# without player = 
player.resize(20, 20)

After that player.move(...) will work again.
And again you will have to use player.image in blit()