Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Image skipping
#1
Hey, this is my first post btw.

So I am trying to create a game where you can catch a ball and afterwards it refreshes. However the image of the ball that is supposed to run down the lane skips from screen_width (1280) - 100 all the way to x: 200 when it's updated with self.x -= self.speed. I don't know where it went wrong.

import sys
import pygame
from pygame.sprite import Group
from pygame.sprite import Sprite
from random import randint

import pygame
from pygame.sprite import Sprite

class Ball(Sprite):

    def __init__(self, ai_settings, screen):
        #Initialize alien and starting position

        super(Ball, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        self.speed = 1
        self.drop_speed = 10
        self.direction = 1

        #Load the alien image and set its Rect attribute
        self.image = pygame.image.load('ball.jpg')
        self.rect = self.image.get_rect()

        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        self.x = float(self.rect.x)

    def blitme(self):
        self.screen.blit(self.image, self.rect)

    def update(self):
        self.x -= self.speed / 10
        self.rect.x = self.x


class Bullet(Sprite):
    def __init__(self, sets, screen, ship):
        super(Bullet, self).__init__()
        self.screen = screen

        self.rect = pygame.Rect(0, 0, sets.bullet_width, sets.bullet_height)
        self.rect.centery = ship.rect.centery
        self.rect.right = ship.rect.right

        self.x = float(self.rect.x)
        self.color = sets.bullet_color
        self.speed = sets.bullet_speed

    def update(self):
        self.x += self.speed
        self.rect.x = self.x

    def draw_bullet(self):
        pygame.draw.rect(self.screen, self.color, self.rect)

class Gf():

    def check_keydown_events(event, sets, screen, ship, bullets):
        if event.key == pygame.K_UP:
            ship.moving_up = True
        elif event.key == pygame.K_DOWN:
            ship.moving_down = True
        elif event.key == pygame.K_c:
            # create a new bullet and add it to Group
            if len(bullets) < sets.allowed:
                new_bullet = Bullet(sets, screen, ship)
                bullets.add(new_bullet)

    def check_keyup_events(event, ship):
        if event.key == pygame.K_UP:
            ship.moving_up = False
        elif event.key == pygame.K_DOWN:
            ship.moving_down = False

    def check_events(self, sets, screen, ship, bullets):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                Gf.check_keydown_events(event, sets, screen, ship, bullets)
            elif event.type == pygame.KEYUP:
                Gf.check_keyup_events(event, ship)

    def update_screen(self, ai_settings, screen, ship, bg_color, bullets, balls):

        # Redraw the screen during each pass through the loop.
        screen.fill(bg_color)
        ship.blitme()
        balls.draw(screen)

        # Redraw all bullets behind ship and aliens.
        for bullet in bullets.sprites():
            bullet.draw_bullet()

        # Make the most recently drawn screen visible.
        pygame.display.flip()

    def update_balls(self, balls):
        balls.update()

    def create_ball(self, sets, screen, balls):

        for v in range(0,2):
            random_number = randint(-sets.screen_height / 2,sets.screen_height / 2)
            ball = Ball(sets, screen)
            at = Ball(sets, screen)
            at.rect.x = -1000
            at.rect.y = (sets.screen_height / 2) + random_number
            balls.add(at)

    def update_collision(self, balls, sets, screen, ships, bullets):
        # check for any bullets that have hit aliens

        collisions = pygame.sprite.groupcollide(ships, balls, False, True)

        if len(balls) == 0:
            Gf.create_ball(self, sets, screen, balls)

class Ship(Sprite):

    def __init__(self, settings, speed, screen, image):
        super(Ship, self).__init__()
        self.settings = settings
        self.speed = speed
        self.screen = screen
        self.image = pygame.image.load(image)

        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        self.rect.centery = self.screen_rect.centery
        self.rect.left = self.screen_rect.left

        self.center = float(self.rect.centerx)

        self.moving_up = False
        self.moving_down = False

    def update(self):

        if self.moving_up and self.rect.top > 0:
            self.rect.centery -= self.speed
        elif self.moving_down and self.rect.bottom < 800:
            self.rect.centery += self.speed

    def blitme(self):
        self.screen.blit(self.image, self.rect)

class Settings():

    def __init__(self, speed, screen):
        self.speed = speed
        self.screen = screen

    screen_width = 1200
    screen_height = 800

    # Bullet Settings
    bullet_speed = 2
    bullet_height = 15
    bullet_width = 5
    bullet_color = (255, 255, 255)
    allowed = 5

def rungame():
    pygame.init()

    screen_width = 1200
    screen_height = 800

    tgf = Gf()
    speed = 2
    bullets = Group()
    balls = Group()
    ships = Group()
    screen = pygame.display.set_mode((screen_width, screen_height))
    sets = Settings(speed, screen)
    ship = Ship(sets, speed, screen, 'p2/sidewayship.png')
    ships.add(ship)
    pygame.display.set_caption("Sideway shooter 1000")
    bg_color = (0, 0, 0)

    tgf.create_ball(sets, screen, balls)

    while True:
        for bullet in bullets.copy():
            if bullet.rect.right >= screen_width:
                bullets.remove(bullet)

        ship.update()
        tgf.check_events(sets, screen, ship, bullets)
        bullets.update()
        tgf.update_screen(sets, screen, ship, bg_color, bullets, balls)
        tgf.update_balls(balls)
        tgf.update_collision(balls, sets, screen, ships, bullets)

rungame()
codes of interest:

class Ball(Sprite):

    def __init__(self, ai_settings, screen):
        #Initialize alien and starting position

        super(Ball, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        self.speed = 1
        self.drop_speed = 10
        self.direction = 1

        #Load the alien image and set its Rect attribute
        self.image = pygame.image.load('ball.jpg')
        self.rect = self.image.get_rect()

        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        self.x = float(self.rect.x)
    def create_ball(self, sets, screen, balls):

        for v in range(0,2):
            random_number = randint(-sets.screen_height / 2,sets.screen_height / 2)
            ball = Ball(sets, screen)
            at = Ball(sets, screen)
            at.rect.x = -1000
            at.rect.y = (sets.screen_height / 2) + random_number
            balls.add(at)
Here's where it's supposed to start:
[Image: 24los35.png]

Here's where it starts:
[Image: 14uxkap.png]

How come I can't edit the post? =/

full code for class(Ball):

class Ball(Sprite):

    def __init__(self, ai_settings, screen):
        #Initialize alien and starting position

        super(Ball, self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        self.speed = 1
        self.drop_speed = 10
        self.direction = 1

        #Load the alien image and set its Rect attribute
        self.image = pygame.image.load('ball.jpg')
        self.rect = self.image.get_rect()

        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        self.x = float(self.rect.x)

    def blitme(self):
        self.screen.blit(self.image, self.rect)

    def update(self):
        self.x -= self.speed / 10
        self.rect.x = self.x
Reply


Messages In This Thread
Image skipping - by Aisuuu - May-10-2018, 03:01 PM
RE: Image skipping - by nilamo - May-10-2018, 03:19 PM
RE: Image skipping - by Aisuuu - May-10-2018, 03:36 PM
RE: Image skipping - by nilamo - May-10-2018, 04:22 PM
RE: Image skipping - by Aisuuu - May-10-2018, 04:59 PM

Forum Jump:

User Panel Messages

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