Compare commits

...

12 Commits

Author SHA1 Message Date
Christian
89c5dcc6d1 Added requirements.txt
Fixed projectilespawn from enemys
2024-08-26 22:03:26 +02:00
Christian
ae750f236d Adjusted healtbar player 2 2024-08-25 22:32:56 +02:00
Christian
3f2b519820 Updated scoring for two players 2024-08-25 22:28:22 +02:00
Christian
9dc0b6289f Added some testsprites
Added 2 Player gamemode
Some changes to get second player handled
2024-08-25 22:19:48 +02:00
Christian
923f476303 Some cleanup 2024-08-24 12:03:24 +02:00
Christian
31a695f099 Added itemhandler to game module 2024-08-22 21:44:44 +02:00
Christian
b6590d33b8 Added new classes
Edited player.get_damage() function
2024-08-20 22:10:55 +02:00
Christian
6742e4585d Changed renderingsize to 1280x720 for 16:9 monitors 2024-08-18 22:04:03 +02:00
Christian
0065c3c033 Added animations class
Editet readme.md
Some changes on mainfile
2024-08-18 20:00:25 +02:00
Christian
31384e03df Added readme.md
Added keybind F9 for window mode
Player gets damage if he gets hit by enemy projectile
2024-08-18 14:54:56 +02:00
Christian
e87c7fed02 Merge branch 'master' of https://git.bobe-rabenau.de/christian/test 2024-08-18 13:46:41 +02:00
Christian
ee9625bbff Added keybinding for fullscreen mode 2024-08-18 13:36:41 +02:00
19 changed files with 1325 additions and 158 deletions

2
.gitignore vendored
View File

@@ -1,4 +1,6 @@
.venv/
__pycache__/
build/
dist/
test.spec
log.txt

View File

@@ -1,5 +1,5 @@
import pygame
import interface
#Statics
spawned_enemys = list()
@@ -14,7 +14,7 @@ class GameObject(object):
self.image = image
self.rect:pygame.Rect
self.objects.append(self)
self.keymap = {"up":False, "down":False, "left":False, "right":False}
def get_objectinfo(self):
print(F"Gameobject-Info: \n",
@@ -25,9 +25,9 @@ class GameObject(object):
def render(self, screen:pygame.Surface):
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:
print("Kein Image hinterlegt!")
self.rect = pygame.draw.rect(screen, (255,0,0), (self.pos_x, self.pos_y, self.width, self.height))
return
def setpos(self, pos_x, pos_y):
@@ -38,15 +38,24 @@ class GameObject(object):
self.width = width
self.height = height
def __del__(self):
#Remove objectpoint on delete from static
if(len(self.objects) > 0):
print(F"Remove: {self}")
self.objects.remove(self)
class Player(GameObject):
def __init__(self, name, screen, pos_x, pos_y, width, height, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, image)
self._speed = 10
self.screen = screen
self._speed = 8
self.screen:pygame.Surface = screen
self.points = 0
self._health = 100
self.lifes = 2
self.kills = 0
#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())
self.keymap = {"up":False, "down":False, "left":False, "right":False}
def handle_input(self, event:pygame.event.EventType):
if(event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT):
@@ -66,6 +75,16 @@ class Player(GameObject):
#print("Feuer!")
self.fire(self.screen)
def get_health(self):
return self._health
def get_damage(self, damage:int):
if((self._health - damage) <= 0):
self._health = 0
else:
self._health -= damage
def move(self, x=0, y=0):
if x != 0:
self.pos_x += x
@@ -79,9 +98,15 @@ class Player(GameObject):
if(direction == "right"):
self.pos_x += self._speed
def fire(self, screen):
shot = Projectile(self.name, self.pos_x+(self.width/2),self.pos_y-self.height,5,10, screen)
def update_interface(self):
self.healthbar.update(self._health)
self.healthbar.render(self.screen)
def fire(self, screen):
projectile_width = 6
projectile_height = 10
shot = Projectile(self.name, self.pos_x+(self.width/2)-(projectile_width/2), self.pos_y-projectile_height, projectile_width, projectile_height, screen, 8)
#Maybe change this by another subroutine in Projectiles class
def firecontrol(self, screen):
if(len(Projectile.shots) > 0):
for objects in Projectile.shots:
@@ -91,7 +116,6 @@ class Player(GameObject):
if(key == "Player"or key == "Player2"):
object.animate("UP")
#print("Playerschuss!")
if(key == "Enemy"):
#print(object.pos_x, " ", object.pos_y)
pass
@@ -99,10 +123,11 @@ class Player(GameObject):
def get_health(self):
return self._health
class Player2(Player):
def __init__(self, name, screen, pos_x, pos_y, width, height, image=None) -> None:
super().__init__(name, screen, pos_x, pos_y, width, height, image)
self.healthbar = interface.Healthbar(screen, "Player1", screen.get_size()[0]-320, screen.get_size()[1]-80, 300, 10, self.get_health())
def handle_input(self, event:pygame.event.EventType):
if(event.type == pygame.KEYDOWN and event.key == pygame.K_a):
self.keymap["left"] = True
@@ -136,14 +161,13 @@ class Enemy(GameObject):
super().__init__(name, pos_x, pos_y, width, height, image)
self.screen = screen
self.movespeed = 10
self._target_x = 0
self._target_y = 0
self.weapon:Weapons = None
def fire(self, screen):
#print("Schieße!!!!")
#shot = Projectile("Enemy", self.pos_x+(self.width/2),self.pos_y+self.height,5,10, screen, 2)
self.weapon.fire()
def firecontrol(self, screen):
if(len(Projectile.shots) > 0):
for objects in Projectile.shots:
@@ -156,9 +180,11 @@ class Enemy(GameObject):
def move(self, x=0, y=0):
if(x != 0):
self.pos_x += x
self.weapon.pos_x = self.pos_x+(self.width/2)
if(y != 0):
self.pos_y += y
def give_weapon(self, weapon):
self.weapon = weapon
@@ -201,6 +227,7 @@ class Weapons(GameObject):
self.duration = duration
self.sprite = ""
self.mountingpos = list()
self.soundfile = ""
def fire(self):
print(F"Feuere: {self.name}")
@@ -208,7 +235,19 @@ class Weapons(GameObject):
class Item(GameObject):
def __init__(self, name, pos_x, pos_y, width, height, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, image)
self.speed = 2
def move(self, x:int, y:int):
self.pos_x += x
self.pos_y += y
pass
class item_extra_life(Item):
def __init__(self, name, pos_x, pos_y, width, height, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, image)
self.speed = 10
class barricade1(GameObject):
def __init__(self, name, pos_x, pos_y, width, height, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, image)

View File

@@ -17,6 +17,6 @@ def load_image(filename, colorkey=None):
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, pygame.RLEACCEL)
image.set_colorkey(colorkey)
return image

7
animations.py Normal file
View File

@@ -0,0 +1,7 @@
class animation(object):
def __init__(self) -> None:
pass
def flyin(self, object):
pass

52
game.py
View File

@@ -1,18 +1,68 @@
############################################################
## Implements all Gamemechanics here! ##
## Implement all Gamemechanics here! ##
############################################################
import GameObject
import animations
from levels import *
import pygame
import logger
import random
import copy
#Leveldefinitions
levels_list.append(first_level("First Level", (500,500), 10, 2))
items = [
GameObject.item_extra_life("Extra-Life", 0, 0, 30, 30, None)
]
enemys_spawned = list()
items_spawned = list()
#Override
def loadlevels():
for level in levels_list:
if(type(level) == "level"):
print("LEVEL")
print(level)
pass
def item_handler(screen:pygame.Surface):
spawn_chance = random.randint(0, 1000)
#print(spawn_chance)
if(spawn_chance == 0):
#print("Spawne item")
spawn_item_random(screen)
for item in items_spawned:
item:GameObject.Item
print(item)
if(item.pos_y >= screen.get_size()[1]):
items_spawned.remove(item)
item.move(0, item.speed)
item.render(screen)
def handle_playerinput(players):
for player in players():
pass
def spawn_item_random(screen:pygame.Surface):
items_spawned.append(copy.deepcopy(items[0]))
print("Spawn")
pass
def spawn_enemys(type:object, count:int):
for i in range(count):
pass
pass
def run(screen:pygame.Surface):
screen = screen
item_handler(screen)
pass

38
interface.py Normal file
View File

@@ -0,0 +1,38 @@
import pygame
class UIelement(object):
def __init__(self, screen, name, posx, posy) -> None:
self.screen = screen
self.name = name
self.posx = posx
self.posy = posy
pass
pass
class Healthbar(UIelement):
def __init__(self, screen, name, posx, posy, width, height,playerhealth) -> None:
super().__init__(screen, name, posx, posy)
self.width = width
self.height = height
self.max_width = width
self.max_health = playerhealth
self.health = playerhealth
def update(self, playerheatlh):
grundwert = self.max_health
prozentwert = playerheatlh
prozent = (playerheatlh/grundwert)
#print(prozent)
#print(prozentwert)
#print(playerheatlh)
#Update until playerhealth not zero
if(self.health > 0):
res = self.max_width*prozent
self.health = res
elif self.health < 0:
self.health = 0
def render(self, screen):
pygame.draw.rect(screen, (255,0,0), (self.posx, self.posy, self.health, self.height))
pass

View File

@@ -11,6 +11,9 @@ class level(object):
self.spawn_waves = spawn_waves
self._completed = False
def run(self):
pass
class first_level(level):
def __init__(self, name, size: tuple, num_enemys, spawn_waves) -> None:
super().__init__(name, size, num_enemys, spawn_waves)

3
readme.md Normal file
View File

@@ -0,0 +1,3 @@
TODOS:
-Add ballistics calculation over time not pixel x framerate

6
requirements.txt Normal file
View File

@@ -0,0 +1,6 @@
altgraph==0.17.4
packaging==24.1
pygame==2.6.0
pyinstaller==6.10.0
pyinstaller-hooks-contrib==2024.8
setuptools==72.2.0

56
sprites/Zeichnung.svg Normal file
View 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
View 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

BIN
sprites/enemy_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

75
sprites/enemy_1.svg Normal file
View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="60"
height="60"
viewBox="0 0 15.874998 15.874998"
version="1.1"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="enemy_1.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="px"
inkscape:zoom="5.8658912"
inkscape:cx="66.145107"
inkscape:cy="36.823049"
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">
<inkscape:path-effect
effect="bspline"
id="path-effect10"
is_visible="true"
lpeversion="1.3"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false"
uniform="false" />
</defs>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#44a900;stroke-width:0.264583"
d="m -23.680329,-16.283045 c 0,0 31.3031395,20.4327406 31.3031395,20.4327406"
id="path10"
inkscape:path-effect="#path-effect10"
inkscape:original-d="M -23.680329,-16.283045 7.6228105,4.1496956" />
<ellipse
style="fill:#b3b3b3;stroke-width:0.335313"
id="path11"
cx="7.8524895"
cy="7.7682891"
rx="3.9080892"
ry="4.1147518" />
<ellipse
style="fill:#b3b3b3;stroke-width:0.3716"
id="path12"
cx="7.937499"
cy="9.6954823"
rx="7.937499"
ry="3.6149874" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

406
sprites/spaceship_1.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

179
test.py
View File

@@ -1,8 +1,8 @@
import pygame
import game
import levels
import logger
import weapons
import interface
import GameObject
import Utils
import time
@@ -14,14 +14,12 @@ pygame.init()
pygame.display.set_caption("TESTFENSTER")
pygame.mouse.set_visible(True)
RENDERING_SIZE = (1024,768)
WINDOWED_DEF_SIZE = (1024,768)
RENDERING_SIZE = (1280,720)
WINDOWED_DEF_SIZE = (1280,720)
#pygame.key.set_repeat(1, 30)
window = pygame.display.set_mode((2440,1200), pygame.FULLSCREEN)
window = pygame.display.set_mode((RENDERING_SIZE))
screen = pygame.Surface(RENDERING_SIZE)
#screen = pygame.display.set_mode((1024,768)) #TODO Add fullscreen mode
log = logger.log("log.txt")
clock = pygame.time.Clock()
@@ -37,6 +35,8 @@ log.writeln("Loading images...")
image_enemy = Utils.load_image("Rastergrafik.png")
testimage = Utils.load_image("Rastergrafik.png")
enemy1 = Utils.load_image("sprites/enemy_1.png")
spaceship = Utils.load_image("sprites/spaceship_1_transp.png", (255,0,255))
log.writeln("Setup fonts...")
font1 = pygame.font.Font("/usr/share/fonts/TTF/Inconsolata-UltraExpandedExtraBold.ttf", 30)
@@ -49,8 +49,14 @@ log.writeln(F"Git-Hash: {short_hash}")
#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)
player2 = GameObject.Player2("Player2", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-100, 35, 35, testimage)
players = [
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)
game.loadlevels()
@@ -59,25 +65,33 @@ spawned_enemys = list()
i = 0
startpos_x = 50
startpos_y = 30
for enemys in range(1):
tmp_weapon = weapons.Laserblaster("Laserblaster", startpos_x, startpos_y, 5, 10, screen, testimage)
tmp = GameObject.Enemy(F"Enemy-{i}", startpos_x,startpos_y,35,35, screen, testimage)
for enemys in range(80):
tmp_weapon = weapons.Laserblaster("Laserblaster", startpos_x, startpos_y+60, 5, 10, 30, 1, 0, screen, testimage)
tmp = GameObject.Enemy(F"Enemy-{i}", startpos_x,startpos_y,60,60, screen, enemy1)
tmp.give_weapon(tmp_weapon)
if(startpos_x >= (screen.get_size()[0]-150)):
startpos_y += 50
startpos_x = 0
print(tmp.get_weapon())
spawned_enemys.append(tmp)
startpos_x += 50
startpos_x += (tmp.width+15)
i += 1
startpos_x = 500
startpos_y = 500
tmp_weapon = weapons.Laserblaster("Laserblaster", startpos_x, startpos_y+60, 5, 10, 30, 1, 0, screen, testimage)
e1 = GameObject.Enemy(F"Enemy-{i}", startpos_x,startpos_y,60,60, screen, enemy1)
e1.give_weapon(tmp_weapon)
gamestate = True
frametime =0
milliseconds = pygame.time.get_ticks()
tmp_time = pygame.time.get_ticks()/1000
seconds = milliseconds/1000
tmp_seconds = 0
while(gamestate):
screen.fill((8,31,61))
@@ -86,46 +100,38 @@ while(gamestate):
del log
gamestate = False
if(event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
pygame.display.set_mode((RENDERING_SIZE))
gamestate = False
player1.handle_input(event)
player2.handle_input(event)
#Push F10 for fullscreen-mode
if(event.type == pygame.KEYDOWN and event.key == pygame.K_F10):
pygame.display.set_mode(RENDERING_SIZE, pygame.FULLSCREEN)
#Push F9 for window-mode
if(event.type == pygame.KEYDOWN and event.key == pygame.K_F9):
pygame.display.set_mode((RENDERING_SIZE))
if(player1.keymap["left"] == True and player1.pos_x > 0):
player1.move("left")
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(player1.keymap["right"] == True and player1.pos_x <= (screen.get_size()[0]-player1.width)):
player1.move("right")
#print("rechts")
if(player.keymap["right"] == True and player.pos_x <= (screen.get_size()[0]-player.width)):
player.move("right")
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")
player.update_interface()
player.render(screen)
#image = screen.blit(testimage, (pos_x, pos_y))
mouse_pos = pygame.mouse.get_pos()
#print(mouse_pos)
#print(image.topleft) #Gibt die Position einen Surfaces "obenlinks" aus
#print(image.size) #Gibt die Größe eines Surfaces aus
#max = tuple(map(lambda i, j : i+j, image.topleft, image.size))
#Wenn Mausposition X-Achse innerhalb Anfangsposition+Breite
#if(mouse_pos[0] <= max[0] and mouse_pos[0] >= image.topleft[0]):
#Wenn Mausposition Y-Achse innerhalb Anfangsposition+Höhe
#if(mouse_pos[1] <= max[1] and mouse_pos[1] >= image.topleft[1]):
#print("Treffer")
#pos_x = mouse_pos[0]
#pos_y = mouse_pos[1]
game.run(screen)
player1.firecontrol(screen)
player2.firecontrol(screen)
#print("Spieler1 Lifes: ", player1.lifes)
#print("Spieler2 Lifes: ", player2.lifes)
for key, obj in enumerate(GameObject.GameObject.objects):
print(key, obj)
#TODO If Playerposition are on the same x-axis then gamble hit by 50% chance
@@ -136,42 +142,34 @@ while(gamestate):
#Check if player hits an enemy delete it
for enemy in spawned_enemys:
enemy:GameObject.Enemy
if(pygame.Rect.colliderect(player1.rect, player2.rect)):
#TODO: Laterrr!!
#print("Collision")
pass
if(pygame.Rect.colliderect(projectile.rect, enemy.rect)):
#print("HIT")
#Check if only a playerhit despawn enemys
if(projectile.name == "Player" or projectile.name == "Player2"):
player1.points += 10
player2.points += 10
if len(players) == 2:
players[0].points += 10
players[1].points += 10
else:
players[0].points += 10
index = spawned_enemys.index(enemy)
del spawned_enemys[index]
index = GameObject.Projectile.shots.index(projectiles)
del GameObject.Projectile.shots[index]
#print(F"Player-Points: {player1.points}")
#print(F"Player-Points: {player2.points}")
index = GameObject.GameObject.objects.index(projectile)
#Report playerkills by player
if(projectile.name == "Player"):
player1.kills += 1
players[0].kills += 1
if(projectile.name == "Player2"):
player2.kills += 1
players[1].kills += 1
#TODO Buggy pygame colliderect is true until projectile passed the hole playrect
# Life decrease only once!
if(pygame.Rect.colliderect(projectile.rect, player1.rect)):
for player in players:
player:GameObject.Player
if(pygame.Rect.colliderect(projectile.rect, player.rect)):
#print("Game-Over")
player1.lifes -= 1
try:
index = GameObject.Projectile.shots.index(projectiles)
del GameObject.Projectile.shots[index]
except:
print("Error on indexing projectile")
#TODO Add Gameover event
if(pygame.Rect.colliderect(projectile.rect, player2.rect)):
#print("Game-Over")
player2.lifes -= 1
player.get_damage(enemy.get_weapon().damage)
try:
index = GameObject.Projectile.shots.index(projectiles)
del GameObject.Projectile.shots[index]
@@ -188,21 +186,14 @@ while(gamestate):
milliseconds = pygame.time.get_ticks()
seconds = milliseconds / 1000
now = time.time_ns()
#print("Playerkills 1:", player1.kills)
#print("Playerkills 2:", player2.kills)
player1.render(screen)
player2.render(screen)
#print(int(seconds), "\r")
rand = random.randint(0, 100)
for enemy in spawned_enemys:
enemy:GameObject.Enemy
if rand == 20:
if rand == 20 and (enemy.pos_x != 0 or enemy.pos_x >= (screen.get_size()[0]+enemy.width)):
enemy.move(5)
#enemy.movementqueue.append(5)
if rand == 50:
if rand == 50 and (enemy.pos_x != 0 or enemy.pos_x >= (screen.get_size()[0]+enemy.width)):
enemy.move(-5)
#enemy.movementqueue.append(-5)
rand1 = random.randint(0, 1000)
@@ -213,17 +204,41 @@ while(gamestate):
enemy.firecontrol(screen)
screen
label1 = font1.render(F"Score: {player1.points}", True, (255,0,0))
fps_label = font2.render(F"FPS: {int(clock.get_fps())}", True, (255,0,0))
screen.blit(label1, ((screen.get_size()[0]/2)-(label1.get_size()[0]/2), screen.get_size()[1]-50))
screen.blit(fps_label, (screen.get_size()[0]-fps_label.get_size()[0]-10, screen.get_size()[1]-25))
screen.blit(hash_label, (25, screen.get_size()[1] -25))
frametime = clock.get_time()
scaled_win = pygame.transform.smoothscale(screen, window.get_size())
#Scales the mainsurface
scaled_win = pygame.transform.scale(screen, window.get_size())
#Blits the mainsurface to the mainwindow
window.blit(scaled_win, (0, 0))
#if(mouse_pos <= (image.topleft+image.size) and mouse_pos >= image.topleft):
# print("HIIIIITTT!!!!")
frametime = 0
clock.tick(60)
pygame.display.flip()
#image = screen.blit(testimage, (pos_x, pos_y))
#mouse_pos = pygame.mouse.get_pos()
#print(int(pygame.time.get_ticks()/1000))
#print(mouse_pos)
#print(image.topleft) #Gibt die Position einen Surfaces "obenlinks" aus
#print(image.size) #Gibt die Größe eines Surfaces aus
#max = tuple(map(lambda i, j : i+j, image.topleft, image.size))
#Wenn Mausposition X-Achse innerhalb Anfangsposition+Breite
#if(mouse_pos[0] <= max[0] and mouse_pos[0] >= image.topleft[0]):
#Wenn Mausposition Y-Achse innerhalb Anfangsposition+Höhe
#if(mouse_pos[1] <= max[1] and mouse_pos[1] >= image.topleft[1]):
#print("Treffer")
#pos_x = mouse_pos[0]
#pos_y = mouse_pos[1]

View File

@@ -1,8 +1,8 @@
import GameObject
class Laserblaster(GameObject.Weapons):
def __init__(self, name, pos_x, pos_y, width, height, screen, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, 10, 2, 0, image)
def __init__(self, name, pos_x, pos_y, width, height, damage:int, firerate:int, duration:int, screen, image=None) -> None:
super().__init__(name, pos_x, pos_y, width, height, damage, firerate, duration, screen, image)
self.screen = screen
self.image = image