#
import os
import rabbyt
from rabbyt import lerp, wrap
from math import cos,sin,pi,sqrt,atan2
from random import *
import pygame
from pygame.locals import *
#setup window
pygame.init()
pygame.display.set_mode((640, 480), pygame.OPENGL | pygame.DOUBLEBUF)
rabbyt.set_viewport((640, 480))
rabbyt.set_default_attribs()
def collidelist_add(list):
for instance in list:
sprites.append(instance)
def collidelist_remove(list):
for instance in list:
if instance in sprites:
sprites.remove(instance)
#create pSprite class
class pSprite(rabbyt.Sprite):
def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0):
rabbyt.Sprite.__init__(self,x=x,y=y,texture=sprite,shape=shape)
self.dx=0
self.dy=0
self.gravity=gravity
self.grav=0.35
#This is a function to add a motion to the physics object...
#left over from the last iteration, not optimized for use yet.
#nevermind it.
# def motion_add(self,adddir,addspeed):
# cx1=addspeed*cos(adddir*(pi/180))
# cy1=addspeed*sin(adddir*(pi/180))
# cx2=self.speed*cos(self.direction*(pi/180))
# cy2=self.speed*sin(self.direction*(pi/180))
# nx,ny=(cx1+cx2,cy1+cy2)
# self.speed=sqrt(nx*nx+ny*ny)
# atta=atan2(ny,nx)
# self.direction=atta*(180/pi)
def getx(self):
return int(self.x)
def gety(self):
return int(self.y)
def place_free(self,newx,newy):
hit = 1
tempx=self.x
tempy=self.y
self.x=newx
self.y=newy
collisions = rabbyt.collisions.aabb_collide(sprites)
for pSpr1,pSpr2 in collisions:
if (isinstance(pSpr1,player) and isinstance(pSpr2,block)) or (isinstance(pSpr2,player) and isinstance(pSpr1,block)):
hit = 0
self.x=tempx
self.y=tempy
return hit
def move_contact(self,dir,iter):
for n in range(0,iter):
xcheck=int(self.getx())+cos(dir*(pi/180))
xcheck=int(xcheck*10000)/10000
ycheck=int(self.gety())+sin(dir*(pi/180))
ycheck=int(ycheck*10000)/10000
if self.place_free(xcheck,ycheck):
self.x=int(xcheck)
self.y=int(ycheck)
else:
break
def update(self):
if self.rot>360: self.rot-=360
if self.rot<0: self.rot+=360
self.x+=self.dx
self.y+=self.dy
if self.gravity > 0: self.dy-=self.grav
def handle_collision(self,other):pass
class player(pSprite):
def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0):
pSprite.__init__(self,x,y,sprite,shape,gravity)
self.maxxspeed=3
self.grav=0.25
self.xaccel = 1
self.rgb=(.7,.3,.6)
def update(self):
pSprite.update(self)
if pygame.key.get_focused:
keys = pygame.key.get_pressed()
if self.place_free(self.x-self.xaccel,self.y):
if keys[K_LEFT]: self.dx-=self.xaccel
if self.place_free(self.x+self.xaccel,self.y):
if keys[K_RIGHT]: self.dx+=self.xaccel
if keys[K_UP]:
if not self.place_free(self.x,self.y-1):
self.dy=5
if not keys[K_RIGHT] and not keys[K_LEFT]:
self.dx=self.dx*0.8
if abs(self.dx) > self.maxxspeed: self.dx = self.maxxspeed*self.dx/abs(self.dx) #limit speed
if self.place_free(self.getx(),self.gety()+self.dy) and self.place_free(self.getx()+self.dx,self.gety()): #handles weird collision,
if not self.place_free(self.x+self.dx,self.y+self.dy): #running into the wall/floor diagonally
self.dx=0
if self.place_free(self.x,self.y-1): #gravity
self.gravity=self.grav
if not self.place_free(self.x,self.y+self.dy): #handles vertical collision
self.gravity=0
self.move_contact(atan2(self.dy,0)*(180/pi),40)
self.dy=0
if not self.place_free(self.getx()+self.dx,self.gety()): #handles horizontal collision
self.move_contact(atan2(0,self.dx)*(180/pi),self.maxxspeed)
self.dx=0
print self.gravity
class block(pSprite):
def __init__(self,x=0,y=0,sprite=None,shape=None,gravity=0):
pSprite.__init__(self,x,y,sprite,shape,gravity)
self.rgb=(.2,.3,.4)
def update(self):
pSprite.update(self)
sprites=[]
player1=player(shape=(8,-8,-8,8))
sprites.append(player1)
b=block(y=-180,shape=(160,-8,-8,8))
sprites.append(b)
#b=block(y=-100,x=40,shape=(8,-8,-8,8))
#sprites.append(b)
#the gameloop
keepRunning = True
spawnTime = 40
c = pygame.time.Clock()
last_fps = 0
while keepRunning:
#messagepump
for event in pygame.event.get():
if event.type == QUIT:
keepRunning = False
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
keepRunning = False
#FPS
c.tick()
if pygame.time.get_ticks() - last_fps > 1000:
#print "FPS: ", c.get_fps()
last_fps = pygame.time.get_ticks()
#collision
collisions = rabbyt.collisions.brute_force(sprites)
for pSpr1,pSpr2 in collisions:
pSpr1.handle_collision(pSpr2)
pSpr2.handle_collision(pSpr1)
#the actual rendering code
rabbyt.clear() #clear the screen
for sprite in sprites[:]:
sprite.update()
sprite.render()
pygame.display.flip() #flip the buffers