ich bin derzeit dabei ein kleines Spiel zu schreiben, indem es darum geht vor einem npc zu flüchten.
Leider habe ich es bisher nur soweit geschafft, dass der NPC sich nur zufällig bewegt, aber nicht in Spieler Richtung.
Ich würde dass ganze so umsetzen, dass geschaut wird, von welcher Seite der Spieler am kürzesten entfernt ist und dann in die Richtung gegangen wird.
Hat jemand von euch eine bessere Idee, wie man das ganze umsetzen könnte oder kann mir erklären, wie dies geht ?
Erster Ansatz war:
if kianrect.top - honeyrect.bottom > kianrect.left - honeyrect.right or kianrect.top - honeyrect.bottom > kianrect.bottom - honeyrect.top or ...
Allerdings kann dass für mich nicht der richtige Lösungsansatz sein, da er mir ziemlich umständlich erscheint.
Mein Code:
Code: Alles auswählen
import pygame, sys, random #Funktionssammlungen werden geladen
pygame.init() #Die Funktionssammlung pygame wird initialisiert
#Programmtaktung
clock = pygame.time.Clock() # Zeitgeberobjekt wird erstellt --> Für die Begrenzung der Framerate
#Displayeinstellungen
displaysize = width, height = 1200, 900 # Größe des anzuzeigenden Fensters
BLACK = 0, 0, 0 # Erstellung einer Konstanten mit dem RGB-Wert für Schwarz
WHITE = 255, 255, 255 # Erstellung einer Konstanten mit dem RGB-Wert für Weiß
screen = pygame.display.set_mode(displaysize) #Erstellen eines Bildschirmojektes bzw. einer Leinwand zum "Bemalen"
pygame.display.set_caption("EscapefromHoney / ETAGE 0") # Setzen des Spieltitels
#Spielentities
map1 = pygame.image.load("maps\map1.png") # Eine Bilddatei wird geladen und in einer Variablen gespeichert
map1rect = map1.get_rect() # Ein unsichtbarer Kasten wird gemäß der Bildgröße gespeichert
map1rect.top = 0 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
map1rect.left = 0 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
#map1speed = [3, 3]
#Spielentities
kian = pygame.image.load("pictures\kian60x60.png") # Eine Bilddatei wird geladen und in einer Variablen gespeichert
kianrect = kian.get_rect() # Ein unsichtbarer Kasten wird gemäß der Bildgröße gespeichert
kianrect.top = 120 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
kianrect.left = 120 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
#kianspeed = [3, 3]
#Spielentities
honey = pygame.image.load("pictures\honey60x60.png") # Eine Bilddatei wird geladen und in einer Variablen gespeichert
honeyrect = honey.get_rect() # Ein unsichtbarer Kasten wird gemäß der Bildgröße gespeichert
honeyrect.top = 480 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
honeyrect.left = 600 # Die Oberkannte des Kastens wird in der Mitte des Bildschirms positioniert
#honeyspeed = [3, 3]
door = pygame.image.load("pictures\door.png")
doorrect = door.get_rect()
doorrect.top = 300
doorrect.left = 0
#Spiellogikvariablen
score = 0
gameover = False
key_picked = False
#Gameover Szenario
# def Start_Gameover():
# while 1:
# global gameoverscreen
# global gameover
# global gameoverrect
# gameover = True
# gameoverscreen = pygame.image.load("pictures\gameover.jpg")
# gameoverrect = gameoverscreen.get_rect()
# gameoverrect.left = 0
# gameoverrect.top = 0
# screen.blit(gameoverscreen,gameoverrect)
# pygame.display.flip()
def drawGrid():
blockSize = 60 #Set the size of the grid block
for x in range(0, width, blockSize):
for y in range(0, height, blockSize):
rect = pygame.Rect(x, y, blockSize, blockSize)
pygame.draw.rect(screen, WHITE, rect, 1)
def Honeyup():
if honeyrect.top - 60 < 0:
honeyrect.top = 55
if gameover == False:
honeyrect.top = honeyrect.top - 60
def Honeydown():
if honeyrect.bottom + 30 < 880 and gameover == False:
honeyrect.top = honeyrect.top + 60
def Honeyright():
if honeyrect.left + 30 < 1140 and gameover == False:
honeyrect.left = honeyrect.left + 60
def Honeyleft():
if honeyrect.left - 60 < 0:
honeyrect.left = 60
if gameover == False:
honeyrect.left = honeyrect.left - 60
#Spieldauerschleife, was hier geschrieben steht wird solange wiederholt bis es vom Benutzer oder durch Programmcode aktiv abgebrochen wird
while 1:
if key_picked == False:
key = pygame.image.load("pictures\key.png")
keyrect = key.get_rect()
keyrect.top = 600
keyrect.left = 480
screen.blit(key, keyrect)
for event in pygame.event.get(): #Schleife die für jedes Event/Ereignis, welches in der Zwischenzeit stattgefunden hat durchgeführt wird
#drawGrid()
if event.type == pygame.QUIT: sys.exit() #Der Benutzer beendet das Programm --> Programm/Spiel wird beendet
if event.type == pygame.KEYDOWN: #Der Benutzer hat eine Tastaturtaste gedrückt
if event.key == pygame.K_ESCAPE: #Die dedrückte Taste ist Escape
pygame.quit()
sys.exit() #Programm/Spiel wird beendet
if event.key == pygame.K_DOWN:
if kianrect.bottom + 30 < 880 and gameover == False:
kianrect.top = kianrect.top + 60
if event.key == pygame.K_UP:
if kianrect.top - 60 < 0:
kianrect.top = 45
if gameover == False:
kianrect.top = kianrect.top - 60
if event.key == pygame.K_RIGHT:
if kianrect.left + 30 < 1140 and gameover == False:
kianrect.left = kianrect.left + 60
if event.key == pygame.K_LEFT:
if kianrect.left - 60 < 0:
print(kianrect.left)
kianrect.left = 60
if gameover == False:
kianrect.left = kianrect.left - 60
Spielzuege = ["Honeyup", "Honeydown", "Honeyright", "Honeyleft"]
if event.type == pygame.KEYDOWN and gameover == False:
if random.choice(Spielzuege) == "Honeyup":
print("Up")
Honeyup()
elif random.choice(Spielzuege) == "Honeydown":
Honeydown()
print("DOWN")
elif random.choice(Spielzuege) == "Honeyright":
Honeyright()
print("RIGHT")
elif random.choice(Spielzuege) == "Honeyleft":
Honeyleft()
print("LEFT")
#Gameover Bedingung, wenn Honey und Spieler auf einem Kästchen
if kianrect.bottom == honeyrect.bottom and kianrect.left == honeyrect.left:
gameover = True
print("GAMEOVER")
import gameover
if kianrect.bottom == keyrect.bottom and kianrect.left == keyrect.left:
key_picked = True
kianrect.bottom = keyrect.bottom
kianrect.left = keyrect.left
if kianrect.bottom == doorrect.bottom and kianrect.left == doorrect.left:
if key_picked == True:
import etage1
print("JO")
else:
pass
#import etage1
pygame.display.update()
clock.tick(60) #Begrenzung der Framerate auf max. 60 fps
screen.blit(map1, map1rect)
screen.blit(door, doorrect)
screen.blit(kian, kianrect)
screen.blit(honey,honeyrect)
pygame.display.flip() #Schattenbild/Hintergrund/Backbuffer Bild wird mit dem Lichtbild/Vordergrund/Frontbuffer Bild getauscht
Viele Grüße
Kian
PS: Ich möchte nochmal anmerken, dass der Code noch nicht aufgeräumt oder optimiert ist, ich bitte um Verständnis:)