Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions background.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import pygame


class Background:
def __init__(self):
self.sprite = pygame.image.load('data/gfx/bg.png')
self.position = 0
self.uncoloredSprite = pygame.image.load('data/gfx/bg.png')
def setSprite(self, tint):
self.uncoloredSprite = pygame.image.load('data/gfx/bg.png')

def setSprite(self, tint):
copy = self.uncoloredSprite.copy()
color = colorsys.hsv_to_rgb(tint,1,1)
copy.fill((color[0]*255, color[1]*255, color[2]*255), special_flags=pygame.BLEND_ADD)
self.sprite = copy
color = colorsys.hsv_to_rgb(tint, 1, 1)
copy.fill((color[0] * 255, color[1] * 255, color[2] * 255), special_flags=pygame.BLEND_ADD)
self.sprite = copy
6 changes: 4 additions & 2 deletions bean.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import pygame
class Bean:


class Bean:
def __init__(self):
self.sprite = pygame.image.load('data/gfx/bean.png')
self.position = pygame.Vector2()
self.position.xy
self.position.xy
5 changes: 4 additions & 1 deletion button.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import pygame


class Button:
def __init__(self):
self.price = 3
self.level = 1
self.level = 1

sprite = pygame.image.load('data/gfx/button.png')
typeIndicatorSprite = pygame.image.load('data/gfx/null_indicator.png')
174 changes: 98 additions & 76 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
import pygame, sys, time, random, colorsys, math
from pygame.math import Vector2
import colorsys
import math
import pygame
import random
import sys
import time
from pygame.locals import *
from .player import Player
from .background import Background
from .button import Button
from .bean import Bean
from .utils import clamp
from .utils import checkCollisions

from background import Background
from bean import Bean
from button import Button
from player import Player
from utils import checkCollisions
from utils import clamp


def main():
pygame.init()
# set the display
DISPLAY=pygame.display.set_mode((640,480),0,32)
DISPLAY = pygame.display.set_mode((640, 480), 0, 32)
pygame.display.set_caption('Flappuccino')
pygame.display.set_icon(Bean().sprite)
# get fonts
Expand All @@ -33,27 +38,30 @@ def main():
beanfx = pygame.mixer.Sound("data/sfx/bean.wav")
deadfx = pygame.mixer.Sound("data/sfx/dead.wav")
# colors
WHITE=(255,255,255) # constant
WHITE = (255, 255, 255) # constant
# variables
rotOffset = -5
# creating a new object player
player = Player()
beans = []
buttons = []
# adding three buttons
for i in range(3): buttons.append(Button())
for i in range(3):
buttons.append(Button())
# now simply loading images based off of indexes in the list
buttons[0].typeIndicatorSprite = pygame.image.load('data/gfx/flap_indicator.png')
buttons[0].price = 5
buttons[0].price = 5
buttons[1].typeIndicatorSprite = pygame.image.load('data/gfx/speed_indicator.png')
buttons[1].price = 5
buttons[1].price = 5
buttons[2].typeIndicatorSprite = pygame.image.load('data/gfx/beanup_indicator.png')
buttons[2].price = 30
# getting 5 beans
for i in range(5): beans.append(Bean())
for i in range(5):
beans.append(Bean())
# now looping through the beans list
for bean in beans:
bean.position.xy = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width()), beans.index(bean)*-200 - player.position.y
bean.position.xy = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width()), beans.index(
bean) * -200 - player.position.y
# creating a list of backgrounds, with each index being an object
bg = [Background(), Background(), Background()]
# some variables that we need
Expand All @@ -68,7 +76,7 @@ def main():
framerate = 60
last_time = time.time()
splashScreenTimer = 0
#splash screen
# splash screen
# playing a sound
pygame.mixer.Sound.play(flapfx)
while splashScreenTimer < 100:
Expand All @@ -80,20 +88,21 @@ def main():

for event in pygame.event.get():
# if the user clicks the button
if event.type==QUIT:
if event.type == QUIT:
pygame.quit()
sys.exit()

DISPLAY.fill((231, 205, 183))
# fill the start message on the top of the game
startMessage = font_small.render("POLYMARS", True, (171, 145, 123))
DISPLAY.blit(startMessage, (DISPLAY.get_width()/2 - startMessage.get_width()/2, DISPLAY.get_height()/2 - startMessage.get_height()/2))

DISPLAY.blit(startMessage, (DISPLAY.get_width() / 2 - startMessage.get_width() / 2,
DISPLAY.get_height() / 2 - startMessage.get_height() / 2))

# update display
pygame.display.update()
# wait for 10 seconds
pygame.time.delay(10)

titleScreen = True
# title screen
pygame.mixer.Sound.play(flapfx)
Expand All @@ -102,7 +111,7 @@ def main():
dt *= 60
last_time = time.time()
# get the position of the mouse
mouseX,mouseY = pygame.mouse.get_pos()
mouseX, mouseY = pygame.mouse.get_pos()
# getting the keys pressed
clicked = False
keys = pygame.key.get_pressed()
Expand All @@ -111,22 +120,24 @@ def main():
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
clicked = True
# if the player quits
if event.type==QUIT:
if event.type == QUIT:
pygame.quit()
sys.exit()
# so the user clicked, and by any change the mouse's position was on the buttons
if (clicked and checkCollisions(mouseX, mouseY, 3, 3, DISPLAY.get_width()/2 - retry_button.get_width()/2, 288, retry_button.get_width(), retry_button.get_height())):
if (clicked and checkCollisions(mouseX, mouseY, 3, 3, DISPLAY.get_width() / 2 - retry_button.get_width() / 2,
288, retry_button.get_width(), retry_button.get_height())):
clicked = False
pygame.mixer.Sound.play(upgradefx)
titleScreen = False

DISPLAY.fill(WHITE)
DISPLAY.blit(title_bg, (0,0))
DISPLAY.blit(shadow, (0,0))
DISPLAY.blit(logo, (DISPLAY.get_width()/2 - logo.get_width()/2, DISPLAY.get_height()/2 - logo.get_height()/2 + math.sin(time.time()*5)*5 - 25))
DISPLAY.blit(retry_button, (DISPLAY.get_width()/2 - retry_button.get_width()/2, 288))
DISPLAY.blit(title_bg, (0, 0))
DISPLAY.blit(shadow, (0, 0))
DISPLAY.blit(logo, (DISPLAY.get_width() / 2 - logo.get_width() / 2,
DISPLAY.get_height() / 2 - logo.get_height() / 2 + math.sin(time.time() * 5) * 5 - 25))
DISPLAY.blit(retry_button, (DISPLAY.get_width() / 2 - retry_button.get_width() / 2, 288))
startMessage = font_small.render("START", True, (0, 0, 0))
DISPLAY.blit(startMessage, (DISPLAY.get_width()/2 - startMessage.get_width()/2, 292))
DISPLAY.blit(startMessage, (DISPLAY.get_width() / 2 - startMessage.get_width() / 2, 292))

pygame.display.update()
pygame.time.delay(10)
Expand All @@ -137,59 +148,62 @@ def main():
dt *= 60
last_time = time.time()
# again, get the position
mouseX,mouseY = pygame.mouse.get_pos()
mouseX, mouseY = pygame.mouse.get_pos()

jump = False
clicked = False
keys = pygame.key.get_pressed()
# get events
for event in pygame.event.get():
if event.type==pygame.KEYDOWN and event.key==K_SPACE:
if event.type == pygame.KEYDOWN and event.key == K_SPACE:
jump = True
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
clicked = True
if clicked and mouseY < DISPLAY.get_height() - 90:
jump = True
if event.type==QUIT:
if event.type == QUIT:
pygame.quit()
sys.exit()
camOffset = -player.position.y + DISPLAY.get_height()/2 - player.currentSprite.get_size()[1]/2

camOffset = -player.position.y + DISPLAY.get_height() / 2 - player.currentSprite.get_size()[1] / 2

DISPLAY.fill(WHITE)
for o in bg:
o.setSprite(((player.position.y/50) % 100) / 100)
o.setSprite(((player.position.y / 50) % 100) / 100)
DISPLAY.blit(o.sprite, (0, o.position))

color = colorsys.hsv_to_rgb(((player.position.y/50) % 100) / 100,0.5,0.5)
currentHeightMarker = font.render(str(height), True, (color[0]*255, color[1]*255, color[2]*255, 50 ))
DISPLAY.blit(currentHeightMarker, (DISPLAY.get_width()/2 - currentHeightMarker.get_width()/2, camOffset + round((player.position.y - startingHeight)/DISPLAY.get_height())*DISPLAY.get_height() + player.currentSprite.get_height() - 40))

color = colorsys.hsv_to_rgb(((player.position.y / 50) % 100) / 100, 0.5, 0.5)
currentHeightMarker = font.render(str(height), True, (color[0] * 255, color[1] * 255, color[2] * 255, 50))
DISPLAY.blit(currentHeightMarker, (DISPLAY.get_width() / 2 - currentHeightMarker.get_width() / 2,
camOffset + round((
player.position.y - startingHeight) / DISPLAY.get_height()) * DISPLAY.get_height() + player.currentSprite.get_height() - 40))

for bean in beans:
DISPLAY.blit(bean.sprite, (bean.position.x, bean.position.y + camOffset))

DISPLAY.blit(pygame.transform.rotate(player.currentSprite, clamp(player.velocity.y, -10, 5)*rotOffset), (player.position.x,player.position.y + camOffset))

DISPLAY.blit(pygame.transform.rotate(player.currentSprite, clamp(player.velocity.y, -10, 5) * rotOffset),
(player.position.x, player.position.y + camOffset))
DISPLAY.blit(shop_bg, (0, 0))
pygame.draw.rect(DISPLAY,(81,48,20),(21,437,150*(health/100),25))
pygame.draw.rect(DISPLAY, (81, 48, 20), (21, 437, 150 * (health / 100), 25))
DISPLAY.blit(shop, (0, 0))

for button in buttons:
DISPLAY.blit(button.sprite, (220 + (buttons.index(button)*125), 393))
priceDisplay = font_small.render(str(button.price), True, (0,0,0))
DISPLAY.blit(priceDisplay, (262 + (buttons.index(button)*125), 408))
levelDisplay = font_20.render('Lvl. ' + str(button.level), True, (200,200,200))
DISPLAY.blit(levelDisplay, (234 + (buttons.index(button)*125), 441))
DISPLAY.blit(button.typeIndicatorSprite, (202 + (buttons.index(button)*125), 377))
beanCountDisplay = font_small.render(str(beanCount).zfill(7), True, (0,0,0))
DISPLAY.blit(button.sprite, (220 + (buttons.index(button) * 125), 393))
priceDisplay = font_small.render(str(button.price), True, (0, 0, 0))
DISPLAY.blit(priceDisplay, (262 + (buttons.index(button) * 125), 408))
levelDisplay = font_20.render('Lvl. ' + str(button.level), True, (200, 200, 200))
DISPLAY.blit(levelDisplay, (234 + (buttons.index(button) * 125), 441))
DISPLAY.blit(button.typeIndicatorSprite, (202 + (buttons.index(button) * 125), 377))
beanCountDisplay = font_small.render(str(beanCount).zfill(7), True, (0, 0, 0))
DISPLAY.blit(beanCountDisplay, (72, 394))
if dead:
DISPLAY.blit(retry_button, (4, 4))
deathMessage = font_small.render("RETRY", True, (0, 0, 0))
DISPLAY.blit(deathMessage, (24, 8))
height = round(-(player.position.y - startingHeight)/DISPLAY.get_height())
player.position.x += player.velocity.x*dt

height = round(-(player.position.y - startingHeight) / DISPLAY.get_height())

player.position.x += player.velocity.x * dt
if player.position.x + player.currentSprite.get_size()[0] > 640:
player.velocity.x = -abs(player.velocity.x)
player.currentSprite = player.leftSprite
Expand All @@ -201,20 +215,21 @@ def main():
if jump and not dead:
player.velocity.y = -flapForce
pygame.mixer.Sound.play(flapfx)
player.position.y += player.velocity.y*dt
player.velocity.y = clamp(player.velocity.y + player.acceleration*dt, -99999999999, 50)
player.position.y += player.velocity.y * dt
player.velocity.y = clamp(player.velocity.y + player.acceleration * dt, -99999999999, 50)

health -= 0.2*dt
health -= 0.2 * dt
if health <= 0 and not dead:
dead = True
pygame.mixer.Sound.play(deadfx)


for bean in beans:
if bean.position.y + camOffset + 90 > DISPLAY.get_height():
bean.position.y -= DISPLAY.get_height()*2
bean.position.y -= DISPLAY.get_height() * 2
bean.position.x = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width())
if (checkCollisions(player.position.x, player.position.y, player.currentSprite.get_width(), player.currentSprite.get_height(), bean.position.x, bean.position.y, bean.sprite.get_width(), bean.sprite.get_height())):
if (checkCollisions(player.position.x, player.position.y, player.currentSprite.get_width(),
player.currentSprite.get_height(), bean.position.x, bean.position.y,
bean.sprite.get_width(), bean.sprite.get_height())):
dead = False
pygame.mixer.Sound.play(beanfx)
beanCount += 1
Expand All @@ -223,13 +238,14 @@ def main():
bean.position.x = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width())

for button in buttons:
buttonX,buttonY = 220 + (buttons.index(button)*125), 393
if clicked and not dead and checkCollisions(mouseX, mouseY, 3, 3, buttonX, buttonY, button.sprite.get_width(), button.sprite.get_height()):
buttonX, buttonY = 220 + (buttons.index(button) * 125), 393
if clicked and not dead and checkCollisions(mouseX, mouseY, 3, 3, buttonX, buttonY,
button.sprite.get_width(), button.sprite.get_height()):
if (beanCount >= button.price):
pygame.mixer.Sound.play(upgradefx)
button.level += 1
beanCount -= button.price
button.price = round(button.price*2.5)
button.price = round(button.price * 2.5)
if (buttons.index(button) == 0):
flapForce *= 1.5
if (buttons.index(button) == 1):
Expand All @@ -239,9 +255,12 @@ def main():
beanMultiplier += 10
for i in range(beanMultiplier):
beans.append(Bean())
beans[-1].position.xy = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width()), player.position.y - DISPLAY.get_height() - random.randrange(0, 200)

if dead and clicked and checkCollisions(mouseX, mouseY, 3, 3, 4, 4, retry_button.get_width(), retry_button.get_height()):
beans[-1].position.xy = random.randrange(0,
DISPLAY.get_width() - bean.sprite.get_width()), \
player.position.y - DISPLAY.get_height() - random.randrange(0, 200)

if dead and clicked and checkCollisions(mouseX, mouseY, 3, 3, 4, 4, retry_button.get_width(),
retry_button.get_height()):
health = 100
player.velocity.xy = 3, 0
player.position.xy = 295, 100
Expand All @@ -251,27 +270,30 @@ def main():
flapForce = 3
beanMultiplier = 5
buttons = []
for i in range(3): buttons.append(Button())
for i in range(3):
buttons.append(Button())
buttons[0].typeIndicatorSprite = pygame.image.load('data/gfx/flap_indicator.png')
buttons[0].price = 5
buttons[0].price = 5
buttons[1].typeIndicatorSprite = pygame.image.load('data/gfx/speed_indicator.png')
buttons[1].price = 5
buttons[1].price = 5
buttons[2].typeIndicatorSprite = pygame.image.load('data/gfx/beanup_indicator.png')
buttons[2].price = 30
beans = []
for i in range(5): beans.append(Bean())
for i in range(5):
beans.append(Bean())
for bean in beans:
bean.position.xy = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width()), beans.index(bean)*-200 - player.position.y
bean.position.xy = random.randrange(0, DISPLAY.get_width() - bean.sprite.get_width()), beans.index(
bean) * -200 - player.position.y
pygame.mixer.Sound.play(upgradefx)
dead = False
dead = False


bg[0].position = camOffset + round(player.position.y/DISPLAY.get_height())*DISPLAY.get_height()
bg[1].position = bg[0].position + DISPLAY.get_height()
bg[0].position = camOffset + round(player.position.y / DISPLAY.get_height()) * DISPLAY.get_height()
bg[1].position = bg[0].position + DISPLAY.get_height()
bg[2].position = bg[0].position - DISPLAY.get_height()

pygame.display.update()
pygame.time.delay(10)


if __name__ == "__main__":
main()
3 changes: 2 additions & 1 deletion player.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pygame


class Player:
position = pygame.Vector2()
position.xy = 295, 100
Expand All @@ -8,4 +9,4 @@ class Player:
acceleration = 0.1
rightSprite = pygame.image.load('data/gfx/player.png')
leftSprite = pygame.transform.flip(rightSprite, True, False)
currentSprite = rightSprite
currentSprite = rightSprite
Loading