The Hit Object Within the BlockLogic Superclass is Not Being Called

Question:

When I press the lowercase L key, I want the hit object to be called, reducing the length and width of the squares by 5 each time. It seems that the code within BlockNorm is not referencing the hit object within BlockLogic properly. There is no effect when l is pressed, but no errors either.

I attempted placing print(‘test’), and nothing was printed. If I paste self.blen -=5 and self.bwid -= 5 inside BlockNorm’s def init, it has effect. That is why I suspect it is not being connected to the superclass’s hit.


win = pygame.display.set_mode((800, 500))

run = True

while run:
    pygame.time.delay(100)

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

    keys = pygame.key.get_pressed()
   

    class BlockLogic:

        def __init__(self, blen, bwid, posx, posy):
            self.blen = blen  # the block’s length, width, & position
            self.bwid = bwid
            self.posx = posx
            self.posy = posy

        def hit(self):
            self.blen -= 5  # should reduce length and width by 5 each time l is pressed
            self.bwid -= 5
            if self.blen < 1:
                insertscorestuff = 'hi'
            else:
                placeholder = 'here'


    class BlockNorm(BlockLogic):
        def __init__(self, posx=None, posy=None):
            super().__init__(20, 20, posx, posy)  # features for the normal block type
            pygame.draw.rect(win, (250, 0, 0), (self.posx, self.posy, self.blen, self.bwid))

        def hit(self):
            if keys[pygame.K_l]:  # testing the hit, change later
                print('test')  # test does not print
                super().hit()

    win.fill((0, 0, 0))
    BlockNorm(200, 200)
    BlockNorm(500, 250)
    pygame.display.update()
Asked By: Cringe Factor

||

Answers:

As far as I can tell, the classes BlockNorm and BlockLogic are properly connected but the hit method is not called.

Put the class definitions (BlockLogic and BlockNorm) outside the run loop, then you can create instances and use their methods. The print('test') call is not executed because the method hit is never called. It "works" inside BlockNorm.__init__ because that method is automatically called when you create the instances with BlockNorm(200, 200) and BlockNorm(500, 250).

Here is an example how the code could look like:

class BlockLogic:
    def __init__(self, ...):
        ...

    def hit(self):
        ...

class BlockNorm(BlockLogic):
    def __init__(self, ...):
        ...

    def draw(self, win):
        pygame.draw.rect(win, (250, 0, 0), (self.posx, self.posy, self.blen, self.bwid))

# ...

block_norm1 = BlockNorm(200, 200)
block_norm2 = BlockNorm(500, 250)

run = True

while run:
    pygame.time.delay(100)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    
    win.fill((0, 0, 0))
    if keys[pygame.K_l]:
        block_norm1.hit()
        block_norm2.hit()
    block_norm1.draw(win)
    block_norm2.draw(win)
    pygame.display.update()
Answered By: Aemyl
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.