import math
import pygame
from pygame.locals import *
MIN_LENGTH = 35
MAX_LENGTH = 300
FLOOR_POS = 400
CEILING_POS = 200
screen = pygame.display.set_mode((640, 480))
head = pygame.image.load("frog_head.png")
head_open = pygame.image.load("frog_head_open.png")
legs = pygame.image.load("frog_legs.png")
locked_angle = 0
locked_mouse_pos = (0,0)
tongue_activated = False
tongue_length = 0
tongue_extending = False
tongue_retreating = False
tongue_locked = False
tongue_pos = (0,0)
done = False
mouse_pos = (0,0)
frog_pos = [320,240]
frog_dir = [0,0]
frog_standing = False
while not done:
for e in pygame.event.get():
if e.type == QUIT:
done = True
elif e.type == KEYDOWN:
if e.key == K_ESCAPE:
done = True
elif e.type == MOUSEBUTTONDOWN:
if e.button == 1:
if not tongue_activated:
tongue_activated = True
tongue_extending = True
tongue_retreating = False
elif e.button == 3 and not tongue_activated:
if frog_standing:
frog_dir[1] = -10
elif e.type == MOUSEBUTTONUP:
if e.button == 1:
if tongue_activated:
tongue_extending = False
tongue_retreating = True
tongue_locked = False
if frog_standing:
keys = pygame.key.get_pressed()
if keys[K_LEFT] and not keys[K_RIGHT]:
frog_dir[0] = -5
elif keys[K_RIGHT] and not keys[K_LEFT]:
frog_dir[0] = 5
else:
#if not tongue_locked:
frog_dir[0] = 0
#pass
elif tongue_locked:
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
frog_dir[0] -= 0.1
if keys[K_RIGHT]:
frog_dir[0] += 0.1
if tongue_locked:
if keys[K_UP]:
if tongue_length > MIN_LENGTH:
tongue_length -= 4
if keys[K_DOWN]:
if tongue_length < MAX_LENGTH:
tongue_length += 4
screen.fill((0,0,0))
mouse_pos = pygame.mouse.get_pos()
rel_mouse_pos = (mouse_pos[0]-frog_pos[0], mouse_pos[1]-frog_pos[1])
frog_dir[1] += 1
if frog_pos[1] + frog_dir[1] > FLOOR_POS:
frog_dir[1] = 0
frog_pos[1] = FLOOR_POS
frog_standing = True
else:
frog_standing = False
frog_pos[0] += frog_dir[0]
frog_pos[1] += frog_dir[1]
if rel_mouse_pos[1] == 0:
if rel_mouse_pos[0] < 0:
angle = -math.pi/2
else:
angle = math.pi/2
else:
angle = math.atan(float(rel_mouse_pos[0])/float(rel_mouse_pos[1]))
if rel_mouse_pos[1] >= 0:
angle += math.pi
angle += math.pi*13/48
if tongue_activated:
if tongue_extending:
if tongue_length < MAX_LENGTH:
tongue_length += 32
else:
tongue_extending = False
if tongue_retreating:
if tongue_length >= 64:
tongue_length -= 64
else:
tongue_activated = False
locked_angle = angle
locked_mouse_pos = rel_mouse_pos
rel_mouse_pos = locked_mouse_pos
angle = locked_angle
if not tongue_locked:
len = math.sqrt(math.pow(rel_mouse_pos[0],2) + math.pow(rel_mouse_pos[1],2))
tongue_pos = [frog_pos[0] + int(rel_mouse_pos[0]*tongue_length/len),
frog_pos[1] + int(rel_mouse_pos[1]*tongue_length/len)]
if tongue_pos[1] < CEILING_POS:
tongue_pos[1] = CEILING_POS
tongue_extending = False
tongue_locked = True
#tongue_length -= 20
if tongue_activated and tongue_locked:
diff = [tongue_pos[0]-(frog_pos[0]+frog_dir[0]), tongue_pos[1]-(frog_pos[1]+frog_dir[1])]
len = math.sqrt(math.pow(diff[0],2) + math.pow(diff[1],2))
if len < tongue_length:
#tongue_length = len
pass
if tongue_length < len:
frog_dir[0] += diff[0]/len*(len-tongue_length)
frog_dir[1] += diff[1]/len*(len-tongue_length)
diff = [tongue_pos[0]-frog_pos[0], tongue_pos[1]-frog_pos[1]]
angle = math.atan(float(diff[0])/diff[1])
if diff[1] >= 0:
angle += math.pi
angle += math.pi*13/48
if tongue_activated:
head_rotated = pygame.transform.rotate(head_open, 180.0/math.pi*angle)
else:
head_rotated = pygame.transform.rotate(head, 180.0/math.pi*angle)
locked_angle = angle
locked_mouse_pos = rel_mouse_pos
if tongue_activated:
pygame.draw.line(screen, (200,10,5), (frog_pos[0],frog_pos[1]), tongue_pos, 2)
pygame.draw.circle(screen, (210,15,10), (int(tongue_pos[0]),int(tongue_pos[1])), 3)
rect = head_rotated.get_rect()
rect.center = (frog_pos[0],frog_pos[1])
screen.blit(head_rotated, rect)
rect = legs.get_rect()
rect.center = (frog_pos[0],frog_pos[1])
screen.blit(legs, rect)
pygame.draw.line(screen, (255,255,255), (320,0), (320, 100))
pygame.draw.line(screen, (255,255,255), (320,380), (320, 480))
pygame.draw.line(screen, (255,255,255), (0,240), (100, 240))
pygame.draw.line(screen, (255,255,255), (540,240), (640, 240))
pygame.display.flip()