All pastes #914515 Raw Edit

Stwelin:platformer

public text v1 · immutable
·published 2008-02-22 23:06 UTC
rendered paste body
#

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