What if you put extra efforts on video game assignments----6
A downloadable game
Particle System (Rocket Landing Game)
Project Description
A simple rocket landing game with different difficulties selections and (real?) handcrafted physics simulation!
Assignment Rubrics
- 2 points - use PVectors to keep track of position/velocity and any other relevant 2D coordinates
- 8 points - have at least two different object classes, you need to be able to have many of the screen, they should animate/move around, and they should expire when appropriate (and remove themselves from the lists they are in)
- Extra Credit (2 points) - make it a game. This will probably involve some combination of a goal, fail/win state, score, and difficulty (with a curve too?).
My Code
# Rocket Landing Game
# Use Space to Ignite or shutdown Engine.
# Use wasd to control the throttle and angle
# Also, The minimum throttle is somewhere between 15- 25
GRAV_CONST = 0.002
ROCKET_SPWAN_X_POS = [600, 1000]
ROCKET_SPWAN_Y_POS = [80, 30]
ROCKET_SPWAN_X_VEL = [-0.1, -0.05]
ROCKET_SPWAN_Y_VEL = [0.15, 0.1]
isOnMenu = True
isOnGame = False
isOnScore = False
rocketNo = 1
planetNo = 1
mouseClickPasser = False
particleList = []
def setup():
global rocket, planet
size(1280,800)
rectMode(CENTER)
textMode(CENTER)
#print(getInitialRocketPos(), getInitialRocketVel())
rocket = Rocket(getInitialRocketPos(), getInitialRocketVel(), PVector(30, 100))
planet = Planet(100, color(133, 132, 121))
background(0)
def draw():
if isOnMenu:
drawMenu()
elif isOnGame:
drawGame()
elif isOnScore:
drawScore()
def drawMenu():
global rocketNo, planetNo, isOnMenu, isOnGame, rocket, planet
background(0)
fill(255)
textSize(30)
text("select your rocket to fly, your Choice is: " + str(rocketNo), 200, 100)
text("select your planet to land, your Choice is: " + str(planetNo), 200, 400)
if buttonCreation(300, 250, 200, 100, "Rocket 1 EZ"):
rocketNo = 1
if buttonCreation(600, 250, 200, 100, "Rocket 2 Mid"):
rocketNo = 2
if buttonCreation(900, 250, 200, 100, "Rocket 3 Hard"):
rocketNo = 3
if buttonCreation(300, 450, 200, 100, "Planet 1 EZ"):
planetNo = 1
if buttonCreation(600, 450, 200, 100, "Planet 2 Mid"):
planetNo = 2
if buttonCreation(900, 450, 200, 100, "Planet 3 Hard"):
planetNo = 3
if buttonCreation(640, 650, 300, 150, "Go"):
isOnMenu = False
isOnGame = True
rocket = Rocket(getInitialRocketPos(), getInitialRocketVel().mult(rocketNo), PVector(30, 100).mult(rocketNo))
planet = Planet(100 * planetNo, color(133, 132, 121))
def drawGame():
global rocket, planet
background(0)
rocket.update()
rocket.render()
for particle in particleList:
particle.update()
#print("update Success")
particle.render()
drawThrottleBar()
drawFuelBar()
planet.render()
drawScore()
def drawScore():
global rocket, planet
if rocket.landingStatus == True or rocket.landingStatus == False:
drawScoreBoard(rocket.landingStatus)
#_______Key Functions________#
def keyPressed():
global rocket
if key == ' ':
rocket.isEngineOn = not rocket.isEngineOn
elif key == 'w':
if rocket.throttle < rocket.maxThrottle:
rocket.throttle = rocket.throttle + 5
elif key == 's':
if rocket.throttle > rocket.minThrottle:
rocket.throttle = rocket.throttle - 5
elif key == 'a':
rocket.angularAcce = -1 * rocket.rotationPwr
elif key == 'd':
rocket.angularAcce = rocket.rotationPwr
def keyReleased():
if key == 'a' or key == 'd':
rocket.angularAcce = 0
if key == 'w' or key == 's':
rocket.throttle = rocket.throttle
#______Helper Function_______#
def getInitialRocketPos():
tempPosX = random(ROCKET_SPWAN_X_POS[0], ROCKET_SPWAN_X_POS[1])
tempPosY = random(ROCKET_SPWAN_Y_POS[0], ROCKET_SPWAN_Y_POS[1])
return PVector(tempPosX, tempPosY)
def getInitialRocketVel():
tempVelX = random(ROCKET_SPWAN_X_VEL[0], ROCKET_SPWAN_X_VEL[1])
tempVelY = random(ROCKET_SPWAN_Y_VEL[0], ROCKET_SPWAN_Y_VEL[1])
return PVector(tempVelX, tempVelY)
def drawThrottleBar():
global rocket
# Draw background of the throttle bar
fill(100)
rect(1250, 300, 20, 300)
# Current Throttle level
if rocket.isEngineOn:
fill(0, 255, 0)
else:
fill(255, 0, 0)
throttleLevelHeight = map(rocket.throttle, 0, 100, 0, 300)
rect(1250, 450 - throttleLevelHeight / 2, 20, rocket.throttle * 3)
print(rocket.throttle)
def drawFuelBar():
global rocket
fill(100)
rect(1200, 300, 20, 300)
if rocket.isEngineOn:
fill(240, 190, 53)
else:
fill(99, 87, 52)
fuelLevelHeight = map(rocket.fuel, 0, rocket.maxFuel, 0, 300)
rect(1200, 450 - fuelLevelHeight / 2, 20, fuelLevelHeight)
def drawScoreBoard(landingStatus):
if landingStatus == None:
pass
elif landingStatus == True:
fill(0, 255 ,0)
rect(width / 2, height / 2, width - 200, height - 150)
fill(0)
textSize(100)
text("You land successfully", 640, 400)
elif landingStatus == False:
fill(255, 0, 0)
rect(width / 2, height / 2, width - 200, height - 150)
fill(0)
textSize(100)
text("You failed", 640, 400)
def buttonCreation(posX, posY, sizeX, sizeY, tempText):
global mouseClickPasser
if (mouseX > posX - (0.5 * sizeX)) and (mouseX < (posX + (0.5 * sizeX))) and (mouseY > posY - (0.5 * sizeY)) and (mouseY < posY + (0.5 * sizeY)):
fill(200, 200, 250)
rect(posX, posY, sizeX, sizeY)
fill(40)
textSize(30)
text(tempText, posX - 0.5 * sizeX, posY)
if mouseClickPasser:
mouseClickPasser = False
return True
else:
fill(100, 100, 130)
rect(posX, posY, sizeX, sizeY)
fill(250)
textSize(30)
text(tempText, posX - 0.5 * sizeX, posY)
return False
def mouseClicked():
global mouseClickPasser
mouseClickPasser = True
#_______Yay, rocket Class_________#
class Rocket(object):
def __init__(self, tempPos, tempVel, tempSize):
self.pos = tempPos
self.vel = tempVel
self.siz = tempSize
self.isEngineOn = False
self.throttle = 100
self.angle = atan2(self.vel.y, self.vel.x)
self.angularVel = 0
self.angularAcce = 0
self.rotationPwr = 0.0003
self.throttlePwr = 0.03
self.maxThrottle = 100
self.minThrottle = 15
self.fuel = 1000
self.maxFuel = self.fuel
self.landingStatus = None
def update(self):
# Calculate the throttle
self.vel += PVector(0, GRAV_CONST)
if self.isEngineOn:
tempThrottleAcceY = -0.001 * self.throttle * self.throttlePwr
self.vel += PVector(0, tempThrottleAcceY).rotate(self.angle)
self.fuel -= self.throttle / 100.0
#print(self.fuel)
if self.fuel <= 0:
rocket.isEngineOn = False
self.pos += self.vel
# Calculate the Angle stuff
self.angularVel += self.angularAcce
self.angle += self.angularVel
self.checkCollisionWithPlanet(planet)
def render(self):
pushMatrix()
translate(self.pos.x, self.pos.y)
rotate(self.angle)
fill(255)
rect(0, 0, self.siz.x, self.siz.y)
popMatrix()
if self.isEngineOn:
#pass
self.addSmoke()
def addSmoke(self):
tempPos = self.pos.copy()
tempVel = PVector(cos(self.angle + 0.5 * PI), sin(self.angle + 0.5 * PI)).mult(self.throttle * 0.05)
newSmoke = Particle(tempPos, #self.pos + PVector(0, 0.5 * self.siz.y),
tempVel,
180,
50,
color(99, 87, 83),
0.5 * PI)
particleList.append(newSmoke)
#print("Init particle success:", len(particleList))
def checkCollisionWithPlanet(self, planet):
halfWidth = self.siz.x / 2
halfHeight = self.siz.y / 2
corners = [
PVector(-halfWidth, -halfHeight).rotate(self.angle) + self.pos,
PVector(halfWidth, -halfHeight).rotate(self.angle) + self.pos,
PVector(-halfWidth, halfHeight).rotate(self.angle) + self.pos,
PVector(halfWidth, halfHeight).rotate(self.angle) + self.pos
]
for corner in corners:
if corner.y >= height - planet.hgt:
if abs(self.vel.y) > 0.2 or abs(self.vel.x) > 0.2: # Adjust the speed threshold as necessary
print("Rocket exploded!")
self.landingStatus = False
else:
print("Safe landing!")
self.landingStatus = True
break
self.isEngineOn = False # Turn off the engine on collision
#________Particle Effects__________#
class Particle(object):
def __init__(self, tempPos, tempVel, tempLife, tempSize, tempColor, tempDispersion): #Dispersion should be radian
self.pos = tempPos
initialAngle = atan2(tempVel.y, tempVel.x) #WTF??? why first y then x?
tempDispersionAngle = random(-1 * tempDispersion / 2, tempDispersion / 2)
finalAngle = initialAngle + tempDispersionAngle
self.vel = PVector(cos(finalAngle), sin(finalAngle)) * tempVel.mag()
#self.vel = tempVel
self.curLife = 1.0
self.life = tempLife
#print("Life:", self.life)
self.siz = 0.0
self.finalSiz = tempSize
self.col = tempColor
def update(self):
#print("Part update called")
self.pos += self.vel
#print("Part pos calculated", self.curLife, self.finalSiz, self.siz)
self.siz = self.curLife / self.life * self.finalSiz
#print("siz calcualted")
self.curLife += 1.0
#print("cal finish")
if self.curLife >= self.life:
self.selfDeletion()
def render(self):
tempTransparentColor = color(0, 0, 0, 0)
tempColor = lerpColor(self.col,
tempTransparentColor,
(float(self.curLife) / float(self.life)))
#fill(255)
noStroke()
fill(tempColor)
#print(self.pos.x, self.pos.y, self.siz * 2)
circle(self.pos.x, self.pos.y, self.siz * 2)
def selfDeletion(self):
particleList.remove(self)
#_________Planet Class_________#
class Planet(object):
#TODO: change planet's color to actual image
def __init__(self, tempHeight, tempColor):
self.hgt = tempHeight
self.col = tempColor
def render(self):
fill(self.col)
#change it later to image
rect(width / 2, height - self.hgt / 2, width, self.hgt)
Screenshot

| Status | Prototype |
| Author | bohdns |
| Genre | Simulation |
| Tags | Retro, Souls-like |
Download
Download
application.windows64.zip 42 MB
Install instructions
Java 8 required~

Leave a comment
Log in with itch.io to leave a comment.