Fliesenbasiertes Spiel mit pygame Fragen / Problemen

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen. Ich versuche, eine sehr grundlegende Fliesen Spiel-System mit Pygame zu schaffen. Ich bin nicht das Beste am Pygame, also kann ich etwas ganz offensichtlich fehlen. Bisher habe ich alles in einer Datei. Was ich jetzt habe, scheint wirklich schlampig zu sein und es gibt wohl eine effizientere Art, es zu tun, aber im Moment verwende ich nur 2d Arrays mit einer Nummer, die einer bestimmten Fliesenart entspricht (Gras, Wasser usw.). Dafür benutze ich numpy, denn das ist es, was mir jemand empfohlen hat. Obwohl ich nicht weiß, ob ich diese Methode mag, denn was wäre, wenn ich in der Zukunft etwas Fliesen hatte, das nicht einfach grafisch war und genauere Attribute dazu hatte? Wie eine Schatztruhe zum Beispiel oder eine Falle? Wie würdest du das strukturieren?

Aber trotzdem ist mein Problem jetzt, dass der Bildschirm einfach schwarz ist und nicht die Grasfliesen zeichnet.

Hier ist der Code:

import numpy import pygame import sys from pygame.locals import * pygame.init() fpsClock = pygame.time.Clock() windowWi = 800 windowHi = 608 mapWi = 50 # *16 = 800, etc mapHi = 38 # ----- all of the images ------------------------------ grass1 = pygame.image.load('pictures\(Grass\grass1.png') #------------------------------------------------------- screen = pygame.display.set_mode((windowWi, windowHi)) pygame.display.set_caption("Tile Testing!") gameRunning = True groundArray = numpy.ones((mapWi,mapHi)) def drawMapArray(maparray): for x in range(mapWi,1): for y in range(mapHi,1): #Determines tile type. if maparray[y,x] == 1: screen.blit(grass1, (x*16, y*16)) else: print "Nothing is here!" while gameRunning: drawMapArray(groundArray) for event in pygame.event.get(): if event.type == "QUIT": pygame.quit() sys.exit() #Updates display and then sets FPS to 30 FPS. pygame.display.update() fpsClock.tick(30) 

Fühlen Sie sich bitte frei, mich in einer besseren strukturellen Richtung zu steuern, da ich sehr neu zum Spielentwurf bin und ein Rückgespräch wünschen!

Danke, Ryan

EDIT: Ich habe das versucht, was sinnvoll ist, aber ich bekomme einen Index außerhalb des Reichweitenfehlers.

 def drawMapArray(maparray): for x in range(0,mapWi,1): for y in range(0,mapHi,1): #Determines tile type. if maparray[y,x] == 1: screen.blit(grass1, (x*16, y*16)) else: print "Nothing is here!" 

  • Wie pygame Schriftart zu installieren
  • In Pygame, normalisieren Spielgeschwindigkeit über verschiedene fps Werte
  • Musikprobleme bei der Verwendung von Pygame + Multiprocessing
  • Powerups kollidieren nicht mit dem Spieler (Pygame)
  • Pygame-Fehler: Mischer-System nicht initialisiert
  • Pygame auf OSX Yosemite: unerkanntes Musikformat
  • 2 Solutions collect form web for “Fliesenbasiertes Spiel mit pygame Fragen / Problemen”

    Eine Lösung, die besser skalieren kann, wenn Sie mehr Kacheltypen hinzufügen, verwendet ein Wörterbuch, um von den Zahlen in Ihrem Array zu den Bildern zu gelangen, zB:

     tile_dict = {1 : pygame.image.load('pictures\(Grass\grass1.png'), 2 : pygame.image.load('pictures\rock.png') } 

    Und dann einfach den entsprechenden Eintrag aus dem Wörterbuch in deiner Zeichnungsfunktion

     def drawMapArray(maparray): for x in range(0, mapWi): for y in range(0, mapHi): #Determines tile type. current_tile = tile_dict[maparray[x, y]] screen.blit(current_tile, (x*16, y*16)) 

    Ihre Draw-Methode ist falsch.

     def drawMapArray(maparray): for x in range(mapWi,1): for y in range(mapHi,1): #Determines tile type. if maparray[y,x] == 1: screen.blit(grass1, (x*16, y*16)) 

    Der erste Fehler ist for x in range(mapWi,1) .

    Schauen Sie sich die range . Sie verwenden zwei Parameter, so dass Sie Schleife von mapWi zu 1 , was nicht ist, was Sie wollen.

    Du willst von 0 nach mapWi , also musst du benutzen

     for x in range(mapWi): for y in range(mapHi): 

    (Mit xrange wäre noch besser, aber das wäre nur eine sehr geringe verbesserung)

    Ansonsten wird nichts auf dem Bildschirm gezeichnet.


    Der zweite Fehler ist diese Zeile:

     if maparray[y,x] == 1: 

    Sie erhalten einen IndexError weil Sie die Initialisierung des Arrays IndexError . Es ist eigentlich mapWi hoch und mapHi breit . Also, du solltest es miteinlegen

     groundArray = numpy.ones((mapHi,mapWi)) 

    Anstatt von

     groundArray = numpy.ones((mapWi,mapHi)) 

    Um es zu illustrieren, nur ein wenig Test:

     >>> numpy.ones((10,5)) array([[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]]) >>> 

    Sie werden sehen, dass mit (10, 5) gibt uns eine Reihe von height = 10 und width = 5 .


    Sidenotes:

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

    Wird nichts tun event.type ist nie ein String "QUIT" . Die Art des Quit-Ereignisses ist 12 oder besser: pygame.QUIT ; So sollte es lesen:

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

    Schreibe dein mainloop so ein:

     while gameRunning: drawMapArray(groundArray) for event in pygame.event.get(): if event.type == pygame.QUIT: gameRunning = False break #Updates display and then sets FPS to 30 FPS. pygame.display.update() fpsClock.tick(30) pygame.quit() 

    Um zu vermeiden, dass sys.exit .

    Besser: Split deine Hauptschleife in die drei Schritte, die du normalerweise in einem mainloop machst.

     while gameRunning: draw() # do all the drawing stuff in this function handle_input() # handle all input stuff in this function update() # update the game state in this function 
    Python ist die beste Programmiersprache der Welt.