» »

pygame problem

pygame problem

dejco_h ::

zdravo folk kaj mi lahko kdo pomaga....torej delam preprost "platformer game" in sen naletel na ta error: win.blit(self.sprite, (self.rect.x, self.rect.y))
AttributeError: 'Player' object has no attribute 'sprite' hvala vam za pomoč že vnaprej

import pygame
import random
import math
import os
from os import listdir
from os.path import isfile,join

pygame.init()
pygame.display.set_caption("platformer game")
WIDTH,HEIGTH=1000,800
BG_COLOR=(255,255,255)

win=pygame.display.set_mode((WIDTH,HEIGTH))

def flip(sprites):
    return [pygame.transform.flip(sprite ,True,False) for sprite in sprites]

def load_spite_sheets(dir1,dir2,width,heigth,direction=False):
    path = join("assets", dir1, dir2)
    images = [f for f in listdir(path) if isfile(join(path, f))]

    all_sprites = {}

    for image in images:
        sprite_sheet = pygame.image.load(join(path, image)).convert_alpha()

        sprites = []
        for i in range(sprite_sheet.get_width() // width):
            surface = pygame.Surface((width, heigth), pygame.SRCALPHA, 32)
            rect = pygame.Rect(i * width, 0, width, heigth)
            surface.blit(sprite_sheet, (0, 0), rect)
            sprites.append(pygame.transform.scale2x(surface))

        if direction:
            all_sprites[image.replace(".png", "") + "_right"] = sprites
            all_sprites[image.replace(".png", "") + "_left"] = flip(sprites)
        else:
            all_sprites[image.replace(".png", "")] = sprites

    return all_sprites


def get_backGround(name):
    image=pygame.image.load(join("Assets","Background",name))
    _,_,width,heigth=image.get_rect()
    tiles=[]

    for i in range(WIDTH//width+1):
        for j in range(HEIGTH//heigth+1):
            pos=(i*width,j*heigth)
            tiles.append(pos)
    return tiles,image


PLAYER_VEL=5
FPS=60

class Player(pygame.sprite.Sprite):
    COLOR = (255, 0, 255)
    GRAVITY=1
    SPRITES=load_spite_sheets("MainCharacters","PinkMan",32,32,True)
    ANIMATION_DELAY=5
    def __init__(self,x,y,width,height):
        super().__init__()
        self.rect=pygame.Rect(x,y,width,height)
        self.x_vel=0
        self.y_Vel=0
        self.mask=None
        self.direction="left"
        self.animation_count=0
        self.fall_count=0


    def move(self,dx,dy):
        self.rect.x+=dx
        self.rect.y+=dy
    def move_left(self,vel):
        self.x_vel=-vel
        if self.direction!="left":
            self.direction="left"
            self.animation_count=0

    def move_right(self,vel):
        self.x_vel=vel
        if self.direction!="right":
            self.direction="right"
            self.animation_count=0




    def loop(self,fps):
        #self.y_Vel+=min(1,(self.fall_count/fps)*self.GRAVITY)
        self.move(self.x_vel,self.y_Vel)
        self.fall_count+=1
        self.update_sprite()

    def draw(self, win):
        win.blit(self.sprite, (self.rect.x, self.rect.y))

    def update_sprite(self):
        sprite_sheet="idle"
        if self.x_vel != 0:
            sprite_sheet = "run"
        sprite_sheet_name = sprite_sheet + "_" + self.direction
        sprites = self.SPRITES[sprite_sheet_name]
        sprite_index = (self.animation_count // self.ANIMATION_DELAY) % len(sprites)
        self.sprite = sprites[sprite_index]
        self.animation_count += 1







def handle_movement(player):
    keys=pygame.key.get_pressed()
    player.x_vel=0
    if keys[pygame.K_LEFT]:
        player.move_left(PLAYER_VEL)
    if keys[pygame.K_RIGHT]:
        player.move_right(PLAYER_VEL)


def draw(win,bckg,bg_image,player):
    for t in bckg:
        win.blit(bg_image,t)
    player.draw(win)
    pygame.display.update()


def main(win):
    clock=pygame.time.Clock()
    bckg,bg_image=get_backGround("purple.png")
    player=Player(100,100,50,50)
    run=True

    while run:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                run=False
                break

        draw(win,bckg,bg_image,player)
        handle_movement(player)
        player.loop(FPS)
    pygame.quit()
    quit()

if __name__=="__main__":
    main(win)



c23po ::

Funkcija player.loop se mora zgoditi pred funkcijo draw saj se objekt sprite inicializira v funkciji update_sprite, ki jo kličeš iz loop.
Računalniki nimajo spominov.

dejco_h ::

c23po je izjavil:

Funkcija player.loop se mora zgoditi pred funkcijo draw saj se objekt sprite inicializira v funkciji update_sprite, ki jo kličeš iz loop.


hvala lepa majstor maš pir v dobrem :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Return ne deluje[python]

Oddelek: Programiranje
8887 (751) Jonatan
!

[Python] Povezave

Oddelek: Programiranje
4243786 (4247) A110
»

Game Developer v Sloveniji

Oddelek: Programiranje
133057 (1605) shadeX
»

Predstavitev dvojiškega drevesa z seznamom

Oddelek: Programiranje
141795 (1395) ktka
»

Centriranje elementov menuja

Oddelek: Izdelava spletišč
141507 (1332) Jerry000

Več podobnih tem