class Pearl(object): def __init__(self,pos): self.img_url = "https://raw.githubusercontent.com/CougarTasker/twenty-four/master/proto/images/pearl.png" self.row = 3 self.column = 3 self.img = simplegui.load_image(self.img_url) self.bdim = Vector(self.img.get_width(),self.img.get_height()) self.adim = (self.bdim.x/self.column, self.bdim.y/self.row) self.center = Vector(self.adim[0]/2, self.adim[1]/2) self.pos = pos self.ratio = 0.2 self.frame_index = [1,1] self.count = 0 self.order = True def draw_canvas(self,canvas): self.count += 1 if self.count % 10 == 0: self.frame_index = self.next_frame() canvas.draw_image(self.img,(self.center.get_p()[0]*(2*self.frame_index[1]-1),self.center.get_p()[1]*(2*self.frame_index[0]-1)),self.adim,self.pos.get_p(),(self.adim[0]*self.ratio,self.adim[1]*self.ratio)) def next_frame(self): if self.order: self.frame_index[1] += 1 if self.frame_index[1] > self.column: self.frame_index[0] += 1 self.frame_index[1] = 1 else: self.frame_index[1] -= 1 if self.frame_index[1] == 0: self.frame_index[0]-=1 self.frame_index[1] = self.column if self.frame_index == [3,3]: self.order = False elif self.frame_index == [1,1]: self.order = True return self.frame_index
class bubblesheet(object): def __init__(self,pos): self.img_url = "https://raw.githubusercontent.com/CougarTasker/twenty-four/master/proto/images/Bubble1.png" self.row = 5 self.column = 6 self.img = simplegui.load_image(self.img_url) self.bdim = Vector(self.img.get_width(),self.img.get_height()) self.adim = (self.bdim.x/self.column, self.bdim.y/self.row) self.center = Vector(self.adim[0]/2, self.adim[1]/2) self.pos = pos self.ratio = 0.15 self.frame_index = [1,1] self.count = 0 def draw_canvas(self,canvas): self.count += 1 if self.count % 1 == 0: self.frame_index = self.next_frame() canvas.draw_image(self.img,(self.center.get_p()[0]*(2*self.frame_index[1]-1),self.center.get_p()[1]*(2*self.frame_index[0]-1)),self.adim,self.pos.get_p(),(self.adim[0]*self.ratio,self.adim[1]*self.ratio)) def next_frame(self): self.frame_index[1] += 1 if self.frame_index[1] > self.column: self.frame_index[0] += 1 self.frame_index[1] = 1 if self.frame_index[0] > self.row: self.frame_index = [1,1] return self.frame_index
class morebubble(object): def __init__(self, pos): self.img_url = "bubble2.png" self.row = 5 self.column = 15 self.img = simplegui.load_image(self.img_url) self.bdim = Vector(self.img.get_width(), self.img.get_height()) self.adim = (self.bdim.x / self.column, self.bdim.y / self.row) self.center = Vector(self.adim[0] / 2, self.adim[1] / 2) self.pos = pos self.ratio = 0.1 self.frame_index = [1, 0] self.count = 0 def draw_canvas(self, canvas): self.count += 1 if self.count % 5 == 0: self.frame_index = self.next_frame() canvas.draw_image( self.img, (self.center.get_p()[0] * (2 * self.frame_index[1] - 1), self.center.get_p()[1] * (2 * self.frame_index[0] - 1)), self.adim, self.pos.get_p(), (self.adim[0] * self.ratio, self.adim[1] * self.ratio)) def next_frame(self): if self.frame_index[1] > self.column: self.frame_index[0] += 1 self.frame_index[1] = 1 if self.frame_index[0] > self.row: self.frame_index = [1, 0] self.frame_index[1] += 1 return self.frame_index
class Score: def __init__(self, time, dim, die, frame): self.score = 0 self.time = time self.maxtime = 99.999 self.starttime = self.time.time() self.scoreh = 30 self.timeh = 20 self.padding = 5 self.size = Vector( frame.get_canvas_textwidth("Score: " + '{:04d}'.format(self.score), self.scoreh, "sans-serif") + self.padding * 2, self.padding * 2 + self.scoreh + self.timeh) self.pos = Vector(((Vector(dim[0], dim[1]) - self.size) / 2).x, 0) #reference to overlay class for if game ends self.die = die self.sound = Snd(self.time, "point.ogg", 0.5) def timeleft(self): t = self.maxtime - (self.time.time() - self.starttime) #checks if any time left and otherwise sets time to zero to avoid negative if t <= 0: t = 0 self.die.gameOver() #when timer reaches zero self.die.gameover calls the method in overlay to change to gameover state #return time left to user return t #set score to zero when user restarts def resetScore(self): self.score = 0 #score goes up when fish caught def incScore(self, score): self.sound.play() self.score += score #draw score and time to screen def draw(self, canvas): canvas.draw_polygon( (self.pos.get_p(), (self.pos + self.size.x * Vector(1, 0)).get_p(), (self.pos + self.size).get_p(), (self.pos + self.size.y * Vector(0, 1)).get_p()), 1, "rgba(255,255,255,0)", "rgba(50,50,50,0.7)") canvas.draw_text("Score: " + '{:04d}'.format(self.score), (self.pos + Vector(self.padding, self.scoreh)).get_p(), self.scoreh, "orange", "sans-serif") canvas.draw_text("Time: " + '{:02.3f}'.format(self.timeleft()), (self.pos + Vector(self.padding, self.scoreh + self.padding + self.timeh)).get_p(), 25, "yellow", "sans-serif")
class Player: def __init__(self, dimensions, time): self.time = time self.lastFrameTime = self.time.time() self.canvas_dim = dimensions #address needed to gain local directory to access images folder below addr = os.getcwd() ##image info + dimensions (constants) self.img = simplegui.load_image("file:///" + addr + "/images/boat2.png") self.dim = (4096, 4096) self.cen = (self.dim[0] / 2, self.dim[1] / 2) self.draw_dim = (140, 160) self.y_offset = 80 ##player position and velocity self.pos = Vector( self.draw_dim[0] / 2, self.draw_dim[1] / 5 + self.canvas_dim[1] * 0.3 - self.y_offset) self.vel = Vector(0, 0) def getPos(self): return self.pos def setPos(self, newPos): self.pos = newPos def getVel(self): return self.vel #setter for velocity not needed, so replaced by add velocity method def addVel(self, velocity): self.vel.add(velocity) #updates position based on velocity and frame rate def update(self): delta = self.time.time() - self.lastFrameTime self.lastFrameTime = self.time.time() self.pos.add(self.vel * delta) self.vel.multiply(0.85) #checks whether the user is within the horizontal bounds of the screen def inBounds(self): return ((self.draw_dim[0] / 2 <= self.pos.x) and (self.canvas_dim[0] - self.draw_dim[0] / 2 >= self.pos.x)) #sets users positions when they are reaching outer bounds def set(self): self.vel *= -1 if (self.pos.get_p()[0] < self.canvas_dim[0] / 2): self.pos = Vector(self.draw_dim[0] / 2 + 1, self.pos.y) else: self.pos = Vector(self.canvas_dim[0] - self.draw_dim[0] / 2 - 1, self.pos.y) #draws player ship sprite to canvas def draw(self, canvas): canvas.draw_image(self.img, self.cen, self.dim, self.pos.get_p(), self.draw_dim)