M_Sea
M_Sea

Reputation: 491

Python Pygame how to put the rectangle on the center of the screen

I am really newer to study the python and doing the exercrise I want to create an rectange or any other graph such as i usepygame.Rect(x,y,w,h) and set the screen_center by

self.screen_rect=setting.screen.get_rect()
self.screent_center=self.screen_rect.center

but the rectange's center is not in the screen's center also i want use self.b=self.bullet.get_rect()but it show error how can i fix it? here's the code:

#! /usr/bin/python
import pygame as p
import sys

class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=p.RESIZABLE
        self.color=(255,255,255)
        self.speed=1
        self.screen=p.display.set_mode((self.w,self.h),self.flag)
        p.display.set_caption("Bullet")
        self.bullet_s=1
        self.bullet_w=100
        self.bullet_h=300
        self.bullet_c=(0,0,0)

class Bullet(p.sprite.Sprite):
    def __init__(self,setting):
        super().__init__()
        self.screen_rect=setting.screen.get_rect()
        self.screent_center=self.screen_rect.center

        self.bullet=p.Rect((self.screen_center),(setting.bullet_w,setting.bullet_h))   **<-- not in the center**


    self.b=self.bullet.get_rect() **<-- AttributeError: 'pygame.Rect' object has no attribute 'get_rect'**
        self.color=setting.bullet_c
        self.speed=setting.bullet_s
#        self.centery=float(self.bullet.centery)
    def bullet_move(self):
        self.y -= self.speed
        self.bullet.y=self.y
    def draw_bullet(self,setting):
        self.rect=p.draw.rect(setting.screen,self.color,self.bullet)


def game():
    p.init()
    setting=Setting(1200,800)
    bullet=Bullet(setting)


    while True:
        for event in p.event.get():
             if event.type == p.QUIT:
                 sys.exit()
        setting.screen.fill((255,0,0))
        bullet.draw_bullet(setting)
        p.display.flip()
game()

Upvotes: 0

Views: 3383

Answers (2)

tt-thoma
tt-thoma

Reputation: 16

This will calculate the position from the top-left corner of the sprite

screen = pygame.display.set_mode((1080, 720))

def getcenter(sprite):
    screen_size = screen.get_size()
    sprite_size = sprite.image.get_size()
    
    center_x = screen_size[0]/2 + sprite_size[0]/2
    center_y = screen_size[1]/2 + sprite_size[1]/2

    return (center_x, center_y)

getcenter(spritehere)

Upvotes: 0

furas
furas

Reputation: 142641

This code center rectangle on screen using

 self.screen_rect = setting.screen.get_rect()

 self.rect.center = self.screen_rect.center

It also moves rectangle when you press UP or DOWN.

It uses KEYDOWN, KEYUP to change speed and it runs move() in every loop and this function uses speed to change position (without checking keys).

It also compare rect.top with screen.top and rect.bottom with screen.bottom to stop rectangle when it touchs border of the screen.


BTW: I also add spaces and empty lines in code to make it more readable.

See: PEP 8 -- Style Guide for Python Code


import pygame as p

class Setting():

    def __init__(self, width, height):
        self.w = width
        self.h = height
        self.flag = p.RESIZABLE
        self.color = (255, 255, 255)
        self.speed = 1

        self.screen = p.display.set_mode((self.w, self.h), self.flag)

        p.display.set_caption("Bullet")

        self.bullet_s = 1
        self.bullet_w = 100
        self.bullet_h = 300
        self.bullet_c = (0, 0, 0)


class Bullet(p.sprite.Sprite):

    def __init__(self, setting):
        super().__init__()

        self.setting = setting

        self.screen_rect = setting.screen.get_rect()

        self.rect = p.Rect(0, 0, setting.bullet_w, setting.bullet_h)
        self.rect.center = self.screen_rect.center

        self.color = setting.bullet_c
        self.speed = 0 #setting.bullet_s

    def move(self):
        self.rect.y -= self.speed

        if self.rect.top < 0:
            self.rect.top = 0
        elif self.rect.bottom > self.screen_rect.bottom:
            self.rect.bottom = self.screen_rect.bottom

    def draw(self):
        p.draw.rect(self.setting.screen, self.color, self.rect)

    def handle_event(self, event):
        if event.type == p.KEYDOWN:

            if event.key == p.K_UP:
                self.speed = self.setting.bullet_s
            elif event.key == p.K_DOWN:
                self.speed = -self.setting.bullet_s

        elif event.type == p.KEYUP:

            if event.key == p.K_UP:
                self.speed = 0
            elif event.key == p.K_DOWN:
                self.speed = 0

def game():
    p.init()
    setting = Setting(1200,800)
    bullet = Bullet(setting)

    running = True
    while running:
        for event in p.event.get():
             if event.type == p.QUIT:
                 running = False
             bullet.handle_event(event)

        bullet.move()

        setting.screen.fill((255, 0, 0))
        bullet.draw()
        p.display.flip()

    p.quit()


game()

Upvotes: 3

Related Questions