0

I am trying to create a game similar to "Bubble Trouble" in which the player detects eggs that are falling from the top of the screen. I have several problems with this.

  1. The eggs will not appear on the screen no matter how much I attempt at drawing them and having them appear at some point on the y axis
  2. I have no idea if the collision detection will work because
  3. the program wont open and there is no error message.

Please help me figure out a solutions to this problem. I was so excited to work on this when I started but after days of trying I am being disheartened. Thank you in advance.

Code:

import pygame, random
import Tkinter
from pygame.locals import *

# CONSTANTS
WWD = 1280  # Window width
WHT = 720  # Window height
BLACK =       (0,0,0) # Colors
WHITE = (255,255,255)
BACK = BLACK  # Background Color
FORE = WHITE  # Foreground Color
INT  = 40 # Time interval for game and key repeat
BG = pygame.image.load("barn.png")
BG = pygame.transform.scale(BG, (1280, 720))


pygame.init()
pygame.key.set_repeat(INT,INT) # pygame.init disables keyboard repetition. This reenables it with a delay and rep interval

class Label:
    def __init__(self,surf,cx,cy,fsize,strng,fcolor,bcolor):
        self.screen = surf
        self.fc = fcolor
        self.bc = bcolor
        self.font = pygame.font.SysFont(None,fsize)
        self.cx = cx
        self.cy = cy
        self.str = strng
        self.vis = False # tells if the label is visible

    def draw(self):
        self.text = self.font.render(self.str,True,self.fc,self.bc)
        self.rect = self.text.get_rect()
        self.rect.centerx = self.cx
        self.rect.centery = self.cy
        self.screen.blit(self.text,self.rect)
        pygame.display.update([self.rect])
        self.vis = True

    def undraw(self):
        self.text.fill(self.bc)
        self.screen.blit(self.text,self.rect)
        pygame.display.update([self.rect])
        self.vis = False
        

def OpeningScreen(Scr):
    Scr.blit(BG, (0, 0))
    pygame.display.update()
    L1 = Label(Display,WWD//2,WHT*3//8,WHT*3//50,"Use Arrow Keys to Begin",WHITE,BLACK)      #Creating the menus
    L1.draw()
    L2 = Label(Display,WWD//2,WHT*4//8,WHT*3//50,"Hit Q to Quit Anytime",WHITE,BLACK)        #Second menu option
    L2.draw()

class Player:

    def __init__(self,Scr,cx,cy,speed,bcolor):
        self.screen = Scr
        self.surf = pygame.image.load('player.png').convert_alpha()
        self.surf = pygame.transform.scale(self.surf, (160, 200)).convert_alpha()
        self.rect = self.surf.get_rect()
        self.rect.centerx = cx
        self.rect.y = 510
        self.speed = 30
        self.bc = bcolor

    def draw(self):
        self.screen.blit(self.surf,self.rect).convert_alpha()
        pygame.display.update([self.rect])

    def undraw(self):
        surf = self.surf.copy()
        surf.fill(self.bc)
        self.screen.blit(surf,self.rect)
        pygame.display.update([self.rect])
    
    def move(self,mv):
        self.undraw()
        if mv == 'd' and self.rect.bottom < WHT:
            self.rect.top += self.speed
        if mv == 'u' and self.rect.top > 0:
            self.rect.top -= self.speed
        if mv == 'l' and self.rect.left > 0:
            self.rect.left -= self.speed
        if mv == 'r' and self.rect.right < WWD:
            self.rect.right += self.speed
        self.draw()
        pygame.display.update()

    def jump(self,top,left):
        self.undraw()
        self.rect.top = top
        self.rect.left = left
        self.draw()
        pygame.display.update()
    
class EggDrop:

    def __init__(self,Scr):
        
        pygame.display.update()
        pygame.mixer.music.load('background.mid')
        pygame.mixer.music.play(-1,0.0)
        self.Mplay = True
        self.Player = Player(Scr,WWD//2,WHT//2,6,BLACK)
        Scr.blit(BG, (0, 0))
        self.Scr = Scr

    def toggleMusic(self):
        self.Mplay = not self.Mplay
        if self.Mplay:
            pygame.mixer.music.play(-1,0.0)
        else:
            pygame.mixer.music.stop()
   
    def togglePlayer(self):
        if self.Pvis:
            self.Player.undraw()
        else:
            self.Player.draw()
        self.Pvis = not self.Pvis

def hatchGif(self):
    #files in order animated
    files = ["pics\hatch1.gif", "pics\hatch2.gif", "pics\hatch2.gif", "pics\hatch3.gif", "pics\hatch4.gif", "pics\hatch5.gif", "pics\hatch6.gif", "pics\hatch7.gif", "pics\hatch8.gif", "pics\hatch9.gif", "pics\hatch10.gif", "pics\hatch11.gif", "pics\hatch12.gif", "pics\hatch13.gif"]
    photos = [Tkinter.PhotoImage(file=x) for x in files]
    label = Tkinter.Label()
    label.photos = photos
    label.counter = 0
    def next_pic():
        label['image'] = label.photos[label.counter%len(label.photos)]
        label.after(25, next_pic) #25 = speed of animation
        label.counter += 1
    label.pack()
    next_pic()

def splatGif(self):
    files = ["pics\splat1.gif", "pics\splat2.gif", "pics\splat2.gif", "pics\splat3.gif", "pics\splat4.gif", "pics\splat5.gif", "pics\splat6.gif", "pics\splat7.gif", "pics\splat8.gif"]
    photos = [Tkinter.PhotoImage(file=x) for x in files]
    label = Tkinter.Label()
    label.photos = photos
    label.counter = 0
    def next_pic():
        label['image'] = label.photos[label.counter%len(label.photos)]
        label.after(40, next_pic) #25 = speed of animation
        label.counter += 1
    label.pack()
    next_pic()

def eggs(self):
    while self.Player.draw():
        self.eggsImage = pygame.image.load('hatch1.gif')
        self.eggsImage = pygame.transform.scale(self.eggsImage, (30, 40))
        self.screen.blit(self.eggsImage)
        pygame.display.update([self.eggsImage])
        self.eggsImage.centerx = cx
        self.eggsImage.y = 300
        self.speed = 30

def detectCollisions(x1,y1,w1,h1,x2,y2,w2,h2):
    if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):
        return True
    elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):
        return True
    elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):
        return True
    elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):
        return True
    else:
        return False

class Sprite:
    def __init__(self,x,y,width,height):
        self.x=x
        self.y=y
        self.width=width
        self.height=height

    def render(self,collision):
        if (collision==True):
            hatchGif()
        else:
            pass
        
Sprite1=Player
Sprite2=eggs
 
moveX,moveY=0,0
 
gameLoop=True
while gameLoop:
    STOP = False
    while not STOP:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                gameLoop=False
                STOP = True
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_LEFT or event.key == ord('a'):
                    moveX = -4
                if event.key==pygame.K_RIGHT or event.key == ord('d'):
                    moveX = 4
                if event.key== K_SPACE:
                    detectCollisions()
            if event.type==pygame.KEYUP:
                if event.key == ord('q'):
                    STOP = True
                if event.key == K_ESCAPE:
                    STOP = True
                if event.key == ord('x'):
                    top = random.randint(0, WHT - self.Player.rect.height)
                    left = random.randint(0, WWD - self.Player.rect.width)
                    self.Player.jump(top,left)
                if event.key == ord('m'):
                    self.toggleMusic()
    pygame.mixer.music.stop()
    Sprite1.x+=moveX
    Sprite1.y+=moveY
    collisions=detectCollisions(Sprite1.x,Sprite1.y,Sprite1.width,Sprite1.height,Sprite2.x,Sprite2.y,Sprite2.width,Sprite2.height)
    Sprite1.render(collisions)
    Sprite2.render(False)
    pygame.display.flip()

Display = pygame.display.set_mode((WWD,WHT),0,0)
pygame.display.set_caption('Incubator 3000 V.1')


OpeningScreen(Display)

g = EggDrop(Display)
g.run()

pygame.quit()
Community
  • 1
  • 1
  • check indentions. It seems incorrect. Do you really need Tkinter? Can't you do it with pygame ? Pygame has own detectcollision functions – furas Nov 28 '15 at 08:00
  • I am using pygame for collision detection, Tkinter is just for the gifs in hatchEgg and splatEgg. Indentations check out. – salexand82m Nov 28 '15 at 16:43

0 Answers0