Pygame Bild flackert bzw. wird nicht angezeigt

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Hallo liebes Python Forum:
Ich programmiere grade mit PyGame ein spiel und möchte ein Grid erzeugen. Nur wenn ich Felder also "Rect" zeichne, wird mir dieses nicht angezeigt.

Code: Alles auswählen

#PyBedwars - by cool_brick24
#Minecraft Hypixel Bedwars in Python neu erstellt.

#Ideen:

'''
-Andere Texturen etc.
-Unsichtbaren 1 Pixel breiten Balken runter laufen lassen, und wenn dieser unten ist, spawnt dieser wieder oben und ein Eisen wird generiert. Somite kann ich die Pixel anzahl(Wie viele er nach unten gehen soll),
-bestimmen und dies als Zeit benutzten ohne das mein Programm stoppt!



'''






import pygame
import sys
import random



pygame.init()

(width, height) = (750, 750)
screen = pygame.display.set_mode((width, height))

pygame.display.set_caption("PyBedwars - V 1.0 - by Cool_brick24")
pygame.display.flip()





clock = pygame.time.Clock()

#Variablen


void = 0
sandstone = 1


temp = 0


GridX = 0

GridY = 0


GridWidth = 30
GridHeight = 30

row = 0
col = 0

grid = []




gridImg = pygame.image.load("./img/grid.png")
gridImg = pygame.transform.scale(gridImg, (30, 30))


player1img = pygame.image.load("./img/player1.png")
player1img = pygame.transform.scale(player1img, (30, 30))




middle = (int(width / 2), int(height / 2))

#Farben

blue = (0, 30, 255)

#PlayerColors
red = (255, 0, 0)
green = (0, 255, 0)
yellow = (255, 242, 0)
white = (255, 255, 255)


black = (0, 0, 0)


lives = 10

clock = pygame.time.Clock()



iron = 0
gold = 0
diamond = 0
smaragd = 0

pPos = 0




def drawP1(position, size, color):
     #pygame.draw.circle(screen, (color), position, size)
     pass

     

     

def exit():
     pygame.quit()
     sys.exit()









###########-
#Arbeitsplatz##
###########-





while True:

     for event in pygame.event.get():
          if event.type == pygame.QUIT:
               exit()

          elif event.type == pygame.KEYDOWN:
               if event.key == pygame.K_ESCAPE:
                    exit()


     
     
     screen.blit(player1img, (middle))
     

     #Grid erzeugen
     for k in range(0, 25):
     
          for i in range(0, 25):
               gridPos = (int(GridX), int(GridY))
               
               screen.blit(gridImg, gridPos)
               GridX += 30
          GridY += 30
     
     
               
               
               
               
               

     
   
     pygame.display.update()
     
     
     screen.fill(blue)
     
     
     temp += 1
     
     
#Gemalt werden
#Angezeigt werden
#Gelöscht werden

Ich hoffe ihr könnt mir weiterhelfen. Ich benutzte Python 3.7.0 und bekomme keinen Fehlercode :D!

mfg
-cool_brick24
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du setzt GridX und GridY ja auch nie zurueck. Nach einem Durchlauf zeigt das also irgendwo auf den Mond. Statt da so umstaendlich mit += zu arbeiten, rechne doch einfach die Koordinaten aus: i*30 und j*30. Das die Namen ziemlich schlecht sind, und die per Salzstreuer gesetzten int(...) unnoetig sei mal nur am Rande bemerkt.
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Danke __deets__ (Wird dein Name mit einem "_" geschrieben oder mit 2?), doch ich will mein Grid ja als 2 Dimensionales Array haben. Doch ich verstehe nicht ganz, wie das funktioniert. Ich hatte mir mal etwas angeschaut mit:

Code: Alles auswählen



Array = []

for i in range (0, 25):
Array.append(i)



mfg
-cool_brick24
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

2 __ wie bei Python so üblich.

Und ich verstehe deine Frage nicht. Deine beiden for-schleifen tun ja prinzipiell das richtige. Aber mathematisch ist es doch egal, ob du

30 + 30 + 30

rechnest, oder gleich

30 * 3

Somit kannst du die Koordinaten aus den laufvariablen bestimmen.

Und in einem richtigen Spiel hat man natürlich Spielobjekte in Listen, klar. Oder gleich Quad-trees.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cool_brick24: Du solltest den Begriff Array nicht für Listen verwenden. Es gibt in Python auch Arrays, damit sind in der Regel aber Numpy-Arrays gemeint. Was Du da hast ist eine Liste. Und irgendwie scheinst Du alle Hinweise zu ignorieren und kommst wieder mit dem selben Code an der sich nicht an die Python-Namenskonventionen hält und globale Variablen verwendet.

Wenn Du eine zweidimensionale Datenstruktur mit Listen aufbauen möchtest, dann reicht es nicht *eine* Liste zu verwenden. Du musst eine Liste verwenden mit Listen als Elementen, welche die Reihen repräsentieren.

Zu __deets__ Namen: Den kannst Du doch einfach kopieren und in einen Texteditor oder eine Python-Shell einfügen und untersuchen. Oder beim markieren mit der Maus schon mitzählen wie viele '_'-Zeichen da sind.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Okay! Danke für den Hinweis! Also hier ist nochmals meine Frage nur anders: Ich will das mein Player blöcke in das Grid bauen/setzen kann. Doch dazu brauche ich ja etwas bestimmtes, dessen Namen ich nicht kenne. Es sieht so aus:

Code: Alles auswählen

MeinGrid[1][1] = SteinBlock
Ich will nämlich die eckigen Klammern einbauen und damit eine Position bekommen. bsp. : Das Grid Feld oben Links ist in der For Schleife das erste Element. Also 1, 1. Nun will ich darauf zugreifen und die Textur verändern. Nur ich habe leider keine Ahnung wie das funktioniert. Und zu __Blackjack__ : Welche Hinweise Ignoriere ich? Tut mir leid, dass ich kein Voll Profi bin, deswegen lerne ich ja im Moment auch noch.


mfg
-cool_brick24
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zuerstmal: in Python zaehlt man ab 0. In den meisten Sprachen ist das so. Und damit ist dein oberes linkes Feld (0, 0). Und dazu kannst du problemlos eine Liste von Listen verwenden:

Code: Alles auswählen

tiles = [
    [Tile(x, y) for y in range(vertical_number_of_tiles)]
    for x in range(horizontal_number_of_tiles)
]
Damit ist auf tiles der Zugriff mit zwei Indizes moeglich. Ueblicherweise baut man so eine Datenstruktur natuerlch zB auf Basis einer Level-Datei auf, du willst ja kontrollieren, was da jeweils fuer ein Feld hinter steckt.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cool_brick24: Ich hatte in einem anderem Thema von Dir schon mal was zu fast dem gleichen Quelltext geschrieben, zum Beispiel über die Namensschreibweise und das das alles globale Variablen sind. Das man ``sys.exit()`` nicht verwenden sollte wenn man da nicht tatsächlich etwas zum Aufrufer des Programms kommunizieren will, das literale Zeichenketten keine Kommentare sind…
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Okay... Ich werde mich bessern und Verbessere mein Code. Vielen dank an euch beiden für die Tipps! Die werde ich gut gebrauchen, und ich sollte nochmal bestimmte Grundlagen wiederholen.

mfg
-cool_brick24
Antworten