Added some testsprites
Added 2 Player gamemode Some changes to get second player handled
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
import interface
|
||||||
#Statics
|
#Statics
|
||||||
spawned_enemys = list()
|
spawned_enemys = list()
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ class GameObject(object):
|
|||||||
|
|
||||||
def render(self, screen:pygame.Surface):
|
def render(self, screen:pygame.Surface):
|
||||||
if(self.image is not None):
|
if(self.image is not None):
|
||||||
self.rect = screen.blit(self.image, (self.pos_x, self.pos_y))
|
self.rect = screen.blit(self.image, (self.pos_x, self.pos_y, self.width, self.height))
|
||||||
else:
|
else:
|
||||||
self.rect = pygame.draw.rect(screen, (255,0,0), (self.pos_x, self.pos_y, self.width, self.height))
|
self.rect = pygame.draw.rect(screen, (255,0,0), (self.pos_x, self.pos_y, self.width, self.height))
|
||||||
return
|
return
|
||||||
@@ -47,7 +47,8 @@ class Player(GameObject):
|
|||||||
self._health = 100
|
self._health = 100
|
||||||
self.lifes = 2
|
self.lifes = 2
|
||||||
self.kills = 0
|
self.kills = 0
|
||||||
self._healthbar = pygame.rect.Rect((15, self.screen.get_size()[1]-50, 100, 20))
|
#self._healthbar = pygame.rect.Rect((15, self.screen.get_size()[1]-50, 100, 20))
|
||||||
|
self.healthbar = interface.Healthbar(screen, "Player1", 25, screen.get_size()[1]-80, 300, 10, self.get_health())
|
||||||
|
|
||||||
def handle_input(self, event:pygame.event.EventType):
|
def handle_input(self, event:pygame.event.EventType):
|
||||||
if(event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT):
|
if(event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT):
|
||||||
@@ -90,6 +91,10 @@ class Player(GameObject):
|
|||||||
if(direction == "right"):
|
if(direction == "right"):
|
||||||
self.pos_x += self._speed
|
self.pos_x += self._speed
|
||||||
|
|
||||||
|
def update_interface(self):
|
||||||
|
self.healthbar.update(self._health)
|
||||||
|
self.healthbar.render(self.screen)
|
||||||
|
|
||||||
def fire(self, screen):
|
def fire(self, screen):
|
||||||
projectile_width = 6
|
projectile_width = 6
|
||||||
projectile_height = 10
|
projectile_height = 10
|
||||||
@@ -110,6 +115,7 @@ class Player(GameObject):
|
|||||||
|
|
||||||
def get_health(self):
|
def get_health(self):
|
||||||
return self._health
|
return self._health
|
||||||
|
|
||||||
|
|
||||||
class Player2(Player):
|
class Player2(Player):
|
||||||
def __init__(self, name, screen, pos_x, pos_y, width, height, image=None) -> None:
|
def __init__(self, name, screen, pos_x, pos_y, width, height, image=None) -> None:
|
||||||
@@ -210,6 +216,7 @@ class Weapons(GameObject):
|
|||||||
self.duration = duration
|
self.duration = duration
|
||||||
self.sprite = ""
|
self.sprite = ""
|
||||||
self.mountingpos = list()
|
self.mountingpos = list()
|
||||||
|
self.soundfile = ""
|
||||||
|
|
||||||
def fire(self):
|
def fire(self):
|
||||||
print(F"Feuere: {self.name}")
|
print(F"Feuere: {self.name}")
|
||||||
|
|||||||
2
Utils.py
2
Utils.py
@@ -17,6 +17,6 @@ def load_image(filename, colorkey=None):
|
|||||||
if colorkey is not None:
|
if colorkey is not None:
|
||||||
if colorkey is -1:
|
if colorkey is -1:
|
||||||
colorkey = image.get_at((0,0))
|
colorkey = image.get_at((0,0))
|
||||||
image.set_colorkey(colorkey, pygame.RLEACCEL)
|
image.set_colorkey(colorkey)
|
||||||
|
|
||||||
return image
|
return image
|
||||||
4
game.py
4
game.py
@@ -46,6 +46,10 @@ def item_handler(screen:pygame.Surface):
|
|||||||
item.move(0, item.speed)
|
item.move(0, item.speed)
|
||||||
item.render(screen)
|
item.render(screen)
|
||||||
|
|
||||||
|
def handle_playerinput(players):
|
||||||
|
for player in players():
|
||||||
|
pass
|
||||||
|
|
||||||
def spawn_item_random(screen:pygame.Surface):
|
def spawn_item_random(screen:pygame.Surface):
|
||||||
|
|
||||||
items_spawned.append(copy.deepcopy(items[0]))
|
items_spawned.append(copy.deepcopy(items[0]))
|
||||||
|
|||||||
56
sprites/Zeichnung.svg
Normal file
56
sprites/Zeichnung.svg
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="500"
|
||||||
|
height="500"
|
||||||
|
viewBox="0 0 132.29166 132.29167"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
||||||
|
sodipodi:docname="Zeichnung.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:zoom="4.1478114"
|
||||||
|
inkscape:cx="106.32113"
|
||||||
|
inkscape:cy="96.436399"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1368"
|
||||||
|
inkscape:window-x="2560"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1" />
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Ebene 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<rect
|
||||||
|
style="fill:#ff00ff;stroke-width:0.251734"
|
||||||
|
id="rect1"
|
||||||
|
width="132.29167"
|
||||||
|
height="132.29167"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
style="fill:#241c1c;stroke-width:0.130533"
|
||||||
|
id="rect2"
|
||||||
|
width="7.9375"
|
||||||
|
height="7.9375"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
56
sprites/backgorund1.svg
Normal file
56
sprites/backgorund1.svg
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="500"
|
||||||
|
height="500"
|
||||||
|
viewBox="0 0 132.29166 132.29167"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
||||||
|
sodipodi:docname="backgorund1.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:zoom="4.1478114"
|
||||||
|
inkscape:cx="106.32113"
|
||||||
|
inkscape:cy="96.436399"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1368"
|
||||||
|
inkscape:window-x="2560"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1" />
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Ebene 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<rect
|
||||||
|
style="fill:#ff00ff;stroke-width:0.251734"
|
||||||
|
id="rect1"
|
||||||
|
width="132.29167"
|
||||||
|
height="132.29167"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
style="fill:#241c1c;stroke-width:0.130533"
|
||||||
|
id="rect2"
|
||||||
|
width="7.9375"
|
||||||
|
height="7.9375"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
411
sprites/just_fun.svg
Normal file
411
sprites/just_fun.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 86 KiB |
BIN
sprites/spaceship_1.png
Normal file
BIN
sprites/spaceship_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
406
sprites/spaceship_1.svg
Normal file
406
sprites/spaceship_1.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 281 KiB |
BIN
sprites/spaceship_1_transp.png
Normal file
BIN
sprites/spaceship_1_transp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
85
test.py
85
test.py
@@ -35,6 +35,7 @@ log.writeln("Loading images...")
|
|||||||
|
|
||||||
image_enemy = Utils.load_image("Rastergrafik.png")
|
image_enemy = Utils.load_image("Rastergrafik.png")
|
||||||
testimage = Utils.load_image("Rastergrafik.png")
|
testimage = Utils.load_image("Rastergrafik.png")
|
||||||
|
spaceship = Utils.load_image("sprites/spaceship_1_transp.png", (255,0,255))
|
||||||
|
|
||||||
log.writeln("Setup fonts...")
|
log.writeln("Setup fonts...")
|
||||||
font1 = pygame.font.Font("/usr/share/fonts/TTF/Inconsolata-UltraExpandedExtraBold.ttf", 30)
|
font1 = pygame.font.Font("/usr/share/fonts/TTF/Inconsolata-UltraExpandedExtraBold.ttf", 30)
|
||||||
@@ -47,10 +48,14 @@ log.writeln(F"Git-Hash: {short_hash}")
|
|||||||
|
|
||||||
#testimage.set_colorkey((255,0,255), pygame.RLEACCELOK)
|
#testimage.set_colorkey((255,0,255), pygame.RLEACCELOK)
|
||||||
|
|
||||||
player1 = GameObject.Player("Player", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-100, 35, 35, testimage)
|
players = [
|
||||||
player2 = GameObject.Player2("Player2", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-100, 35, 35, testimage)
|
GameObject.Player("Player", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-175, 60, 60, spaceship),
|
||||||
|
#GameObject.Player2("Player2", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-175, 60, 60, spaceship)
|
||||||
|
]
|
||||||
|
|
||||||
|
player1 = GameObject.Player("Player", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-175, 60, 60, spaceship)
|
||||||
|
player2 = GameObject.Player2("Player2", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-175, 60, 60, spaceship)
|
||||||
|
|
||||||
healthbar1 = interface.Healthbar(screen, "Player1", 25, screen.get_size()[1]-80, 300, 10, player1.get_health())
|
|
||||||
|
|
||||||
game.loadlevels()
|
game.loadlevels()
|
||||||
|
|
||||||
@@ -97,25 +102,26 @@ while(gamestate):
|
|||||||
#Push F9 for window-mode
|
#Push F9 for window-mode
|
||||||
if(event.type == pygame.KEYDOWN and event.key == pygame.K_F9):
|
if(event.type == pygame.KEYDOWN and event.key == pygame.K_F9):
|
||||||
pygame.display.set_mode((RENDERING_SIZE))
|
pygame.display.set_mode((RENDERING_SIZE))
|
||||||
player1.handle_input(event)
|
|
||||||
player2.handle_input(event)
|
for player in players:
|
||||||
|
player:GameObject.Player
|
||||||
|
player.handle_input(event)
|
||||||
|
|
||||||
|
for player in players:
|
||||||
|
player:GameObject.Player
|
||||||
|
if(player.keymap["left"] == True and player.pos_x > 0):
|
||||||
|
player.move("left")
|
||||||
|
#print("links")
|
||||||
|
if(player.keymap["right"] == True and player.pos_x <= (screen.get_size()[0]-player.width)):
|
||||||
|
player.move("right")
|
||||||
|
|
||||||
|
player.update_interface()
|
||||||
|
player.render(screen)
|
||||||
|
|
||||||
|
|
||||||
if(player1.keymap["left"] == True and player1.pos_x > 0):
|
|
||||||
player1.move("left")
|
|
||||||
#print("links")
|
|
||||||
if(player1.keymap["right"] == True and player1.pos_x <= (screen.get_size()[0]-player1.width)):
|
|
||||||
player1.move("right")
|
|
||||||
#print("rechts")
|
|
||||||
if(player2.keymap["left"] == True and player2.pos_x > 0):
|
|
||||||
player2.move("left")
|
|
||||||
#print("links")
|
|
||||||
if(player2.keymap["right"] == True and player2.pos_x <= (screen.get_size()[0]-player2.width)):
|
|
||||||
player2.move("right")
|
|
||||||
#print("rechts")
|
|
||||||
|
|
||||||
game.run(screen)
|
game.run(screen)
|
||||||
healthbar1.update(player1.get_health())
|
|
||||||
healthbar1.render(screen)
|
|
||||||
player1.firecontrol(screen)
|
player1.firecontrol(screen)
|
||||||
player2.firecontrol(screen)
|
player2.firecontrol(screen)
|
||||||
|
|
||||||
@@ -129,12 +135,7 @@ while(gamestate):
|
|||||||
#Check if player hits an enemy delete it
|
#Check if player hits an enemy delete it
|
||||||
for enemy in spawned_enemys:
|
for enemy in spawned_enemys:
|
||||||
enemy:GameObject.Enemy
|
enemy:GameObject.Enemy
|
||||||
if(pygame.Rect.colliderect(player1.rect, player2.rect)):
|
|
||||||
#TODO: Laterrr!!
|
|
||||||
#print("Collision")
|
|
||||||
pass
|
|
||||||
if(pygame.Rect.colliderect(projectile.rect, enemy.rect)):
|
if(pygame.Rect.colliderect(projectile.rect, enemy.rect)):
|
||||||
#print("HIT")
|
|
||||||
#Check if only a playerhit despawn enemys
|
#Check if only a playerhit despawn enemys
|
||||||
if(projectile.name == "Player" or projectile.name == "Player2"):
|
if(projectile.name == "Player" or projectile.name == "Player2"):
|
||||||
player1.points += 10
|
player1.points += 10
|
||||||
@@ -153,25 +154,18 @@ while(gamestate):
|
|||||||
|
|
||||||
#TODO Buggy pygame colliderect is true until projectile passed the hole playrect
|
#TODO Buggy pygame colliderect is true until projectile passed the hole playrect
|
||||||
# Life decrease only once!
|
# Life decrease only once!
|
||||||
if(pygame.Rect.colliderect(projectile.rect, player1.rect)):
|
for player in players:
|
||||||
#print("Game-Over")
|
player:GameObject.Player
|
||||||
player1.get_damage(enemy.get_weapon().damage)
|
if(pygame.Rect.colliderect(projectile.rect, player.rect)):
|
||||||
try:
|
#print("Game-Over")
|
||||||
index = GameObject.Projectile.shots.index(projectiles)
|
player.get_damage(enemy.get_weapon().damage)
|
||||||
del GameObject.Projectile.shots[index]
|
try:
|
||||||
except:
|
index = GameObject.Projectile.shots.index(projectiles)
|
||||||
print("Error on indexing projectile")
|
del GameObject.Projectile.shots[index]
|
||||||
#TODO Add Gameover event
|
except:
|
||||||
if(pygame.Rect.colliderect(projectile.rect, player2.rect)):
|
print("Error on indexing projectile")
|
||||||
#print("Game-Over")
|
#TODO Add Gameover event
|
||||||
player1.get_damage(enemy.get_weapon().damage)
|
|
||||||
try:
|
|
||||||
index = GameObject.Projectile.shots.index(projectiles)
|
|
||||||
del GameObject.Projectile.shots[index]
|
|
||||||
except:
|
|
||||||
print("Error on indexing projectile")
|
|
||||||
#TODO Add Gameover event
|
|
||||||
|
|
||||||
#Check for bullets out of playground and delete it
|
#Check for bullets out of playground and delete it
|
||||||
if((projectile.pos_y > screen.get_size()[1]) or (projectile.pos_y < 0)):
|
if((projectile.pos_y > screen.get_size()[1]) or (projectile.pos_y < 0)):
|
||||||
#print(F"Lösche: {projectile}")
|
#print(F"Lösche: {projectile}")
|
||||||
@@ -181,11 +175,8 @@ while(gamestate):
|
|||||||
milliseconds = pygame.time.get_ticks()
|
milliseconds = pygame.time.get_ticks()
|
||||||
seconds = milliseconds / 1000
|
seconds = milliseconds / 1000
|
||||||
now = time.time_ns()
|
now = time.time_ns()
|
||||||
|
|
||||||
player1.render(screen)
|
|
||||||
player2.render(screen)
|
|
||||||
|
|
||||||
rand = random.randint(0, 100)
|
rand = random.randint(0, 100)
|
||||||
|
|
||||||
for enemy in spawned_enemys:
|
for enemy in spawned_enemys:
|
||||||
enemy:GameObject.Enemy
|
enemy:GameObject.Enemy
|
||||||
if rand == 20:
|
if rand == 20:
|
||||||
|
|||||||
Reference in New Issue
Block a user