From 0bbf84f2e6e0f53f14337a75f18893968dbbf377 Mon Sep 17 00:00:00 2001 From: jzerez Date: Tue, 6 Mar 2018 13:10:48 -0500 Subject: [PATCH 01/17] planning proposal added --- Planning for MP4 .pdf | Bin 0 -> 53460 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Planning for MP4 .pdf diff --git a/Planning for MP4 .pdf b/Planning for MP4 .pdf new file mode 100644 index 0000000000000000000000000000000000000000..a966e74f651bdbfdb7c84455bc4e74adc6dc99a0 GIT binary patch literal 53460 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

>8>O1552YYhfnGqx`T0vmA?8fc=;Ks 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

XDlOo3*;NeRlweH)KgLJ&`dOkGG<%` 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 eOnbL5f@YKY2RNbw{l*>ii_)+=>G*LfFlwB literal 0 HcmV?d00001 From 4fc2e744510e4b62b9751f3560ae2401c015c76d Mon Sep 17 00:00:00 2001 From: jzerez Date: Tue, 6 Mar 2018 14:18:31 -0500 Subject: [PATCH 02/17] frameworks for character and model --- character.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ model.py | 6 +++++ 2 files changed, 68 insertions(+) create mode 100644 character.py create mode 100644 model.py diff --git a/character.py b/character.py new file mode 100644 index 00000000..0b4e2d1d --- /dev/null +++ b/character.py @@ -0,0 +1,62 @@ +class Character: + def __init__(self, label + attack = 10, + defense = 10, + weight = 10, + jump_vel = 10, + speed = 10, + pos_x = 0, + pos_y = 0, + width = 10 + height = 25 + max_health = 100): + self.label = label + self.attack = attack + self.defense = defense + self.weight = weight + self.jump_vel = jump_vel + self.speed = speed + self.pos_x = pos_x + self.pos_y = pos_y + self.width = width + self.height = height + self.health = max_health + self.vel_y = 0 + + + self.lives = 3 + + def __str__(self): + output = self.label + ':\n' + output += "attack: " + str(self.attack) + output += "\ndefense: " + str(self.defense) + output += "\nweight: " + str(self.weight) + output += "\njump vel: " + str(self.jump_vel) + output += "\nspeed: " + str(self.speed) + output += "\nwidth: " + str(self.width) + output += "\nheight: " + str(self.height) + output += "\nhealth: " + str(self.health) + return output + + def in_air(self, *args): + """ + checks to see if character is in the air, or supported by terrain + *args are (probably) terrain objects and their coordinates + """ + for pos_y in args: + if self.pos_y == pos_y and self.: + return False + return True + + def alive(self): + """ + checks to see if the character is still alive + """ + return self.health > 0 + + def move(self, direction): + """ + updates the position of the character laterally. + direction is either -1 or 1 + """ + if self.pos_x += direction * self.speed diff --git a/model.py b/model.py new file mode 100644 index 00000000..8be6c21d --- /dev/null +++ b/model.py @@ -0,0 +1,6 @@ +import character +class Model: + def __init__(self, *args): + self.g = -10 + def gravity(self, game_object): + game_object.yvel += self.g From 1c0a44b2cfe043c2e0622f96e0ca0ccdb793a987 Mon Sep 17 00:00:00 2001 From: jzerez Date: Tue, 6 Mar 2018 18:45:43 -0500 Subject: [PATCH 03/17] completed basic movement script --- Basic_Movements.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Basic_Movements.py diff --git a/Basic_Movements.py b/Basic_Movements.py new file mode 100644 index 00000000..f1e8ea77 --- /dev/null +++ b/Basic_Movements.py @@ -0,0 +1,69 @@ +import pygame +from pygame.locals import * + +#Initialize the screen +screen = pygame.display.set_mode((1024, 768)) +pygame.display.set_caption("Smash Clone") + + +clock = pygame.time.Clock() +FPS = 30 + +#Variable to keep the game running +running = True + +#the sample rectangle, danny +danny = pygame.rect.Rect((20, 20, 250, 100)) +print(danny) + +#booleans for control toggles. +left = False +right = False +up = False +down = False + +while running: + #make the background pretty close to black + screen.fill((0, 15, 15)) + + #For each event at the moment: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + #KEYDOWN events toggle movement on + if event.type == KEYDOWN: + if event.key == pygame.K_LEFT: + left = True + if event.key == pygame.K_RIGHT: + right = True + if event.key == pygame.K_UP: + up = True + if event.key == pygame.K_DOWN: + down = True + #KEYUP events toggles movement off + if event.type == KEYUP: + if event.key == pygame.K_LEFT: + left = False + if event.key == pygame.K_RIGHT: + right = False + if event.key == pygame.K_UP: + up = False + if event.key == pygame.K_DOWN: + down = False + #actually moving the rectangle. move() is a fruitful function + if left: + danny = danny.move(-10, 0) + if right: + danny = danny.move(10, 0) + if up: + danny = danny.move(0, -10) + if down: + danny = danny.move(0, 10) + + #drawing the rectangle to the screen, and updating the screen + pygame.draw.rect(screen, [255, 255 ,255], danny) + pygame.display.update() + #clock for consistent for loop timing. + clock.tick(FPS) + +pygame.quit() From b8bb5ad12f4ae803eb7afe5ab1d0ac0ffa063b1d Mon Sep 17 00:00:00 2001 From: Micah Date: Thu, 8 Mar 2018 19:03:59 -0500 Subject: [PATCH 04/17] Terrain and graphics loading supported, with partially randomly generated terrain --- GameView.py | 19 +++++++++++++++++++ main.py | 17 +++++++++++++++++ model.py | 11 ++++++++++- terrain.py | 9 +++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 GameView.py create mode 100644 main.py create mode 100644 terrain.py diff --git a/GameView.py b/GameView.py new file mode 100644 index 00000000..d16c1b21 --- /dev/null +++ b/GameView.py @@ -0,0 +1,19 @@ +import pygame +import model +import terrain +class GameView: + def __init__(self, model, size): + self.model = model + self.size = size + self.screen = pygame.display.set_mode(size) + + + def draw(self): + """ + Updates graphics to game screen + """ + self.screen.fill(pygame.Color(200,210,255)) + for t in self.model.terrains: + pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) + + pygame.display.update() diff --git a/main.py b/main.py new file mode 100644 index 00000000..be6052ec --- /dev/null +++ b/main.py @@ -0,0 +1,17 @@ +import GameView +import model +import pygame +from pygame.locals import * +import time +if __name__ == "__main__": + model = model.Model() + print(model.terrains[0]) + view = GameView.GameView(model, (1000,1000)) + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + time.sleep(.001) + view.draw() + pygame.quit diff --git a/model.py b/model.py index 8be6c21d..830ae7d3 100644 --- a/model.py +++ b/model.py @@ -1,6 +1,15 @@ -import character +#import character +import terrain +import random class Model: def __init__(self, *args): self.g = -10 + self.terrains = [] + for i in range(10): + for j in range(3): + self.terrains.append(terrain.Terrain((i * 100,1000 - j * 100))) + for i in range(10): + if(random.randint(1,2) == 2): + self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) def gravity(self, game_object): game_object.yvel += self.g diff --git a/terrain.py b/terrain.py new file mode 100644 index 00000000..6ef0996c --- /dev/null +++ b/terrain.py @@ -0,0 +1,9 @@ +class Terrain: + def __init__(self, pos, size = (100,100), kind = "Ground"): + """ + Kind signifies the type of terrain (used for color and skins later) + Each object is one terrain "block", with a 100x100 default size + """ + self.pos = pos + self.size = size + self.kind = kind From 9e43da9fde9c9d8ca36c297742cbd1af282b171e Mon Sep 17 00:00:00 2001 From: Micah Date: Thu, 8 Mar 2018 19:51:09 -0500 Subject: [PATCH 05/17] physics fixedand visualized, acceleration added --- Basic_Movements.py | 2 +- GameView.py | 2 +- character.py | 41 +++++++++++++++++++++++++---------------- main.py | 36 +++++++++++++++++++++++++++++++++++- model.py | 9 +++++---- 5 files changed, 67 insertions(+), 23 deletions(-) diff --git a/Basic_Movements.py b/Basic_Movements.py index f1e8ea77..e3734453 100644 --- a/Basic_Movements.py +++ b/Basic_Movements.py @@ -63,7 +63,7 @@ #drawing the rectangle to the screen, and updating the screen pygame.draw.rect(screen, [255, 255 ,255], danny) pygame.display.update() - #clock for consistent for loop timing. + #clock for consistent for loop timing. clock.tick(FPS) pygame.quit() diff --git a/GameView.py b/GameView.py index d16c1b21..6f17f586 100644 --- a/GameView.py +++ b/GameView.py @@ -15,5 +15,5 @@ def draw(self): self.screen.fill(pygame.Color(200,210,255)) for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) - + pygame.draw.rect(self.screen, pygame.Color(100,100,100), pygame.Rect(self.model.char.pos_x, self.model.char.pos_y, self.model.char.width, self.model.char.height)) pygame.display.update() diff --git a/character.py b/character.py index 0b4e2d1d..3ebfb1e6 100644 --- a/character.py +++ b/character.py @@ -1,29 +1,26 @@ class Character: - def __init__(self, label + def __init__(self, pos_x = 0, pos_y = 0, label = "blank", attack = 10, defense = 10, weight = 10, jump_vel = 10, - speed = 10, - pos_x = 0, - pos_y = 0, - width = 10 - height = 25 + acceleration = .1, + width = 100, + height = 200, max_health = 100): self.label = label self.attack = attack self.defense = defense self.weight = weight self.jump_vel = jump_vel - self.speed = speed self.pos_x = pos_x self.pos_y = pos_y self.width = width self.height = height self.health = max_health + self.vel_x = 0 self.vel_y = 0 - - + self.acc_x = acceleration self.lives = 3 def __str__(self): @@ -32,7 +29,7 @@ def __str__(self): output += "\ndefense: " + str(self.defense) output += "\nweight: " + str(self.weight) output += "\njump vel: " + str(self.jump_vel) - output += "\nspeed: " + str(self.speed) + output += "\nspeed: " + str(self.acc_x) output += "\nwidth: " + str(self.width) output += "\nheight: " + str(self.height) output += "\nhealth: " + str(self.health) @@ -43,10 +40,10 @@ def in_air(self, *args): checks to see if character is in the air, or supported by terrain *args are (probably) terrain objects and their coordinates """ - for pos_y in args: - if self.pos_y == pos_y and self.: - return False - return True + #for pos_y in args: + #if self.pos_y == pos_y and self.: + #return False + #return True def alive(self): """ @@ -54,9 +51,21 @@ def alive(self): """ return self.health > 0 - def move(self, direction): + def accelerate(self, direction): + """ + updates the acceleration of the character, for movement on each frame + when there is no movement, acceleration = 0 + direction is -1 or 1 + """ + print("ha") + self.vel_x += self.acc_x * direction + if self.vel_x > 5: + self.vel_x = 5 + if self.vel_x < -5: + self.vel_x = -5 + def move(self): """ updates the position of the character laterally. direction is either -1 or 1 """ - if self.pos_x += direction * self.speed + self.pos_x += self.vel_x diff --git a/main.py b/main.py index be6052ec..d96bd12e 100644 --- a/main.py +++ b/main.py @@ -5,13 +5,47 @@ import time if __name__ == "__main__": model = model.Model() - print(model.terrains[0]) view = GameView.GameView(model, (1000,1000)) running = True + left, up, down, right = False, False, False, False while running: for event in pygame.event.get(): if event.type == QUIT: running = False time.sleep(.001) view.draw() + if event.type == KEYDOWN: + if event.key == pygame.K_LEFT: + left = True + if event.key == pygame.K_RIGHT: + right = True + if event.key == pygame.K_UP: + up = True + if event.key == pygame.K_DOWN: + down = True + if event.type == KEYUP: + if event.key == pygame.K_LEFT: + left = False + if event.key == pygame.K_RIGHT: + right = False + if event.key == pygame.K_UP: + up = False + if event.key == pygame.K_DOWN: + down = False + if(left): + model.char.accelerate(-1) + if(right): + model.char.accelerate(1) + if(right == False and left == False): + if(model.char.vel_x > 0): + model.char.accelerate(-1) + if(model.char.vel_x < 0): + model.char.vel_x = 0 + elif(model.char.vel_x < 0): + model.char.accelerate(1) + if(model.char.vel_x < 0): + model.char.vel_x = 0 + print(model.char.vel_x) + model.char.move() + pygame.quit diff --git a/model.py b/model.py index 830ae7d3..f106de99 100644 --- a/model.py +++ b/model.py @@ -1,4 +1,4 @@ -#import character +import character import terrain import random class Model: @@ -8,8 +8,9 @@ def __init__(self, *args): for i in range(10): for j in range(3): self.terrains.append(terrain.Terrain((i * 100,1000 - j * 100))) - for i in range(10): - if(random.randint(1,2) == 2): - self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) + #for i in range(10): + # if(random.randint(1,2) == 2): + # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) + self.char = character.Character(500, 600) def gravity(self, game_object): game_object.yvel += self.g From deb9628ed9f66e33b7d0ded2c968e2d777d2f0b3 Mon Sep 17 00:00:00 2001 From: jzerez Date: Fri, 9 Mar 2018 02:16:03 -0500 Subject: [PATCH 06/17] finished up x movement and jumping --- Basic_Movements.py | 2 +- GameView.py | 25 +++++++++++++-- character.py | 53 +++++++++++++++++++++----------- model.py | 76 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 131 insertions(+), 25 deletions(-) diff --git a/Basic_Movements.py b/Basic_Movements.py index e3734453..62f3ce3d 100644 --- a/Basic_Movements.py +++ b/Basic_Movements.py @@ -7,7 +7,7 @@ clock = pygame.time.Clock() -FPS = 30 +FPS = 120 #Variable to keep the game running running = True diff --git a/GameView.py b/GameView.py index 6f17f586..2a7fdc49 100644 --- a/GameView.py +++ b/GameView.py @@ -1,6 +1,8 @@ import pygame -import model import terrain +from character import Character +from model import Model +from pygame.locals import * class GameView: def __init__(self, model, size): self.model = model @@ -15,5 +17,24 @@ def draw(self): self.screen.fill(pygame.Color(200,210,255)) for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) - pygame.draw.rect(self.screen, pygame.Color(100,100,100), pygame.Rect(self.model.char.pos_x, self.model.char.pos_y, self.model.char.width, self.model.char.height)) + for char in self.model.characters: + pygame.draw.rect(self.screen, pygame.Color(100,100,100), pygame.Rect(char.pos_x, char.pos_y, char.width, char.height)) pygame.display.update() + +if __name__ == "__main__": + clock = pygame.time.Clock() + FPS = 30 + + char1 = Character(pos_x = 500, pos_y = 500, label = 'char1') + char2 = Character(label = 'char2') + model = Model(char1, char2) + view = GameView(model, (1000, 1000)) + while model.game_running: + for event in pygame.event.get(): + model.quit(event) + for char in model.characters: + model.x_movement(event, char) + model.y_movement(event, char) + model.update_motion() + view.draw() + clock.tick(FPS) diff --git a/character.py b/character.py index 3ebfb1e6..32bd1468 100644 --- a/character.py +++ b/character.py @@ -3,11 +3,13 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", attack = 10, defense = 10, weight = 10, - jump_vel = 10, - acceleration = .1, - width = 100, - height = 200, - max_health = 100): + jump_vel = -100, + acceleration = 3, + speed = 15, + width = 75, + height = 150, + max_health = 100, + max_jumps = 3): self.label = label self.attack = attack self.defense = defense @@ -21,7 +23,11 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.vel_x = 0 self.vel_y = 0 self.acc_x = acceleration + self.speed = speed + self.acc_direction = 0 self.lives = 3 + self.max_jumps = max_jumps + self.jumps = max_jumps def __str__(self): output = self.label + ':\n' @@ -29,21 +35,21 @@ def __str__(self): output += "\ndefense: " + str(self.defense) output += "\nweight: " + str(self.weight) output += "\njump vel: " + str(self.jump_vel) - output += "\nspeed: " + str(self.acc_x) + output += "\nacceleration: " + str(self.acc_x) + output += "\nspeed: " + str(self.speed) output += "\nwidth: " + str(self.width) output += "\nheight: " + str(self.height) output += "\nhealth: " + str(self.health) return output - def in_air(self, *args): + def in_air(self, terrain): """ checks to see if character is in the air, or supported by terrain *args are (probably) terrain objects and their coordinates """ - #for pos_y in args: - #if self.pos_y == pos_y and self.: - #return False - #return True + if self.pos_y >= terrain: + return False + return True def alive(self): """ @@ -51,21 +57,32 @@ def alive(self): """ return self.health > 0 - def accelerate(self, direction): + #NOTE: I think it is better if we didn't have acceleration in the x + #direction. If acceleration rate is slow, it makes manuvering hard. If the + #rate is high, then it is practically unnoticable. + def accelerate(self): """ updates the acceleration of the character, for movement on each frame when there is no movement, acceleration = 0 direction is -1 or 1 """ - print("ha") - self.vel_x += self.acc_x * direction - if self.vel_x > 5: - self.vel_x = 5 - if self.vel_x < -5: - self.vel_x = -5 + #NOTE: this is a pretty jank way of doing what I want, but i didn't + #want to overhaul your code + if self.acc_direction != 0: + self.vel_x += self.acc_x * self.acc_direction + if self.vel_x > self.speed: + self.vel_x = self.speed + if self.vel_x < -self.speed: + self.vel_x = -self.speed + else: + if self.vel_x > 0: + self.vel_x -= self.acc_x + elif self.vel_x < 0: + self.vel_x += self.acc_x def move(self): """ updates the position of the character laterally. direction is either -1 or 1 """ self.pos_x += self.vel_x + self.pos_y += self.vel_y diff --git a/model.py b/model.py index f106de99..3a25aecd 100644 --- a/model.py +++ b/model.py @@ -1,16 +1,84 @@ import character import terrain import random +import pygame +from pygame.locals import * + class Model: def __init__(self, *args): - self.g = -10 + self.game_running = True + self.g = 15 self.terrains = [] + self.characters = [] + + for char in args: + self.characters.append(char) + + #NOTE: Why is this a double for loop? We should just have one terrain + #object for the ground, not 30. for i in range(10): for j in range(3): self.terrains.append(terrain.Terrain((i * 100,1000 - j * 100))) #for i in range(10): # if(random.randint(1,2) == 2): # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) - self.char = character.Character(500, 600) - def gravity(self, game_object): - game_object.yvel += self.g + + def x_movement(self, event, game_object): + """ + Toggles the different modes of acceleration depending on key up + events and key down events. + """ + if not (event.type == KEYDOWN or event.type == KEYUP) or not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT): + return + left = False + right = False + #KEYDOWN events toggle movement on + if event.type == KEYDOWN: + if event.key == pygame.K_LEFT: + left = True + if event.key == pygame.K_RIGHT: + right = True + #KEYUP events toggles movement off + if event.type == KEYUP: + if event.key == pygame.K_LEFT: + left = False + if event.key == pygame.K_RIGHT: + right = False + #If left XOR right + if left != right: + if left: + game_object.acc_direction = -1 + if right: + game_object.acc_direction = 1 + #Slow character down when there's conflicting input or no input + else: + game_object.acc_direction = 0 + + def y_movement(self, event, game_object): + """ + used to update the v velocity of the object + """ + #KEYUP events toggles movement off + if event.type == KEYDOWN: + if event.key == pygame.K_UP and game_object.jumps > 0: + game_object.vel_y = game_object.jump_vel + game_object.jumps -= 1 + print("up", game_object.vel_y) + + def update_motion(self): + """ + Updates the position and velocity of each character. + """ + for char in self.characters: + if char.in_air(800 - 1.5 * char.height): + char.vel_y += self.g + elif char.vel_y > 0: + char.vel_y = 0 + char.pos_y = 800 - char.height + char.jumps = char.max_jumps + char.accelerate() + char.move() + + def quit(self, event): + if event.type == QUIT: + self.game_running = False From f59ecaf83ae1b5a3bb9a381a80caf1bb688fee01 Mon Sep 17 00:00:00 2001 From: jzerez Date: Fri, 9 Mar 2018 15:09:16 -0500 Subject: [PATCH 07/17] fluid movement and character rectangle attributes --- GameView.py | 2 +- character.py | 36 +++++++++++++++++++++++------------- model.py | 29 ++++++++++++++++------------- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/GameView.py b/GameView.py index 2a7fdc49..056889e5 100644 --- a/GameView.py +++ b/GameView.py @@ -18,7 +18,7 @@ def draw(self): for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) for char in self.model.characters: - pygame.draw.rect(self.screen, pygame.Color(100,100,100), pygame.Rect(char.pos_x, char.pos_y, char.width, char.height)) + pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.rect) pygame.display.update() if __name__ == "__main__": diff --git a/character.py b/character.py index 32bd1468..e6d0b271 100644 --- a/character.py +++ b/character.py @@ -1,11 +1,14 @@ +import pygame +from pygame.locals import * + class Character: def __init__(self, pos_x = 0, pos_y = 0, label = "blank", attack = 10, defense = 10, weight = 10, jump_vel = -100, - acceleration = 3, - speed = 15, + acceleration = 5, + speed = 20, width = 75, height = 150, max_health = 100, @@ -20,6 +23,10 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.width = width self.height = height self.health = max_health + self.left = False + self.right = False + self.attacking = False + self.damaged = False self.vel_x = 0 self.vel_y = 0 self.acc_x = acceleration @@ -28,6 +35,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.lives = 3 self.max_jumps = max_jumps self.jumps = max_jumps + self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) def __str__(self): output = self.label + ':\n' @@ -68,17 +76,18 @@ def accelerate(self): """ #NOTE: this is a pretty jank way of doing what I want, but i didn't #want to overhaul your code - if self.acc_direction != 0: - self.vel_x += self.acc_x * self.acc_direction - if self.vel_x > self.speed: - self.vel_x = self.speed - if self.vel_x < -self.speed: - self.vel_x = -self.speed - else: - if self.vel_x > 0: - self.vel_x -= self.acc_x - elif self.vel_x < 0: - self.vel_x += self.acc_x + self.vel_x += self.acc_x * self.acc_direction + if self.vel_x > self.speed: + self.vel_x = self.speed + if self.vel_x < -self.speed: + self.vel_x = -self.speed + + #Decelerates the object when there are no inputs. + # if self.vel_x > 0: + # self.vel_x -= self.acc_x + # elif self.vel_x < 0: + # self.vel_x += self.acc_x + def move(self): """ updates the position of the character laterally. @@ -86,3 +95,4 @@ def move(self): """ self.pos_x += self.vel_x self.pos_y += self.vel_y + self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) diff --git a/model.py b/model.py index 3a25aecd..e943e2a9 100644 --- a/model.py +++ b/model.py @@ -28,31 +28,31 @@ def x_movement(self, event, game_object): Toggles the different modes of acceleration depending on key up events and key down events. """ - if not (event.type == KEYDOWN or event.type == KEYUP) or not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT): + if (not (event.type == KEYDOWN or event.type == KEYUP) or + not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT)): return - left = False - right = False + #KEYDOWN events toggle movement on if event.type == KEYDOWN: if event.key == pygame.K_LEFT: - left = True + game_object.left = True if event.key == pygame.K_RIGHT: - right = True + game_object.right = True #KEYUP events toggles movement off if event.type == KEYUP: if event.key == pygame.K_LEFT: - left = False + game_object.left = False if event.key == pygame.K_RIGHT: - right = False + game_object.right = False #If left XOR right - if left != right: - if left: - game_object.acc_direction = -1 - if right: - game_object.acc_direction = 1 + if game_object.left or game_object.right: + if game_object.left: + game_object.vel_x = -game_object.speed + if game_object.right: + game_object.vel_x = game_object.speed #Slow character down when there's conflicting input or no input else: - game_object.acc_direction = 0 + game_object.vel_x = 0 def y_movement(self, event, game_object): """ @@ -64,6 +64,9 @@ def y_movement(self, event, game_object): game_object.vel_y = game_object.jump_vel game_object.jumps -= 1 print("up", game_object.vel_y) + def attack(self, event): + if event.type == KEYDOWN: + if event.key == def update_motion(self): """ From 9062a916dfcea7929e12097431525f445dfa2d30 Mon Sep 17 00:00:00 2001 From: Micah Date: Fri, 9 Mar 2018 15:16:37 -0500 Subject: [PATCH 08/17] added functionality for changing keyboard controls --- GameView.py | 3 ++- character.py | 4 +++- model.py | 20 ++++++++------------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/GameView.py b/GameView.py index 2a7fdc49..5f35937c 100644 --- a/GameView.py +++ b/GameView.py @@ -26,7 +26,8 @@ def draw(self): FPS = 30 char1 = Character(pos_x = 500, pos_y = 500, label = 'char1') - char2 = Character(label = 'char2') + char2 = Character(label = 'char2', keys = {"left": pygame.K_a, "right": pygame.K_d, "up" : pygame.K_w, "down": + pygame.K_s, "attack" : pygame.K_SLASH}) model = Model(char1, char2) view = GameView(model, (1000, 1000)) while model.game_running: diff --git a/character.py b/character.py index 32bd1468..ecabc2cb 100644 --- a/character.py +++ b/character.py @@ -1,3 +1,4 @@ +import pygame class Character: def __init__(self, pos_x = 0, pos_y = 0, label = "blank", attack = 10, @@ -9,7 +10,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", width = 75, height = 150, max_health = 100, - max_jumps = 3): + max_jumps = 3, keys = {"left": pygame.K_LEFT, "right": pygame.K_RIGHT, "up" : pygame.K_UP, "down": pygame.K_DOWN, "attack": pygame.K_SLASH}): self.label = label self.attack = attack self.defense = defense @@ -28,6 +29,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.lives = 3 self.max_jumps = max_jumps self.jumps = max_jumps + self.keys = keys def __str__(self): output = self.label + ':\n' diff --git a/model.py b/model.py index 3a25aecd..5696f949 100644 --- a/model.py +++ b/model.py @@ -14,35 +14,31 @@ def __init__(self, *args): for char in args: self.characters.append(char) - #NOTE: Why is this a double for loop? We should just have one terrain - #object for the ground, not 30. - for i in range(10): - for j in range(3): - self.terrains.append(terrain.Terrain((i * 100,1000 - j * 100))) + self.terrains.append(terrain.Terrain((0,600), (1000,400))) #for i in range(10): # if(random.randint(1,2) == 2): - # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) + # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100)))s def x_movement(self, event, game_object): """ Toggles the different modes of acceleration depending on key up events and key down events. """ - if not (event.type == KEYDOWN or event.type == KEYUP) or not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT): + if not (event.type == KEYDOWN or event.type == KEYUP) or not (event.key == game_object.keys["left"] or event.key == game_object.keys["right"]): return left = False right = False #KEYDOWN events toggle movement on if event.type == KEYDOWN: - if event.key == pygame.K_LEFT: + if event.key == game_object.keys["left"]: left = True - if event.key == pygame.K_RIGHT: + if event.key == game_object.keys["right"]: right = True #KEYUP events toggles movement off if event.type == KEYUP: - if event.key == pygame.K_LEFT: + if event.key == game_object.keys["left"]: left = False - if event.key == pygame.K_RIGHT: + if event.key == game_object.keys["right"]: right = False #If left XOR right if left != right: @@ -60,7 +56,7 @@ def y_movement(self, event, game_object): """ #KEYUP events toggles movement off if event.type == KEYDOWN: - if event.key == pygame.K_UP and game_object.jumps > 0: + if event.key == game_object.keys["up"] and game_object.jumps > 0: game_object.vel_y = game_object.jump_vel game_object.jumps -= 1 print("up", game_object.vel_y) From 182c9f58fbe9a104f461d47d6395188dacffa276 Mon Sep 17 00:00:00 2001 From: jzerez Date: Sun, 11 Mar 2018 03:35:32 -0400 Subject: [PATCH 09/17] finished up attack hitboxes. Need to work on better movement --- GameView.py | 2 ++ character.py | 41 +++++++++++++++++++++++++++++++++++------ model.py | 36 ++++++++++++++++++++++-------------- 3 files changed, 59 insertions(+), 20 deletions(-) diff --git a/GameView.py b/GameView.py index 056889e5..a78f7953 100644 --- a/GameView.py +++ b/GameView.py @@ -19,6 +19,7 @@ def draw(self): pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) for char in self.model.characters: pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.rect) + pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) pygame.display.update() if __name__ == "__main__": @@ -35,6 +36,7 @@ def draw(self): for char in model.characters: model.x_movement(event, char) model.y_movement(event, char) + model.attack_command(event, char) model.update_motion() view.draw() clock.tick(FPS) diff --git a/character.py b/character.py index e6d0b271..3196a031 100644 --- a/character.py +++ b/character.py @@ -23,7 +23,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.width = width self.height = height self.health = max_health - self.left = False + self.left = True self.right = False self.attacking = False self.damaged = False @@ -36,6 +36,8 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.max_jumps = max_jumps self.jumps = max_jumps self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) + self.attack_rect = pygame.Rect(self.pos_x, self.pos_y, 0, 0) + self.attack_time = 0 def __str__(self): output = self.label + ':\n' @@ -65,17 +67,12 @@ def alive(self): """ return self.health > 0 - #NOTE: I think it is better if we didn't have acceleration in the x - #direction. If acceleration rate is slow, it makes manuvering hard. If the - #rate is high, then it is practically unnoticable. def accelerate(self): """ updates the acceleration of the character, for movement on each frame when there is no movement, acceleration = 0 direction is -1 or 1 """ - #NOTE: this is a pretty jank way of doing what I want, but i didn't - #want to overhaul your code self.vel_x += self.acc_x * self.acc_direction if self.vel_x > self.speed: self.vel_x = self.speed @@ -96,3 +93,35 @@ def move(self): self.pos_x += self.vel_x self.pos_y += self.vel_y self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) + + def attack_action(self): + """ + updates the hitbox of the character to reflect the action of an attack. + """ + #If the attacking time is up, then toggle off attacking. + if self.attack_time < 1: + self.attack_time = 0 + self.attacking = False + + if self.attacking: + #offsets that represent the size of the attack hitbox + x_offset = self.width * 0.7 + y_offset = self.height * 0.5 + self.vel_x = 0 + #If the character is facing left, draw the attack hitbox on the left + if self.left: + self.attack_rect = pygame.Rect(self.pos_x - x_offset, + self.pos_y + y_offset, + x_offset, + y_offset) + #If char is facing right, draw the attack hitbox on the right + else: + self.attack_rect = pygame.Rect(self.pos_x + self.width, + self.pos_y + y_offset, + x_offset, + y_offset) + #update the time spent attacking + self.attack_time -= 1 + #If the character isn't attacking, remove the attack hitbox + else: + self.attack_rect = pygame.Rect(self.pos_x, self.pos_y, 0, 0) diff --git a/model.py b/model.py index e943e2a9..8660a005 100644 --- a/model.py +++ b/model.py @@ -13,9 +13,6 @@ def __init__(self, *args): for char in args: self.characters.append(char) - - #NOTE: Why is this a double for loop? We should just have one terrain - #object for the ground, not 30. for i in range(10): for j in range(3): self.terrains.append(terrain.Terrain((i * 100,1000 - j * 100))) @@ -29,7 +26,8 @@ def x_movement(self, event, game_object): events and key down events. """ if (not (event.type == KEYDOWN or event.type == KEYUP) or - not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT)): + not (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT) or + game_object.attacking): return #KEYDOWN events toggle movement on @@ -45,7 +43,7 @@ def x_movement(self, event, game_object): if event.key == pygame.K_RIGHT: game_object.right = False #If left XOR right - if game_object.left or game_object.right: + if game_object.left != game_object.right: if game_object.left: game_object.vel_x = -game_object.speed if game_object.right: @@ -58,19 +56,28 @@ def y_movement(self, event, game_object): """ used to update the v velocity of the object """ - #KEYUP events toggles movement off - if event.type == KEYDOWN: - if event.key == pygame.K_UP and game_object.jumps > 0: - game_object.vel_y = game_object.jump_vel - game_object.jumps -= 1 - print("up", game_object.vel_y) - def attack(self, event): + if not game_object.attacking: + #KEYUP events toggles movement off + if event.type == KEYDOWN: + if event.key == pygame.K_UP and game_object.jumps > 0: + game_object.vel_y = game_object.jump_vel + game_object.jumps -= 1 + + def attack_command(self, event, game_object): + """ + Used to toggle the attacking mode for a character object for a given + amount of time. + """ if event.type == KEYDOWN: - if event.key == + #NOTE: Change to custom/dynamic character attack button. + if event.key == pygame.K_p: + game_object.attacking = True + #number of frames spent attacking + game_object.attack_time = 30 def update_motion(self): """ - Updates the position and velocity of each character. + Updates the position and velocity and attack hitbox of each character. """ for char in self.characters: if char.in_air(800 - 1.5 * char.height): @@ -81,6 +88,7 @@ def update_motion(self): char.jumps = char.max_jumps char.accelerate() char.move() + char.attack_action() def quit(self, event): if event.type == QUIT: From 1495853cb4bde797c6978638d8b37590bd59da2d Mon Sep 17 00:00:00 2001 From: jzerez Date: Sun, 11 Mar 2018 11:45:46 -0400 Subject: [PATCH 10/17] fixed movement. --- character.py | 1 + model.py | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/character.py b/character.py index 95747e8b..13e0b7f4 100644 --- a/character.py +++ b/character.py @@ -11,6 +11,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", height = 150, max_health = 100, max_jumps = 3, keys = {"left": pygame.K_LEFT, "right": pygame.K_RIGHT, "up" : pygame.K_UP, "down": pygame.K_DOWN, "attack": pygame.K_SLASH}): + self.keys = keys self.label = label self.attack = attack self.defense = defense diff --git a/model.py b/model.py index a844c55a..29372276 100644 --- a/model.py +++ b/model.py @@ -31,20 +31,20 @@ def x_movement(self, event, game_object): #KEYDOWN events toggle movement on if event.type == KEYDOWN: if event.key == game_object.keys["left"]: - left = True + game_object.left = True if event.key == game_object.keys["right"]: - right = True + game_object.right = True #KEYUP events toggles movement off if event.type == KEYUP: if event.key == game_object.keys["left"]: - left = False + game_object.left = False if event.key == game_object.keys["right"]: - right = False + game_object.right = False #If left XOR right - if game_object.keys["left"] or game_object.keys["right"]: - if game_object.keys["left"]: + if game_object.left or game_object.right: + if game_object.left: game_object.vel_x = -game_object.speed - if game_object.keys["right"]: + if game_object.right: game_object.vel_x = game_object.speed #Slow character down when there's conflicting input or no input else: @@ -59,6 +59,7 @@ def y_movement(self, event, game_object): game_object.vel_y = game_object.jump_vel game_object.jumps -= 1 print("up", game_object.vel_y) + def attack_command(self, event, game_object): """ Used to toggle the attacking mode for a character object for a given @@ -66,7 +67,7 @@ def attack_command(self, event, game_object): """ if event.type == KEYDOWN: #NOTE: Change to custom/dynamic character attack button. - if event.key == pygame.K_p: + if event.key == game_object.keys["attack"]: game_object.attacking = True #number of frames spent attacking game_object.attack_time = 30 @@ -76,13 +77,13 @@ def update_motion(self): Updates the position and velocity and attack hitbox of each character. """ for char in self.characters: - if char.in_air(800 - 1.5 * char.height): + if char.in_air(600 - 1.5 * char.height): char.vel_y += self.g elif char.vel_y > 0: char.vel_y = 0 - char.pos_y = 800 - char.height + char.pos_y = 600 - char.height char.jumps = char.max_jumps - char.accelerate() + #char.accelerate() char.move() char.attack_action() From 4cfa1d591f2aac0b21b1d6e2f42bc352985cf02f Mon Sep 17 00:00:00 2001 From: Micah Date: Sun, 11 Mar 2018 11:59:38 -0400 Subject: [PATCH 11/17] fixed motion and sprites added! --- GameView.py | 10 +++++++++- character.py | 22 ++++++++++++++-------- down.png | Bin 0 -> 881 bytes left.png | Bin 0 -> 840 bytes model.py | 18 +++++++++--------- right.png | Bin 0 -> 749 bytes up.png | Bin 0 -> 944 bytes 7 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 down.png create mode 100644 left.png create mode 100644 right.png create mode 100644 up.png diff --git a/GameView.py b/GameView.py index d87c6aa8..1f0e2afd 100644 --- a/GameView.py +++ b/GameView.py @@ -18,7 +18,15 @@ def draw(self): for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) for char in self.model.characters: - pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.rect) + if(char.left): + self.screen.blit(char.left_img, char.rect) + elif(char.right): + self.screen.blit(char.right_img, char.rect) + elif (char.vel_y < 0): + self.screen.blit(char.down_img, char.rect) + else: + self.screen.blit(char.up_img, char.rect) + pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) pygame.display.update() diff --git a/character.py b/character.py index 95747e8b..5a1bea8c 100644 --- a/character.py +++ b/character.py @@ -21,7 +21,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.width = width self.height = height self.health = max_health - self.left = True + self.left = False self.right = False self.attacking = False self.damaged = False @@ -29,13 +29,20 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.vel_y = 0 self.acc_x = acceleration self.speed = speed - self.acc_direction = 0 + self.acc_direction = 1 self.lives = 3 self.max_jumps = max_jumps self.jumps = max_jumps self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) self.attack_rect = pygame.Rect(self.pos_x, self.pos_y, 0, 0) self.attack_time = 0 + self.keys = keys + self.left_img = pygame.transform.scale(pygame.image.load("left.png"), (self.width, self.height)) + self.right_img = pygame.transform.scale(pygame.image.load("right.png"), (self.width, self.height)) + self.up_img = pygame.transform.scale(pygame.image.load("up.png"), (self.width, self.height)) + self.down_img = pygame.transform.scale(pygame.image.load("down.png"), (self.width, self.height)) + + def __str__(self): output = self.label + ':\n' @@ -67,15 +74,14 @@ def alive(self): def accelerate(self): """ - updates the acceleration of the character, for movement on each frame when there is no movement, acceleration = 0 direction is -1 or 1 """ - self.vel_x += self.acc_x * self.acc_direction - if self.vel_x > self.speed: - self.vel_x = self.speed - if self.vel_x < -self.speed: - self.vel_x = -self.speed + #self.vel_x += self.acc_x * self.acc_direction + #if self.vel_x > self.speed: + # self.vel_x = self.speed + #if self.vel_x < -self.speed: + # self.vel_x = -self.speed #Decelerates the object when there are no inputs. # if self.vel_x > 0: diff --git a/down.png b/down.png new file mode 100644 index 0000000000000000000000000000000000000000..92541f0650a7faf190a3c1527460fee526c320b4 GIT binary patch literal 881 zcmV-%1CIQOP)Qg$orra6rWsI-){`DRi)bHB7OADHdJ|Z-g(l>^6ZsSQvP3 zzWLwmKM(%x;XReS0$G-8E!q2G8R$MN8eh^l?C_n)vxhwjw1BJDx zItQ_A)FY{DWYkM!)Jx>76N}b?n8S{obz&KIBDpv_6%i4Wo(h0h6uG>7xw-&-@;n?c zY&U5HAy=~rQJm1K6$H(MNqU0GEE{u&3oYON{5zjN{K~7>Z|=IBOva*=Mr+0D>MK5Y z-oh&J)+M#;ZPrVlTm{rz!FGEScYe)Y<;8ER#%^zKQIxzGjjqYel;P!&o10I(9$zp7 zG*I|HNeKxhyUvnO(#;NuVPSB9KX3oQT8lAr{5-c9-(amHGloWM$2$hGRq+g;F6F|= znv7PQVyy$0lYaj-xvi?(hj%VN>h}bo*FW+A+8~?2AWku8_J%D0KI#^eD51<1dQEXe zm#KwmRuG246Vqm`C)C#2S|2l-Y*iNkkTLDOC+ct0)dOaxAlZnpe!;x(84PFM(($F6 z13`rkUa>6|t$Byi!ERhbraxmds=T0T z3)rK;G^qC00000NkvXX Hu0mjfXLX84 literal 0 HcmV?d00001 diff --git a/left.png b/left.png new file mode 100644 index 0000000000000000000000000000000000000000..6701ae06e78b0ec0528b1aa058d20aa07b82b818 GIT binary patch literal 840 zcmV-O1GoH%P)fuQfe##Tq2h`Z4k+M&ixgX^P(Xn-*}w+2(7_a2OtCOmSXLrMl3iSr2iv^a zdGo#R&kX#~h}(Ov57X~1d%RVPk%)_pnc)Pet=RX|JaGUn5^*88!JHU?0aiu(-AOHQ zH!_DJ7-KLCHZF^FhH$-(1Mqg9dD&Upt*J3k`w)2hiBfKFy>7dVM$td=S+HVGm=pE|o!e!Y1_XS+r~#%8_2&jQbPj>skvcPCm4%l~@6;mVaw zAVcMrJRegmlv&e2pkSQyOY?}v#QVuNI%<*N&}z*45E0Edw`9h$+j+^_ufGBC$GS(5 z&kEhz*e{xo96)V*j|UGQb9HqEz{bV~>-RijvwA3ICnOrW8}v?(UAx_O{fmn!7hd*V zK^8anw94JOOn)$G%G-DE_{;N%qKF_6w90w)>Tmx2@|kcrB3%;U*BpvZtBR`?ebO{# z?{6}Rk|mq1c5AdrvUcrWfv3!;=zc(HypM>wBeE_MqrRwxHv`m znu2KdUtA*fp4%Gja-Qbi!lE2MsXECO{cwmO=Zpii2-a2*u^1!Q9Vdde1FWskVvnPN zSv-2plYtkRF|oy8Zf!BBoyRBQPnL z6d?t!$MRrHyOn)-&?q~AaFo!G?Q~sN{&YwgYrhtxkV%;oX$A%XuJ%B{1D0;UPM1#k)6(svlh1y>@7~>ackthdx9^8J zD1a?>B@Sq8@b|X?-GiD9Kr2bM_`Ui2!wu;DmRqggE{bpVr`!h>z?8ZP$gQ2Np0zcc zXMk1EU0f_AfwI z)Pz9B+twAo;x3OC$Q{->4!Q$xBVfg#VP4qh%{meYfsq0(5KJKCen`F7=dyWHl<9ip z?QQHBv|IT=xBjPb1n@-&a+qc*mv?h-@1&@ze)l|Ntp_{il!?9fE;~&H@RtkDzCP@o zGSYOes!LT>jpJCeEY&&axMcm+gS}j4nx<(9y3{O9v=7<`)zO(!AL^@?!*o1WfJK_% zfaBUR)y4!!fhxW%$R9rKO!e7vm?g8P;)^dVk_2PG+A6q|Je%#!@)_WKI(@RM)hee~ z26FHjlcz(ZT7$#3y4k?nn{vG(S~0?%>46w*NwLTR?3`Q-fgBWPqm~ypBW>L#-qz8J zDuUo>yU*n+DE3S4QXC~@A|fKFgPk|ZWXXhv?g}+y0qWo?Bu?-&p-hk791tjqCzRH}+dtDXaBw2s6<_mHp@@M9RluYXXp4Im+|L1!Iv7W+g!$@J|d=X()n z`}@vsor|yT@R#3yXSdb>Aj_BJ=@fwXA3k#7Pax1pKLB7o{oGp|mGE{W?t^VT_l)Y2|&9yMioOY8WozCBb;;Y_V$)Sp#Z>aHgO`$QdcPauxUeC6hy=upF7RQVy`&gioY3B18i&a9o9FZg`JJa!a3kGmgQ6xYe=;#xg zm&G!Isxm7ZrVmu}`&fg+ik?;B{cN zp{)T1z&VJ!^=Z2Ln%KR=ic4ocfgdtoW5b-u%H#N5ndr28PmG4RJYlk^LbibPR6J>4CvoUJC9#u?iOL!6UZFgD zPuX{3)|hEW@SK)CCCO3982p8XWQ4&YJquEjO9iroFBP(O=Ir#1c+$R1?y=6-nA}4f zIP!;(_JvKZg>yu{^W58w#8Fk&Wj@^u;3kcDrh{0eezO5Cd Date: Mon, 12 Mar 2018 01:17:32 -0400 Subject: [PATCH 12/17] polished movement. Added attack interactions and knockback. --- GameView.py | 2 +- character.py | 36 ++++++++++++++++++++++++++++++------ model.py | 37 ++++++++++++++++++++++++++----------- terrain.py | 2 ++ 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/GameView.py b/GameView.py index 1f0e2afd..c6e822a0 100644 --- a/GameView.py +++ b/GameView.py @@ -16,7 +16,7 @@ def draw(self): """ self.screen.fill(pygame.Color(200,210,255)) for t in self.model.terrains: - pygame.draw.rect(self.screen, pygame.Color(150,120,10), pygame.Rect(t.pos[0],t.pos[1],t.size[0], t.size[1])) + pygame.draw.rect(self.screen, pygame.Color(150,120,10), t.rect) for char in self.model.characters: if(char.left): self.screen.blit(char.left_img, char.rect) diff --git a/character.py b/character.py index 33042028..baf59067 100644 --- a/character.py +++ b/character.py @@ -4,7 +4,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", attack = 10, defense = 10, weight = 10, - jump_vel = -100, + jump_vel = -80, acceleration = 3, speed = 15, width = 75, @@ -25,7 +25,6 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.left = False self.right = False self.attacking = False - self.damaged = False self.vel_x = 0 self.vel_y = 0 self.acc_x = acceleration @@ -37,6 +36,7 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) self.attack_rect = pygame.Rect(self.pos_x, self.pos_y, 0, 0) self.attack_time = 0 + self.damage_time = 0 self.keys = keys self.left_img = pygame.transform.scale(pygame.image.load("left.png"), (self.width, self.height)) self.right_img = pygame.transform.scale(pygame.image.load("right.png"), (self.width, self.height)) @@ -63,9 +63,7 @@ def in_air(self, terrain): checks to see if character is in the air, or supported by terrain *args are (probably) terrain objects and their coordinates """ - if self.pos_y >= terrain: - return False - return True + return not self.rect.colliderect(terrain) def alive(self): """ @@ -95,14 +93,26 @@ def move(self): updates the position of the character laterally. direction is either -1 or 1 """ + #For the second to last frame of the damaged animation, the velocity + #should be set to zero + if self.damage_time == 1: + self.vel_x = 0 + self.vel_y = 0 + if self.damage_time > 0: + self.damage_time -= 1 + self.pos_x += self.vel_x self.pos_y += self.vel_y self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) + def attack_action(self): """ updates the hitbox of the character to reflect the action of an attack. """ + if self.damage_time > 0: + + self.attack_time = 0 #If the attacking time is up, then toggle off attacking. if self.attack_time < 1: self.attack_time = 0 @@ -121,6 +131,7 @@ def attack_action(self): y_offset) #If char is facing right, draw the attack hitbox on the right else: + self.right = True self.attack_rect = pygame.Rect(self.pos_x + self.width, self.pos_y + y_offset, x_offset, @@ -129,4 +140,17 @@ def attack_action(self): self.attack_time -= 1 #If the character isn't attacking, remove the attack hitbox else: - self.attack_rect = pygame.Rect(self.pos_x, self.pos_y, 0, 0) + #put the hitbox underground where it can't interfere wither others + self.attack_rect = pygame.Rect(self.pos_x, 1000, 0, 0) + + def detect_damage(self, attack_hitbox, direction): + """ + detects whether a character object is subjected to an attack or not, and + then appropriately designates a knockback force. + """ + if self.rect.colliderect(attack_hitbox): + #add 10 to the damage timer + self.damage_time = 10 + #set push directions + self.vel_x = direction * self.speed * 1.5 + self.vel_y = -abs(self.vel_x * 1.5) diff --git a/model.py b/model.py index 42d1cdc7..ecfb38b7 100644 --- a/model.py +++ b/model.py @@ -18,28 +18,38 @@ def __init__(self, *args): #for i in range(10): # if(random.randint(1,2) == 2): - # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100)))s + # self.terrains.append(terrain.Terrain((i * 100,1000 - 3 * 100))) def x_movement(self, event, game_object): """ Toggles the different modes of acceleration depending on key up events and key down events. """ - if not (event.type == KEYDOWN or event.type == KEYUP): + if (not (event.type == KEYDOWN or event.type == KEYUP) or + game_object.attacking or + game_object.damage_time > 0): return #KEYDOWN events toggle movement on if event.type == KEYDOWN: if event.key == game_object.keys["left"]: game_object.left = True - if event.key == game_object.keys["right"]: + game_object.right = False + game_object.vel_x = -game_object.speed + elif event.key == game_object.keys["right"]: game_object.right = True + game_object.left = False + game_object.vel_x = game_object.speed #KEYUP events toggles movement off if event.type == KEYUP: - if event.key == game_object.keys["left"]: - game_object.left = False - if event.key == game_object.keys["right"]: - game_object.right = False + if (event.key == game_object.keys["left"] and + not game_object.right): + game_object.vel_x = 0 + elif (event.key == game_object.keys["right"] and + not game_object.left): + game_object.vel_x = 0 + + """ #If left XOR right if game_object.left != game_object.right: if game_object.left: @@ -49,7 +59,7 @@ def x_movement(self, event, game_object): #Slow character down when there's conflicting input or no input else: game_object.vel_x = 0 - + """ def y_movement(self, event, game_object): """ used to update the v velocity of the object @@ -77,13 +87,18 @@ def update_motion(self): Updates the position and velocity and attack hitbox of each character. """ for char in self.characters: - if char.in_air(600 - 1.5 * char.height): + if char.in_air(self.terrains[0].rect): char.vel_y += self.g elif char.vel_y > 0: char.vel_y = 0 - char.pos_y = 600 - char.height + char.pos_y = self.terrains[0].rect.top - char.height + 1 char.jumps = char.max_jumps - #char.accelerate() + for other_chars in self.characters: + if other_chars.left: + char.detect_damage(other_chars.attack_rect, -1) + else: + char.detect_damage(other_chars.attack_rect, 1) + print(char.damage_time) char.move() char.attack_action() diff --git a/terrain.py b/terrain.py index 6ef0996c..1fe174df 100644 --- a/terrain.py +++ b/terrain.py @@ -1,3 +1,4 @@ +import pygame class Terrain: def __init__(self, pos, size = (100,100), kind = "Ground"): """ @@ -7,3 +8,4 @@ def __init__(self, pos, size = (100,100), kind = "Ground"): self.pos = pos self.size = size self.kind = kind + self.rect = pygame.Rect(pos[0], pos[1], size[0], size[1]) From 49dd8fb6f426d0c9ed02bee512750fad3d4ce4ec Mon Sep 17 00:00:00 2001 From: Micah Date: Tue, 13 Mar 2018 18:57:22 -0400 Subject: [PATCH 13/17] Added lives and respawn --- GameView.py | 16 +++++++++++----- character.py | 30 ++++++++++++++++++++---------- down2.png | Bin 0 -> 1096 bytes left2.png | Bin 0 -> 952 bytes model.py | 6 +----- right2.png | Bin 0 -> 870 bytes up2.png | Bin 0 -> 1056 bytes 7 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 down2.png create mode 100644 left2.png create mode 100644 right2.png create mode 100644 up2.png diff --git a/GameView.py b/GameView.py index c6e822a0..0c7d975b 100644 --- a/GameView.py +++ b/GameView.py @@ -26,19 +26,25 @@ def draw(self): self.screen.blit(char.down_img, char.rect) else: self.screen.blit(char.up_img, char.rect) - - pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) + for i in range (char.lives): + self.screen.blit(char.up_img, (570 + 120 * i, 950 - char.player * 150)) + #pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) pygame.display.update() if __name__ == "__main__": clock = pygame.time.Clock() FPS = 30 - char1 = Character(pos_x = 500, pos_y = 500, label = 'char1') + char1 = Character(pos_x = 1200, label = 'char1') char2 = Character(label = 'char2', keys = {"left": pygame.K_a, "right": pygame.K_d, "up" : pygame.K_w, "down": - pygame.K_s, "attack" : pygame.K_SLASH}) + pygame.K_s, "attack" : pygame.K_x}, + left_img = "left2.png", + right_img = "right2.png", + up_img = "up2.png", + down_img = "down2.png", + player = 2) model = Model(char1, char2) - view = GameView(model, (1000, 1000)) + view = GameView(model, (1500, 1000)) while model.game_running: for event in pygame.event.get(): model.quit(event) diff --git a/character.py b/character.py index baf59067..592436b4 100644 --- a/character.py +++ b/character.py @@ -1,6 +1,6 @@ import pygame class Character: - def __init__(self, pos_x = 0, pos_y = 0, label = "blank", + def __init__(self, pos_x = 300, pos_y = 0, label = "blank", attack = 10, defense = 10, weight = 10, @@ -10,7 +10,13 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", width = 75, height = 150, max_health = 100, - max_jumps = 3, keys = {"left": pygame.K_LEFT, "right": pygame.K_RIGHT, "up" : pygame.K_UP, "down": pygame.K_DOWN, "attack": pygame.K_SLASH}): + max_jumps = 3, keys = {"left": pygame.K_LEFT, "right": pygame.K_RIGHT, "up" : pygame.K_UP, "down": pygame.K_DOWN, "attack": pygame.K_SLASH}, + left_img = "left.png", + right_img = "right.png", + up_img = "up.png", + down_img = "down.png", + lives = 3, + player = 1): self.keys = keys self.label = label self.attack = attack @@ -38,10 +44,11 @@ def __init__(self, pos_x = 0, pos_y = 0, label = "blank", self.attack_time = 0 self.damage_time = 0 self.keys = keys - self.left_img = pygame.transform.scale(pygame.image.load("left.png"), (self.width, self.height)) - self.right_img = pygame.transform.scale(pygame.image.load("right.png"), (self.width, self.height)) - self.up_img = pygame.transform.scale(pygame.image.load("up.png"), (self.width, self.height)) - self.down_img = pygame.transform.scale(pygame.image.load("down.png"), (self.width, self.height)) + self.left_img = pygame.transform.scale(pygame.image.load(left_img), (self.width, self.height)) + self.right_img = pygame.transform.scale(pygame.image.load(right_img), (self.width, self.height)) + self.up_img = pygame.transform.scale(pygame.image.load(up_img), (self.width, self.height)) + self.down_img = pygame.transform.scale(pygame.image.load(down_img), (self.width, self.height)) + self.player = player @@ -104,7 +111,10 @@ def move(self): self.pos_x += self.vel_x self.pos_y += self.vel_y self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) - + if(self.pos_y > 1000): + self.pos_y = 0 + self.pos_x = 500 + self.lives -= 1 def attack_action(self): """ @@ -146,11 +156,11 @@ def attack_action(self): def detect_damage(self, attack_hitbox, direction): """ detects whether a character object is subjected to an attack or not, and - then appropriately designates a knockback force. + then appropriately designates a knockback force. """ if self.rect.colliderect(attack_hitbox): #add 10 to the damage timer self.damage_time = 10 #set push directions - self.vel_x = direction * self.speed * 1.5 - self.vel_y = -abs(self.vel_x * 1.5) + self.vel_x = direction * self.speed * 2.5 #I changed these from 1.5 to 2.5 to be more dramatic, feel free to change back + self.vel_y = -abs(self.vel_x * 2.5) diff --git a/down2.png b/down2.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdf1dcec59a20c780b692111e3dd39556dea452 GIT binary patch literal 1096 zcmV-O1h@N%P)qbb;Chsc~V0 zyT+g)h>8iuhOjWEX{*I(QmB7I6fGKzB(MM-WrQak+9^ERCk*fy9&=pGFk%K4E=~NB zlbd^T?svYE`{gL4LIE6!NCTXkVk0j=46uRq#AyTT4*ngKZO$Z|+dLG2=eV*W#E4-d z#1LZ1f(z8=C+aq0>kfc&g0Et6);L-7C%d_RG0KDQ7ji1^yJX>cp42vt8v|lnjV!Ay zU}FJr-{T{E{_+}S?`8A4cba*EtP^D!gX8p?38JLZ6os|4NCq02?81pk8aw_m?na|k z7BHFSYtG!Up$?D~g$snZ$rw3!$-+$zUdpO<4m@FTi3Wuge(iji(z zdVB+NfJ&J;8Ih}(uS(;`M`iJpEuprkG+um0qS2^advjF=4~|O0R*uA9C?qaP?E7sO z89pad=r~mfm;6EZYnS;mSHV3S<@8V|pH6**0|!d{>E<7n6hcSaPGzU6@@mZ)9_saR zyts+J;xAd6y20e)3b*E#c=XaScE6HOv~ZQJY=bOCWdobZdu#f|<0%&p9_jNBN}qpF zI%>{|=DJgUY|y2n=A88S2IRBuUJ(%)>DC26i5RA2=4K~}UQ))fvADZ(fLwPmqhtN- z@%yNb)ROCW@zdEcbWBt5x!a|zQlnGEST4f7Vdu47mxVckvf z5uZ{=yI7b2%o3!MCM-;Dqoaj0IN$R;rnL;l8s+!5VVDL0IW4iccUqfU1)#aLSpg{H zs1#5^pr;>Qn_z!!6#$b}AtKKPuvHCBh0{$0E08Fqk`hNZ?}c#)D|8P#e<+{bw&$+jfy z^7IIRVH(U?I@7j};WYTx>Q?{`dm5$C8MoDpZPBN9D_gB}0N&8f%7`_@4LclPQBI3u ze4tufFh5Av9;tgwBv6n-mO@yfR!UV-1zEU=7!h1~F5U{ZD*TWCHvR&|M854cH;1kO O0000bs0Y*|VVYuUp~c>P22iko&YOEYGl84pbtw(iED z9`pwT^ZU;HzI^BRo8Jul*G;Uoc&XPj*)g~3pXL?uj|c~(Yvz?#gN2cNMn_h0CdX_P)f11>aRy>4d8!j3_$Fd5H|o?-T>eVpI3RTdW5rffrY$cvn^TDCGO}l2Tt@5eySA+vroK5 zE3q1)zr5HV?fKXM?CQ<%`o5Q$nVA8gv$KmKv zj+mX148HHvOFv!RTgi^kkxI6s^$MAEij!km92sqRIt$=n;;?CR9Ih8V9#;wWK**}FXH=vW7 zkUE5tfLa1s!M<8SCpWRbcQ>ciaZxvihpzSszvOZ=@CaEpI2IH%xFwXncYl+t0HD)N z;FegkC;*pmd9C9mRsxOX|Aw}kuzy;?Dl8z274R+aEu- zO*|gwh2v>1>YUK4Yx+>Lu@e?rK7wKyfUQ9XlR>VrLV!ie05lV+!F6^{kgs65i#7O@ zR-A?k0ZzIn8g_slpBDgKR>nMLKSxu<=Ha(D^ml%?>EOJGT0VCpx0u8I_rAwAv)>Kr#Blh?ARX>tprev5YSwCA5W*?J16^ErlQ2;_eB*xOy(@kn=2!flCYR3)B z#BT(k)>ExQKgMfVi}=vIA9On-{IxG5#{#*v7U3n>Fxz7Pru zCNXFuU&Ii)8L?|Gi@1OIg>TM=!c+yubG#l^-ZwdpR@dk5y2h;w;U^cmIYblUel zigi{*M5KMFNvyLX$*!!l4>ie5G%eRU9I2vGh5{p!>2hR44PSb-9)H6l0PLB}B4Zu^ zqf_6|6aR?f%q{l#GyrB}4ggP;A0|JbvcFGPHVFQbxe7r0P?Kb8E!+~9z`OU;QuR82 zSShBKR>&qTjt;gGJX6CHgAZ}Aq=x$8S_L4R&5DQ!fV$oQXt0~{B05*h1Yb8?pe@nJ z<Wt+-#%y&qoQrPJwlBqP!tu0Dkb7yl-Y_j@0snP=& zdX#g6uV7gDXc&|cx030*FLr-bNRoO!`KFKGv*VCm#Zi~} z{%}8Kqa^?&W543JA7h#kJltFUMA4h4d&jp zAo~_a;yx}`&%wkhoSs&;wXbfoR|+(h%UKu4i*spk62mptNNv}hKx-Adb7E5qyX!3% zXe!Hw$J1zxS~|o8+nqym^FX_eXRJc`K6JxCJ5wrd_l&ZweJ!dsp5w5n+N80lj~<0^ zMsdHmuDIGRJbgEwW?-|5YZRb$mCBBe{i4<=w@n{PV3tVqymBvBr1=>bya>sgV6mZ& z%D?$9jvK9V#AwL%Uu%8?dNaz7U%*!Q+zu;0Sdlx27 Date: Wed, 14 Mar 2018 21:45:21 -0400 Subject: [PATCH 14/17] shielding, weight, fixed sprites --- GameView.py | 12 ++++++++---- character.py | 36 +++++++++++++++++++++++++----------- down.png | Bin 881 -> 656 bytes down2.png | Bin 1096 -> 892 bytes left.png | Bin 840 -> 588 bytes left2.png | Bin 952 -> 652 bytes model.py | 25 +++++++++++++++++++++---- right.png | Bin 749 -> 569 bytes right2.png | Bin 870 -> 643 bytes shield.png | Bin 0 -> 911 bytes shield2.png | Bin 0 -> 981 bytes up.png | Bin 944 -> 699 bytes up2.png | Bin 1056 -> 781 bytes 13 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 shield.png create mode 100644 shield2.png diff --git a/GameView.py b/GameView.py index 0c7d975b..238dffb6 100644 --- a/GameView.py +++ b/GameView.py @@ -18,7 +18,9 @@ def draw(self): for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), t.rect) for char in self.model.characters: - if(char.left): + if char.shielding: + self.screen.blit(char.shield_img, char.rect) + elif(char.left): self.screen.blit(char.left_img, char.rect) elif(char.right): self.screen.blit(char.right_img, char.rect) @@ -28,7 +30,7 @@ def draw(self): self.screen.blit(char.up_img, char.rect) for i in range (char.lives): self.screen.blit(char.up_img, (570 + 120 * i, 950 - char.player * 150)) - #pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) + pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) pygame.display.update() if __name__ == "__main__": @@ -36,12 +38,13 @@ def draw(self): FPS = 30 char1 = Character(pos_x = 1200, label = 'char1') - char2 = Character(label = 'char2', keys = {"left": pygame.K_a, "right": pygame.K_d, "up" : pygame.K_w, "down": - pygame.K_s, "attack" : pygame.K_x}, + char2 = Character(label = 'char2', keys = {"left": pygame.K_j, "right": pygame.K_l, "up" : pygame.K_i, "down": + pygame.K_k, "attack" : pygame.K_o}, left_img = "left2.png", right_img = "right2.png", up_img = "up2.png", down_img = "down2.png", + shield_img = "shield2.png", player = 2) model = Model(char1, char2) view = GameView(model, (1500, 1000)) @@ -52,6 +55,7 @@ def draw(self): model.x_movement(event, char) model.y_movement(event, char) model.attack_command(event, char) + model.shield(event, char) model.update_motion() view.draw() clock.tick(FPS) diff --git a/character.py b/character.py index 592436b4..d7356641 100644 --- a/character.py +++ b/character.py @@ -3,18 +3,19 @@ class Character: def __init__(self, pos_x = 300, pos_y = 0, label = "blank", attack = 10, defense = 10, - weight = 10, + weight = 1, jump_vel = -80, acceleration = 3, speed = 15, width = 75, height = 150, max_health = 100, - max_jumps = 3, keys = {"left": pygame.K_LEFT, "right": pygame.K_RIGHT, "up" : pygame.K_UP, "down": pygame.K_DOWN, "attack": pygame.K_SLASH}, + max_jumps = 3, keys = {"left": pygame.K_a, "right": pygame.K_d, "up" : pygame.K_w, "down": pygame.K_s, "attack": pygame.K_e}, left_img = "left.png", right_img = "right.png", up_img = "up.png", down_img = "down.png", + shield_img = "shield.png", lives = 3, player = 1): self.keys = keys @@ -48,8 +49,9 @@ def __init__(self, pos_x = 300, pos_y = 0, label = "blank", self.right_img = pygame.transform.scale(pygame.image.load(right_img), (self.width, self.height)) self.up_img = pygame.transform.scale(pygame.image.load(up_img), (self.width, self.height)) self.down_img = pygame.transform.scale(pygame.image.load(down_img), (self.width, self.height)) + self.shield_img = pygame.transform.scale(pygame.image.load(shield_img), (self.width, self.height)) self.player = player - + self.shielding = False def __str__(self): @@ -107,6 +109,9 @@ def move(self): self.vel_y = 0 if self.damage_time > 0: self.damage_time -= 1 + if self.shielding: + self.vel_x = 0 + self.pos_x += self.vel_x self.pos_y += self.vel_y @@ -121,7 +126,6 @@ def attack_action(self): updates the hitbox of the character to reflect the action of an attack. """ if self.damage_time > 0: - self.attack_time = 0 #If the attacking time is up, then toggle off attacking. if self.attack_time < 1: @@ -153,14 +157,24 @@ def attack_action(self): #put the hitbox underground where it can't interfere wither others self.attack_rect = pygame.Rect(self.pos_x, 1000, 0, 0) - def detect_damage(self, attack_hitbox, direction): + def detect_damage(self, other_char, direction): """ detects whether a character object is subjected to an attack or not, and then appropriately designates a knockback force. """ - if self.rect.colliderect(attack_hitbox): - #add 10 to the damage timer - self.damage_time = 10 - #set push directions - self.vel_x = direction * self.speed * 2.5 #I changed these from 1.5 to 2.5 to be more dramatic, feel free to change back - self.vel_y = -abs(self.vel_x * 2.5) + if self.rect.colliderect(other_char.attack_rect): + if not self.shielding: + #add 10 to the damage timer + self.damage_time = 5 + #set push directions + self.vel_x = direction * self.speed * 0.75 * self.weight + self.vel_y = -abs(self.vel_x * 1.5) * self.weight + self.weight += 0.05 + self.damage_time = int((2 * self.vel_y / -15)) + 3 + else: + + #add 10 to the damage timer + other_char.damage_time = 5 + #set push directions + other_char.vel_x = -direction * other_char.speed * 0.75 * other_char.weight + other_char.vel_y = -abs(other_char.vel_x * 1.5) * other_char.weight diff --git a/down.png b/down.png index 92541f0650a7faf190a3c1527460fee526c320b4..ba5aae3a55d9d7f33a14dcf37b765b3d4339986a 100644 GIT binary patch delta 644 zcmV-~0(<@O29O1i7k?HA1^@s6z(KqQ00074Nkl;=R5c1y?4L&-JhN+^u`6pgWXY> zst#OBi;wA{h|VekKi*nZRXA1Optjpsx|te7#08LN5`VzsqP#s;sbL&BLxeLr9^92FiItIDfg}KuaMeX^$Q>Vw^^+hr!@f}NQ!{D@*^!;nGr_;%GGB!ztUY5F0 eI_&@SZ{r7Q^f&53V85pT0000^~3w?cqI@yaHL4 zYc1LPVj1W@EE-?ZIPCD9$g_t%3bcT$*5myIxBr&l;Dno%6{b}#TLOI``w&C}A)u=7 zez<#w8sObO7=I5G&VdO~ub_2cwii?EC+q@|)`V5f{JB45(o-3BB58(5ar#z9R~OQL zpNgbEiloPPYY~z3SSG!#=kM^V+7y2+!dO5lOb~JYt`AN_En^Uj_~o~oCq;b$^x|Vr z1&V$G>xx9S2x&VFhJRC4=H)#YRSF;IGoY1Nj z1kHp=dVh}bo*FW+A+8~?2AWku8_J%D0K7Z;KlPICg6?#o^M3h?6|H%P z(!p+AXKqUh2ZQ0vTdGhskHxtVr7}vF6j<1tg%XQ|+Y*{tw6KQZt@zY1UsNLDwmT)$G x0DAyzY9*T+YXk}kn-l07N0&2?|Kqb?+7k?HA1^@s6z(KqQ0009+NklmT4l5UJH`NNM(i&IBWYiaq%{V_bWxM`s%M}90ulUXN=TlsN+ zh@+ezZ{N>n_srPZ_|&WK-S?jF>+|FL98u30pcteWtk4u`3V&UZp%|ygQe-N|Dn={P z6~h%nQs@3ln3)o0rG#VtRXC7^8|ex*P#Ei}9_#2LiplCCm4GW8sTkI$&_h?jY@$XH zKE3b^*H%A9JRTRZje2&JVuWI7s-s?o#1)j#B@ymlb{K&PPw@6#J1Wv2Vi6t1TB<`4 zoswkTs&k||`+qYE$d6@Y!cFJ8q;~6!-SSF0jfHdof5`^)5YDD@Fx#mK+vq+js11R6 z)i}A_f<`*_jCzVPx&s$gViuJlB^%VM@KJ3$tlXRGK_@!O6S#Hx7D~^#@oDFG#EvFW zTDJztWD>8BeMQ98jK4%ZtNXe43mS?d$e=8|^(JsW8h--ijX><+4}7mopw0UZXP=)z z$FXm??RtVfWp>1^t5!`D`}U{Jf8a6u$<*_$-zYY1G>jfYLN>$>OvNxEv@*}06DOWqM+-OFo(QYLAA2SEAMeK zJ23}~xTxl)7LecXN5~8z7%)Z5W8lO5FdycsSbxsn`GwX)dC;xtpwMJca3W3_7LMpO z0v9K9tnyWXu`gsQxuqh*DirAq@(B9e0yxZUP;H)wS+ZI8!sRGLvF;Iie|LNnrGf=s z7s$$0(&?S3z1EqRLHjeYRo@|^19>$#WK_xJQD32(ovn2d>a2>aY|PgRFiXovFxSNH z9BW_yGA%Gcs^Qh)%Yfz?2hBYmZQ*xVV2A2e-nRc`n=zuk@es3%{jdN+bL2Hvj+t07*qo IM6N<$g0qbb;Chsc~V0yMM-@A&80z#)hykrfI9i zXi}(uLKH0;j3lrC9c6?k9oi{8+9wR~7#?$6%rIgG7A{Tvl9QWza_)D&ll$c;q(T84 ziAV#Sn_?p`Kn$>f^~7ld>kj@Mlx@x=oZCDUfakcfBE*PcBg7D5$$|^i=O^kmV(Sio za)Pg7an?9l^M5D1xqdOqgYOq|D(|~w;d!3aHjNttVq1+Yt1Mt+0dU{rBYghy8fEWg z^SXDMd4jAHWf_Cx^qL8xq|y|HwX{eE8ky|EiAowf{xR-Gqg56#ndWQG+_9k!kQ9Xr zgt*BVIe5v!O%7hls&x)LVR4BDin2?{qJUX`W|8Y`Qh%6=k#1djd;@ZTN|`wsk*k-l zO5?{zW$~0Pp|+?rUVKKP(WqQ|b5#Zpj!ME-j>KOmBrZwp`)wB)J||P?I8_Lj{6Y6? zm-#bS!95%0^iU_CPJM&}2TJ_u<{y?6LPy(9Wv8n0YRwrQ>h*EFxQV{vFIk$p!Q|o! zx8|03^ncPZcE6HOv~ZQJY=bOCWdobZdu#f|<0%&p9_jNBN}qpFI%>{|=DJgUY|y2n z=A88S2IRBuUJ(%)>DC26i5RA2=4K~}UQ))fvADZ(fLwPmqhtN-@%yNb)ROCW@zdEc zbWC}l}C z$h7iktgK^T$YMVyh!Eyo*#p4*{5(5s702Mv4}=3@`UeL2ef(G6?t7R?22jz6IB)X+ ze)i&LpH<0L&7k zl7A*FOm3s2g)=zc^E{@t48|Je_qSn~1^_uNvAB0yn_C5-xwTmVDC4LUP(h%lA6=VZ ze{B^2lT{%i&jzqn4NZm9O-)P?U?LLW9+!LDr(9w>s zu8|izpJqG~q}J!h5itolLv#f@6=l1{r+;;p3hwm36V@64rfPDi!N)Q-$2|31vqLNr zp)1&_Y^zXhzgH}G25NW(+gQdKc7TAyp2FwJI7k?QD1^@s6F&7Tg0006LNkl`)^;f@ z%gpY1-skQhShc*gBc)0CT(+P5-prwzezVLMnj#13d47{)humFIlJ| zN*1%B{F#HbItoQ<)` zu0;{*yAYeyZ-3K()wS-2>R0i4i*tJwpqP3f_&)NGO8^b^Dh15^2H)W9{NfK16Rcl*6RyyQP$ih?Y0&XCHSK{_2#$u7-QEWwVuS4g& z*Q-S^!rW0P{1KLA0p%6&{V`Z|_F0;0D820k&b)J!Gk;f-t&n^jz;FcUW&$l`TBnJ&SA;6I&MA-(b4(44vf;Ts3g7YVC}uyRyEePYnfXICn7Z zQ1|pu1HCsAdoPghl~8(k=EN{Ykq(bzrl0{g`DIUF?3&%sczh1((t5wpw4+_9d8<_N z-I>RIfjI~atlv-Gd;1p1oS*#HK(B7(2PC^3{u>}$#QYsd%}MQ0T7Ci#7w!?HRC^Wx O0000lhfQuAcs8B$GHQB%hw$Q;8TTHPqS6EgeMUq`ylLy!qiE)sDexWSwlfB{xT``t+`a5plCA{b*Z3pOr`bcS%f zjsx&^o_X0>+kdU8F;L{~&NIwJWFEiIX-qAL?Og{6kdU3W+?pEmp?(M?Jm|GJuap=7 z@x=BGj_2%81#5?A-kUJyO&DV)xw{_(0DR0Z>8CNTOYpSU;&HFV2uOj#Z8@x#DlRq& zB0irwyHkF>c|>QsMnJ}9y}{1{&v%Z6#>NKg_dH^=dMIWmBpSLK^iGdmyWMvEi;F22UiMu<7B}~_%H6t5e=upv z+jsBy%YXBTqKF_6w90w)>Tmx2@|kcrB3%;U*BpvZtBR`?ebO{#?{6}Rk|mq1c5AdrvUcrWfv3!;=zc(HypM>wBeE_MqrRwxHv`mnu2KdUtA*fp4%Gj za-Qbi!lE2MsXECO{cwmO=Zpii2-a2*u^1!Q9e*c+wgarK&|;6Hfmu9y&69x_nK7}+ z(J0UXm?02hjGd(A+N#x6AiDkfiXy1jidb?KDK^t+^B%)dV%4VPfcx?D7cjg7Y-@(vl)kK9T(&U&Tiy?fBvFA82(tMcsk|3jhEB07*qo IM6N<$g1dTx`~Uy| diff --git a/left2.png b/left2.png index 62daf9cb404b9a96004d8cf15ffc65a6c70658f1..56a71b61a0de66ffcf89ff409d0c34bfda675398 100644 GIT binary patch delta 640 zcmV-`0)PFu2aE-f7k?QD1^@s6F&7Tg00070NklwBRE``p-4YqR<_WXQ&4ay#HW?+JaG-304X{;Py&BxGNodM)Ce>ytkG@hZYXL$1w`2`=I(GNPf+GZnnMTgL~ZseFi!b9I%5 z-Q^wGCuqMaUf<%ZWi6D_9vHly-hegb;Kz0Y?RJ5(7^T!;_mQEjO+S#3Fbt)*argtl z!mYY;I@31zo^f!D`w;>DDYb0UkCxC!!(K{zQ0{{+Y%mve?P z$hBQ)xkK{VnOLSbxIE#?d$yn%xDv~O?j3|?9|2X4x4^+~crdEgIig6X4|GeubzW=U zt<8Uif_o&kSxE-Cxc7YgpUd!&;*mnCTkaIrtuYq07##dn`oPPu4wkV9QsTrzu aOUo~9P!Pq9ZAzH{0000>YwHn@s9`xq-*AtSA&I-d`3pBoA5>YO_%ILDaBnpY-HWQMr!{A zKF<-OQ2=zy4}VZfv9#*1M`;bTWe?j;E$u~!Fx!sBcDsyv|wlilMPac=ek=VmXU z)cqqq<8%RVmhkx;S+NjbjGV&Ojb0!Hly9&nx|6@gtK;mg}h?3Em_hf?&vZHPV^9dsuc*cPrOAdu^OVkyx1S@`PcyL z>do-_zJHgQnVA8gv$KmKvj+mX148HHvOFv!R zTgi^kkxI6s^$MAEij!km92sqRIt$=n;;?CR9DlACJswvM?=p&1O-%RAqtJMI2FAX_ zwnN117>B1nL{2)$gh6({rx+fZT zfF7S009{tbJZ3*fQ^e-sw>R{6ezxi0yeNoTK6fLxn8W?|zRXwcJ%<0C{Q>2JM)U)& R^-2H$002ovPDHLkV1lP`yS)Ga diff --git a/model.py b/model.py index fb61d6a3..e3dab945 100644 --- a/model.py +++ b/model.py @@ -23,7 +23,8 @@ def x_movement(self, event, game_object): """ if (not (event.type == KEYDOWN or event.type == KEYUP) or game_object.attacking or - game_object.damage_time > 0): + game_object.damage_time > 0 or + game_object.shielding): return #KEYDOWN events toggle movement on @@ -64,13 +65,28 @@ def y_movement(self, event, game_object): if event.key == game_object.keys["up"] and game_object.jumps > 0: game_object.vel_y = game_object.jump_vel game_object.jumps -= 1 - print("up", game_object.vel_y) + + def shield(self,event, game_object): + """ + Used to update the shield state of a character + """ + if (game_object.attack_time > 0 or + game_object.damage_time > 0): + return + if event.type == KEYDOWN: + if event.key == game_object.keys["down"]: + game_object.shielding = True + if event.type == KEYUP: + if event.key == game_object.keys["down"]: + game_object.shielding = False def attack_command(self, event, game_object): """ Used to toggle the attacking mode for a character object for a given amount of time. """ + if game_object.shielding: + return if event.type == KEYDOWN: #NOTE: Change to custom/dynamic character attack button. if event.key == game_object.keys["attack"]: @@ -91,10 +107,11 @@ def update_motion(self): char.jumps = char.max_jumps for other_chars in self.characters: if other_chars.left: - char.detect_damage(other_chars.attack_rect, -1) + char.detect_damage(other_chars, -1) else: - char.detect_damage(other_chars.attack_rect, 1) + char.detect_damage(other_chars, 1) print(char.damage_time) + char.move() char.attack_action() diff --git a/right.png b/right.png index af31e6ce5d630bb2aba9e66528d30396a230f03f..011c28b8894e928131211ae1515e1ffeb8ad1dbb 100644 GIT binary patch delta 557 zcmV+|0@D5M1-S%}7k?QD1^@s6F&7Tg00062NklKfaj#UUrA{s$p;Vo`wg*`^I>VvDP91{M<_=iAfPvfQ`6wM z3CC~B%AU1?<0G1V2uBJ$xDH;vzBj`BXN6<3z7&8?hUF{^Jz+%1w|^|;S&BAolM(v} z)$>4Fnt^Erru@99g6tCWm z6M@F*>U1!kT$;sC4*?jKkCN4OMY=OPp|wWS)E99$^{DYUpBvP5-AT`A>R;x4WO&Dg zI!u$E$`VZRP2)gtV&Q4x*~~LPohHT&kbg?IQkSH6(KO-HHbzgLQ5sc1 zEGU^5L(K1CxuIc{OwoI_b|oaWB^CXXcrBK{BS~bW($Ct&+)dyNi$hN$bS-RXmMZIn z8HqO3?q?(8Yktl$X0PP1bnVW->=yGjotMCJ0&_2-VzF5Rgfk z6ln$q0j~Byzyp?Uz)qJ=`P0(vq?6BnzVF`McX#mLiMQ{EIVgZFbtMjHZ1DHD0o{X| z4L~bNw)nmI`@;?B{gzv;-!6)8_NUwj6~L6b3COLTt)8_toM(V-&`N1n*PLx>FM*CR zSZld!95WwIihtlH;KD99^U(%f>Gb@)YOkgB2yI5F#$DC8tJ5sgQMauxs^I{#h_tc*yqhU5(t5j0xl3tAmn~Xz1Qcmd4E!r>3ZbtZR{AdTlqk@{-<#S z@I?r6m}V)LcXMy=q^PQX_dH~+2Rr7JiM{tOJ52@fmkZ9mKJ1+`(sZt>OI1~k<5;sS z)j8<6Wc}5Hyo>Z_K+bUapoMVjD%46w*NwLTR?3`Q-fgBWPqm~ypBW>L#-qz8JDuUo>yU*n+DE3S4 zQXCPcebqVmjJFnqs(aLEdQST22n~T UBm)CIZU6uP07*qoM6N<$f?60&i2wiq diff --git a/right2.png b/right2.png index ae731d7781d119988a8ce3e695ee1b6251c63328..5310d53e37487fafe03d4ca728caecf72eeca2e1 100644 GIT binary patch delta 631 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 diff --git a/up2.png b/up2.png index c440782efc64215f5fb0b344f540f31168ff9b46..70aea74f0fbdc18ae61ac442e814e9f68d653119 100644 GIT binary patch delta 770 zcmV+d1O5D<2#p4i7k?NC1^@s6`b*t*0008iNklu{ zM#{g4KKJpj0fI!;r3 zXW$8n;v~f|9h$?^&{yms4J#w7&iHMlEO1`O+7dFC$%4iGN09|Aj+RiJl=NZP3`@Tp zv!uT~U%}^S4S$`~0keGpUt+b*P&Ry5eJ?Mb`c1sp{}5BOAzxG&`SKs|QblS-4y-v1!1#74nN9tAA2m&lDin+`WK~hd~n=Jqu&@ zF=jJ{K-jYf{t4WqB5Ji7@cjoWqdzBUF}JfqCW(LLMqZHo$D;f8tk!sfk*y9RfK#71oW=|>CRhQY0v$3A~T)b`P&u+9e zf%{rgE`c*juMO}>*dnuQO}ekSn}%U`I_uDLN_z+tJphWdKnd@I64?t^Yc^1ZoXiD0`Wy}A%3)CsQ>@~07*qoM6N<$f(DFd A9RL6T delta 1048 zcmV+z1n2vW2A~L#7k?WF1^@s6eBZCw00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;sXs9CMR6&Td4p51FcC!K~zY`?UipxU1c1{KS$2C z<94!R-rQN4+{ECv9Qwk_$iW>IxG5#{#*v7U3n>Fxz7PruCVw$#BVWW2y5uc{f{d&# z>q3{!;VoQTh7BQut6l8Qojb32bVql)rey{T9Z!=Z=_hav*-Y3qoLbx(?QRzyUkeW*#Svm(i^ zth5g`$xJjY*E$@jqEdzeBa-QIWJ3*KdbJ*Z!y^FfnSab8V;%sbQ{T`N|A^wuE%x{{ z0A^zj08f=4CO@FEzfV^-2>z0}3PAf%lVoZw+!B|-yZ6&l^*Vo8DW;ZI$R;h04z?0J zQ^OO34{@-hhWg=J1t6Qviiik+y50b2u$%EBI#WtdbdYrBc}GC6cK$&8;m;UUO%2PHeLJJE_tG7_RM z#44PgR<^aTZnIYkG?mL)7srcpX>bz5HP%RN*PTFX6}xj{QwzK6Ef;7i%ZA6(XpCAq z#01-&Lv!;$yNze8Lis*)!$3PzDsK0TvVX08Evh!2~NmPquxaxYh;`573z2+5mZv7wI2zxgkY8?AE0 zXvp Date: Fri, 16 Mar 2018 10:09:50 -0400 Subject: [PATCH 15/17] finalization. new attack sprites and general refinement --- GameView.py | 27 +++++++++++++++++---------- character.py | 5 ++++- fire.png | Bin 0 -> 1961 bytes model.py | 11 ++++++++++- 4 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 fire.png diff --git a/GameView.py b/GameView.py index 238dffb6..a071df4f 100644 --- a/GameView.py +++ b/GameView.py @@ -8,8 +8,9 @@ def __init__(self, model, size): self.model = model self.size = size self.screen = pygame.display.set_mode(size) - - + pygame.font.init() + self.font = pygame.font.SysFont('Arial', 120) + self.textsurface = self.font.render('GAME OVER', False, (0, 0, 0)) def draw(self): """ Updates graphics to game screen @@ -18,6 +19,9 @@ def draw(self): for t in self.model.terrains: pygame.draw.rect(self.screen, pygame.Color(150,120,10), t.rect) for char in self.model.characters: + if char.attacking: + + self.screen.blit(char.attack_img, char.attack_rect) if char.shielding: self.screen.blit(char.shield_img, char.rect) elif(char.left): @@ -30,15 +34,16 @@ def draw(self): self.screen.blit(char.up_img, char.rect) for i in range (char.lives): self.screen.blit(char.up_img, (570 + 120 * i, 950 - char.player * 150)) - pygame.draw.rect(self.screen, pygame.Color(100,100,100), char.attack_rect) + if model.game_over: + self.screen.blit(self.textsurface,(400,100)) pygame.display.update() if __name__ == "__main__": clock = pygame.time.Clock() FPS = 30 - char1 = Character(pos_x = 1200, label = 'char1') - char2 = Character(label = 'char2', keys = {"left": pygame.K_j, "right": pygame.K_l, "up" : pygame.K_i, "down": + char1 = Character(label = 'char1') + char2 = Character(pos_x = 1200, label = 'char2', keys = {"left": pygame.K_j, "right": pygame.K_l, "up" : pygame.K_i, "down": pygame.K_k, "attack" : pygame.K_o}, left_img = "left2.png", right_img = "right2.png", @@ -51,11 +56,13 @@ def draw(self): while model.game_running: for event in pygame.event.get(): model.quit(event) - for char in model.characters: - model.x_movement(event, char) - model.y_movement(event, char) - model.attack_command(event, char) - model.shield(event, char) + if not model.game_over: + for char in model.characters: + model.x_movement(event, char) + model.y_movement(event, char) + model.attack_command(event, char) + model.shield(event, char) + model.check_lives() model.update_motion() view.draw() clock.tick(FPS) diff --git a/character.py b/character.py index d7356641..e29a897d 100644 --- a/character.py +++ b/character.py @@ -16,6 +16,7 @@ def __init__(self, pos_x = 300, pos_y = 0, label = "blank", up_img = "up.png", down_img = "down.png", shield_img = "shield.png", + attack_img = "fire.png", lives = 3, player = 1): self.keys = keys @@ -50,6 +51,7 @@ def __init__(self, pos_x = 300, pos_y = 0, label = "blank", self.up_img = pygame.transform.scale(pygame.image.load(up_img), (self.width, self.height)) self.down_img = pygame.transform.scale(pygame.image.load(down_img), (self.width, self.height)) self.shield_img = pygame.transform.scale(pygame.image.load(shield_img), (self.width, self.height)) + self.attack_img = pygame.transform.scale(pygame.image.load(attack_img), (int(self.width * 0.7), int(self.height * 0.5))) self.player = player self.shielding = False @@ -118,8 +120,9 @@ def move(self): self.rect = pygame.Rect(self.pos_x, self.pos_y, self.width, self.height) if(self.pos_y > 1000): self.pos_y = 0 - self.pos_x = 500 + self.pos_x = 700 self.lives -= 1 + self.weight = 1 def attack_action(self): """ diff --git a/fire.png b/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..ff08964c952c153aff3fb43bfec40c0fb8cd3f34 GIT binary patch literal 1961 zcmaJ?YgiI!7Dg!v({R=icgzxVig|2B1uvzUc%hL*biAdRI+J+A%he%D&LJ;Ce zh>X;90^)RRrqdVrUH|~(jrH~j&Yn`j=fbeK&tLfK6oO3JzG_H5`Cy==#%B-6O$wA_Jx_K`;2GY&7|Uj25RcI} zFfiba5~Wa@j%3er?dnBYe1FZ96DlSCunt`+k1ffd4)trLNBXs34gH-%?a}6 zjJ!;t`|gI1FfZUZs2B2@qNUQCUi4DZJg4E-HrT}&QsCM$*`mS*TWF4E>{KUcLWW6B zyN)G6L;(q~axAziRCrbg;}lmY}sD zuEvYKMUI4RB(vPZD|BVw#oa+k=(PyL+(U7K;#2415buF}fay2aG-97ix+~nJR@7RP zlCtcBZ=_$R?eC~jQQRcU!R+Jx8G+MieCpqu4^6Ps#5bfn4)(|`^QwuyIsF6M8MfC8 z17L9IyCS_K?zg&83RY)@=XJsxo7&Kowksj8%oU6RGblnE_F>OJ5CRS zo81zVqCch39&lRX*n4VoMK&74n+t1qUFjzaSMRAxeEmex>u6E!vxMD&-?sNI4TtBO zIIj5sWN$3*ckzWB4JhOLWu`Mp=f8^f0ane%Vt0kY5TaaYh#b1$d#2Ij<+QjK^yCM6 z?mTnya4{)v#tA5gPbJ>Z7!)BERsG{ zvjjKTt0w8WD{qJ7J=r{`dfd zUYF3)45!H*_IXbs9Icdx0P@DVI z)JWD@3tcIMh>4R`jHBkVhh%ZmpiQ|08lfvlXZeXA)Q6Gs=U}y&GU?c+=H48&Zi`?r z*PMrs;IdGn!sW3Vxlse1#<79;b2^aBhDq__^Dd~^*4B~8wHj7~G&nS#;3rlJLq-V^ zx_k7)(vHm>VBI-7mf}1^$eMM5kJ&gk20JCIAR8~Ots(weW~@3F?CrXFt&coqPX9A$ z?>|Eo4H=WKZkuCYaa@0G!eROMjFl;qlusOw_;zVP>0f!4suCm6)IR;upWA#ZdLK>X zlqvTQ&7RVZ$j9JmOg!)r3~G#FqDyECW#sPovtLzd>|OSNPfTPpv`Bt_KQcCYw&Cnz zsl!;%pOW7=AMdcfJ)$kW9FHzM37@yf1TH>F3>gmupjL&OEaQ3@WXkgZqwWEj( ze4CaA)~rmP){5443k?YJfsTBs*R3ea{Wo4}EQLpMeRM3G{v3Bq+qJ?AtE+ClS12`^ zeN#yO8ETK@T4f>^#qA2_)$^dXi~j2S)_L%M}YF6C8R}{*pNicjax!2 zb^fzF-mVVqn7mU?*<9JhRzZ2erJlq#6Yxj&m5-&&g7L?8tlDq*bM5X0U@>^_4$rU8 F{|lkkZ2SNK literal 0 HcmV?d00001 diff --git a/model.py b/model.py index e3dab945..b794cef0 100644 --- a/model.py +++ b/model.py @@ -7,6 +7,7 @@ class Model: def __init__(self, *args): self.game_running = True + self.game_over = False self.g = 15 self.terrains = [] self.characters = [] @@ -14,7 +15,7 @@ def __init__(self, *args): for char in args: self.characters.append(char) - self.terrains.append(terrain.Terrain((200,600), (1100,400))) + self.terrains.append(terrain.Terrain((200,600), (1100,50))) def x_movement(self, event, game_object): """ @@ -115,6 +116,14 @@ def update_motion(self): char.move() char.attack_action() + def check_lives(self): + """ + Checks to see a player has lost + """ + for char in self.characters: + if char.lives < 1: + self.game_over = True + def quit(self, event): if event.type == QUIT: self.game_running = False From f27647b176b0c9624650b37d16e7bf881e47fa94 Mon Sep 17 00:00:00 2001 From: jzerez Date: Fri, 16 Mar 2018 13:08:31 -0400 Subject: [PATCH 16/17] readme --- Project writeup and reflection.pdf | Bin 0 -> 94862 bytes README.md | 17 +++++++++++++++++ UML.jpg | Bin 0 -> 47161 bytes 3 files changed, 17 insertions(+) create mode 100644 Project writeup and reflection.pdf create mode 100644 UML.jpg diff --git a/Project writeup and reflection.pdf b/Project writeup and reflection.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f75b02d092da688c36ff8aed590d517b1880084c GIT binary patch literal 94862 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

|Ivd@%+*r%Q;1UKU)T;mcp^FV7N2n}#~ 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 cO-Q<`C+;Iq`u|gCt^Zsj|6loA Date: Fri, 16 Mar 2018 13:09:43 -0400 Subject: [PATCH 17/17] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90fd4fc7..20ab3b67 100644 --- a/README.md +++ b/README.md @@ -15,5 +15,5 @@ python GameView.py Character 1, the one on the left, is controlled with the W, A, S, D, and E keys. The W, A, and D keys are for movement, S if for shield, and E is to attack. Charcter 2, the one on the right, is controlled with the I, J, K, L, and O keys. The I, J, and L keys are for movement, K is for shield, and O is to attack. -#Project Reflection -A project reflection can be found here. +# Project Reflection +A project reflection can be found [here](https://github.com/mhreid/InteractiveProgramming/blob/master/Project%20writeup%20and%20reflection.pdf).