Ralph Perez
Ralph Perez

Reputation: 17

pygame images not loading?

How come my Goku sprites aren't loading my left and right image appear correct but my others aren't playing in motion? the mian thing am trying to accomplish is for my character images to work correctly in motion below is the code with a link to the full code description:

https://pastebin.com/umMJHNQj

import pygame

pygame.init()#We always need to initialize our pygame IN EVERY PROJECT/FILE

win = pygame.display.set_mode((500, 480))# Here win is representing "window" for our screen which we have set at 500 by 480

pygame.display.set_caption("First Game")#We are giving our Window/Screen a name

walkRight = [pygame.image.load('image/gokuR0.png'), pygame.image.load('image/gokutest2.png'), pygame.image.load('image/gokuR2.png')]
walkLeft = [pygame.image.load('image/gokuL0.png'), pygame.image.load('image/gokutest.png'), pygame.image.load('image/gokuL2.png')]
bg = pygame.image.load('image/bg.jpg')
char = pygame.image.load('image/goku sprite - standing.png')

clock = pygame.time.Clock()

class player():
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.isJump = False
        self.left = False
        self.right = False
        self.walkCount = 0
        self.jumpCount = 10
        self.standing = False

Here is where i have tried to alter the code but yet no results.

def draw(self, win):
    if self.walkCount + 1 >= 8:
        self.walkCount = 0

    if not self.standing:
        if self.left:
            win.blit(walkLeft[self.walkCount // 100], (self.x, self.y))
            self.walkCount += 1
        elif self.right:
            win.blit(walkRight[self.walkCount // 100], (self.x, self.y))
            self.walkCount += 1
    else:
        if self.right:
            win.blit(walkRight[0], (self.x, self.y))
        else:
            win.blit(walkLeft[0], (self.x, self.y))
    pygame.display.flip()
    print(walkLeft)
    print(walkRight)
class projectile():
    def __init__(self, x, y, radius, color, facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel = 8 * facing

    def draw(self, win):
        pygame.draw.circle(win, self.color, (self.x, self.y), self.radius)

All these images are working correctly yet can't seem to get my main characters images to work in properly in motion

class enemy():
    walkRight = [pygame.image.load("image/R1E.png"), pygame.image.load("image/R2E.png"), pygame.image.load("image/R3E.png"), pygame.image.load("image/R4E.png"), pygame.image.load("image/R5E.png"), pygame.image.load("image/R6E.png"), pygame.image.load("image/R7E.png"), pygame.image.load("image/R8E.png"), pygame.image.load("image/R9E.png"), pygame.image.load("image/R10E.png"), pygame.image.load("image/R11E.png")]
    walkLeft = [pygame.image.load("image/L1E.png"), pygame.image.load("image/L2E.png"), pygame.image.load("image/L3E.png"), pygame.image.load("image/L4E.png"), pygame.image.load("image/L5E.png"), pygame.image.load("image/L6E.png"), pygame.image.load("image/L7E.png"), pygame.image.load("image/L8E.png"), pygame.image.load("image/L9E.png"), pygame.image.load("image/L10E.png"), pygame.image.load("image/L11E.png")]
    def __init__(self, x, y, width, height, end):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x, self.end]
        self.walkcount = 0
        self.vel = 3

    def draw(self,win):
        self.move()
        if self.walkcount + 1 >= 33:
            self.walkcount = 0

        if self.vel > 0:
            win.blit(self.walkRight[self.walkcount // 3], (self.x, self.y))
            self.walkcount += 1
        else:
            win.blit(self.walkLeft[self.walkcount // 3], (self.x, self.y))
            self.walkcount += 1
    print(walkLeft)



    def move(self):
        if self.vel > 0:
            if self.x + self.vel < self.path[1]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkcount = 0

        else:
            if self.x - self.vel > self.path[0]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkcount = 0



def redrawGameWindow():
    win.blit(bg, (0, 0))
    goblin.draw(win)
    man.draw(win)
    for bullet in bullets:
        bullet.draw(win)

    pygame.display.update()


# mainloop
man = player(200, 400, 85, 85)
goblin = enemy(100, 400, 64, 64, 450)
bullets = []
run = True
while run:
    clock.tick(27)

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

    for bullet in bullets:
        if bullet.x < 500 and bullet.x > 0:
            bullet.x += bullet.vel
        else:
            bullets.pop(bullets.index(bullet))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_SPACE]:
        if man.left:
            facing = -1
        else:
            facing = 1

        if len(bullets) < 5:
            bullets.append(
                projectile(round(man.x + man.width // 2), round(man.y + man.height // 2), 6, (0, 0, 0), facing))

    if keys[pygame.K_LEFT] and man.x > man.vel:
        man.x -= man.vel
        man.left = True
        man.right = False
        man.standing = False
    elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
        man.x += man.vel
        man.right = True
        man.left = False
        man.standing = False
    else:
        man.standing = True
        man.walkCount = 0

    if not (man.isJump):
        if keys[pygame.K_UP]:
            man.isJump = True
            man.right = False
            man.left = False
            man.walkCount = 0
    else:
        if man.jumpCount >= -10:
            neg = 1
            if man.jumpCount < 0:
                neg = -1
            man.y -= (man.jumpCount ** 2) * 0.5 * neg
            man.jumpCount -= 1
        else:
            man.isJump = False
            man.jumpCount = 10

    redrawGameWindow()

pygame.quit()

Upvotes: 1

Views: 100

Answers (1)

Rabbid76
Rabbid76

Reputation: 211287

The issue is that self.walkCount is (integral) divided by 100:

win.blit(walkLeft[self.walkCount // 100], (self.x, self.y))

Note self.walkCount will never become grater than 7, because of:

if self.walkCount + 1 >= 8:
   self.walkCount = 0

So the result of self.walkCount // 100 is always 0.

Anyway this code makes no sense, since walkLeft and walkRight are lists containing 3 images. I recommend to do the following:

def draw(self, win):
    walkfps = 10

    if self.standing:
        self.walkCount = 0
        if self.right:
            win.blit(walkRight[0], (self.x, self.y))
        else:
            win.blit(walkLeft[0], (self.x, self.y))

    elif self.left:
        if self.walkCount // walkfps >= len(walkLeft):
            self.walkCount = 0 
        win.blit(walkLeft[self.walkCount // walkfps], (self.x, self.y))
        self.walkCount += 1

    elif self.right:
        if self.walkCount // walkfps >= len(walkRight):
            self.walkCount = 0 
        win.blit(walkRight[self.walkCount // walkfps], (self.x, self.y))
        self.walkCount += 1

If the images change to rapidly, then increase walkfps.

Upvotes: 1

Related Questions