Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Napkin Platformer
#1
I have 2 issues:

1)I dont know how to run the program without adding a lot of loads of the same file in order for it not to crash when the for loop runs

2)my napkin image is not showing on screen

thanks a lot for the support



import pygame

pygame.init()

win = pygame.display.set_mode((1364, 500))
pygame.display.set_caption('Napkin')

walkRight = [pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin2.png')]
walkLeft = [pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png'), pygame.image.load('napkin.png'), pygame.image.load('napkin3.png')]
bg = pygame.image.load('bg1.png')

clock = pygame.time.Clock()

class player(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.vel = 5
        self.IsJump = False
        self.jumpCount = 5
        self.left = False
        self.right = False
        self.walkCount = 0
        self.standing = False
        self.hitbox = (self.x+20, self.y, 28, 60)

    def draw(self, win):
        if (self.walkCount < 3):
            if not (self.standing):
                if self.left:
                    win.blit(walkLeft[self.walkCount], (self.x, self.y))
                    self.walkCount += 1
                    print (self.walkCount)
                elif self.right:
                    win.blit(walkRight[self.walkCount], (self.x, self.y))
                    self.walkCount += 1
                    print (self.walkCount)

            else:
                if(self.right):
                    win.blit(walkRight[0], self.x, self.y)
            self.hitbox = (self.x + 20, self.y, 28, 60)
            print (self.walkCount)

            
def redrawGameWindow():
    global walkCount
    win.blit(bg, (0, 0))
    ##text = font.render('Score:' + str(score), 1, (0, 0, 0))
    ##win.blit(text, (380, 10))
    napkin.draw(win)

    pygame.display.update()

##mainloop
napkin = player(300, 410, 64, 64)
run = True

while run:
    clock.tick(27)

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

        keys=pygame.key.get_pressed()

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


    redrawGameWindow()

    pygame.display.update()
pygame.quit()
        

Attached Files

Thumbnail(s)
               
Reply
#2
1. Load images only once.
napkin = [
    pygame.image.load('napkin.png').convert_alpha(),
    pygame.image.load('napkin2.png').convert_alpha(),
    pygame.image.load('napkin3.png').convert_alpha()]
2. Learn pygame.Rect. It has 2d math built into it.
class Player(object):
    def __init__(x, y, w, h):
        self.rect = pygame.Rect(x, y , w, h)

Do not double call pygame.display.update.
Only do it once.

clock.tick belongs in game loop.
It must happen every frame.

remove global walkcount from redrawGameWindow().

Since image just repeat. Do something like.
self.walk_right = [0, 1]
self.walk_left = [0, 2]
self.walk = 'idle'

# in Player draw.
if self.walk == 'idle':
    win.blit(napkin[0], self.rect) # (x, y)
elif self.walk == 'right':
    win.blit(napkin[self.walk_count], self.rect) # (x, y)
    self.walk_count = (self.walk_count + 1) % len(self.walk_right)
elif self.walk == 'left':
    win.blit(napkin[self.walk_count], self.rect) # (x, y)
    self.walk_count = (self.walk_count + 1) % len(self.walk_left)
99 percent of computer problems exists between chair and keyboard.
Reply
#3
the reason why im loading the images several times its because im running a for loop, and i want to go through the list WalkLeft so that the napkin walks when you press left arrow, so, when you press left arrow the for loop runs as many times as the list allows it to run through the list.


Thanks for the support, i know there should be a better wa to do it, thanks a lot Big Grin
Reply
#4
1. There shouldn't be a list of the same image loaded several time
images = [
    pygame.image.load('napkin.png').convert_alpha(),
    pygame.image.load('napkin2.png').convert_alpha(),
    pygame.image.load('napkin3.png').convert_alpha()]


walk_left = 0, 2, 0, 2, 0, 2, 0, 2
walk_count = 0
# now you use position of walk_left to call loaded image
image = images[walk_left[walk_count]]
Here a full example.
background needs to be a bigger size for quality.
napkins needs transparent background.
import pygame
pygame.init()


# Did code to python pep 8 style guide.
# https://www.python.org/dev/peps/pep-0008/
class Player:
    @classmethod
    def load_images(cls):
        # convert image to pygame format will help with speed
        # convert_alpha() will not show invisable parts with pngs and jpg
        cls.images = [
            pygame.image.load('napkin.png').convert_alpha(),
            pygame.image.load('napkin2.png').convert_alpha(),
            pygame.image.load('napkin3.png').convert_alpha()]

    def __init__(self, x, y, w, h):
        self.rect = pygame.Rect(x, y, w, h)
        self.velocity = 5
        self.is_jumping = False
        self.jump_count = 5
        self.walk_left = 0, 2       # self.walk_left == (0, 2)
        self.walk_right = 0, 1
        self.walk_count = 0
        self.walk_pos = 0
        self.tick = 100
        self.next_tick = 100

    def can_move(self, ticks):
        if ticks > self.tick:
            self.tick += self.next_tick
            return True
        return False

    def draw(self, surface):
        surface.blit(Player.images[self.walk_pos], self.rect)

    def move_left(self):
        if self.rect.x > self.velocity:
            self.walk_count = (self.walk_count + 1) % len(self.walk_left)
            self.walk_pos = self.walk_left[self.walk_count]
            self.rect.x -= self.velocity

    def move_right(self, width):
        if self.rect.x < width - self.rect.width - self.velocity:
            self.walk_count = (self.walk_count + 1) % len(self.walk_right)
            self.walk_pos = self.walk_right[self.walk_count]
            self.rect.x += self.velocity

class Scene:
    def __init__(self):
        # basic pygame setup
        pygame.display.set_caption('Napkin Move')
        self.rect = pygame.Rect(0, 0, 1364, 500)
        self.surface = pygame.display.set_mode(self.rect.size)
        self.clock = pygame.time.Clock()

        # Scene setup
        Player.load_images()
        self.background = pygame.image.load('bg1.png').convert_alpha()
        self.background = pygame.transform.scale(self.background, self.rect.size)
        self.player = Player(300, 410, 64, 64)

    def mainloop(self):
        self.running = True
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:
                        self.player.move_left()
                    elif event.key == pygame.K_d:
                        self.player.move_right(self.rect.width)

            ticks = pygame.time.get_ticks()
            keys = pygame.key.get_pressed()

            if self.player.can_move(ticks):
                if keys[pygame.K_LEFT]:
                    self.player.move_left()
                elif keys[pygame.K_RIGHT]:
                    self.player.move_right(self.rect.width)

            # drawing
            self.surface.blit(self.background, (0,0))
            self.player.draw(self.surface)

            # draw code here

            pygame.display.flip()
            self.clock.tick(30)

if __name__ == '__main__':
    scene = Scene()
    scene.mainloop()
    pygame.quit()
99 percent of computer problems exists between chair and keyboard.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] platformer enemy animation Yegor123 3 1,960 May-03-2023, 08:42 AM
Last Post: Windspar
  Tkinter platformer game Linch1 1 5,117 Mar-10-2019, 03:17 AM
Last Post: Windspar
  platformer problem abscorpy 1 2,400 Dec-11-2018, 11:08 PM
Last Post: Windspar
  platformer problem abscorpy 4 3,588 Nov-27-2018, 08:46 PM
Last Post: nilamo
  Help On Platformer Spectroxis 2 10,013 Apr-27-2017, 09:56 PM
Last Post: metulburr

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020