Pygame Object startposition.

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Ethnic
User
Beiträge: 5
Registriert: Freitag 18. März 2011, 12:54

Hi ich bin neu in Python und wollte ein Spiel mit "pygame" schreiben.
Bis jetzt hab ich auch alles herrausgefunden aber jetzt wie sich nicht wasy ich tuhen soll.

Ich lade zwei Bilder, die starten dann beide in der gleichen Ecke. Aber das Ziel des Spieles soll es sein Das dass erste Bild(Pfeile) das zweite Bild(Ball) beührt, deswegen müssen beide Bilder eine andere startposition haben was ich aber nicht hin kriege -.-

Hier ist mal der code:

Code: Alles auswählen

import sys, pygame
pygame.init()

size = width, height = 1024, 768
black = 0, 0, 0
yellow = 255, 255 ,0
color = black
geschwindigkeit = 0
geschwindigkeit2 = 0
bewegung = [100, 100]
bewegung2 = [50, 50]

title = "Ball Spiel"

screen = pygame.display.set_mode(size)
pygame.display.set_caption(title)

ball = pygame.image.load("Arrow.png")
ball2 = pygame.image.load("ball.gif")
ballrect = ball.get_rect()
ballrect2 = ball2.get_rect()
clock = pygame.time.Clock()


schleife = True
while schleife:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            i = i + 1
            print "event.pos:", event.pos
            if (event.pos[0] > ballrect.left and event.pos[0] < ballrect.right and event.pos[1] > ballrect.top and event.pos[1] < ballrect.bottom):
                print "Ball geklickt"
                print "Du hast es in", i, "versuchen geschafft!"
                schleife = False
        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                ball = pygame.image.load("ball4.png")
            if event.key == pygame.K_2:
                ball = pygame.image.load("ball5.png")
            if event.key == pygame.K_3:
                ball = pygame.image.load("ball3.png")
            if event.key == pygame.K_4:
                ball = pygame.image.load("ball6.png")
            if event.key == pygame.K_PLUS:
                geschwindigkeit = geschwindigkeit + 1
                bewegung[0] = bewegung[0] + geschwindigkeit
                bewegung[1] = bewegung[1] + geschwindigkeit
            if event.key == pygame.K_MINUS:
                geschwindigkeit = geschwindigkeit - 1
                bewegung[0] = bewegung[0] - geschwindigkeit
                bewegung[1] = bewegung[1] - geschwindigkeit
            if event.key == pygame.K_SPACE:
                bewegung = [0, 0]
            if event.key == pygame.K_UP:
                bewegung[1] = bewegung[1] - 1
                bewegung[0] = 0
            if event.key == pygame.K_DOWN:
                bewegung[1] = bewegung[1] + 1 
                bewegung[0] = 0
            if event.key == pygame.K_LEFT:
                bewegung[0] = bewegung[0] - 1 
                bewegung[1] = 0
            if event.key == pygame.K_RIGHT:
                bewegung[0] = bewegung[0] + 1
                bewegung[1] = 0
    

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_5:
                ball2 = pygame.image.load("ball4.png")
            if event.key == pygame.K_6:
                ball2 = pygame.image.load("ball5.png")
            if event.key == pygame.K_7:
                ball2 = pygame.image.load("ball3.png")
            if event.key == pygame.K_8:
                ball2 = pygame.image.load("ball6.png")
            if event.key == pygame.K_PLUS:
                geschwindigkeit2 = geschwindigkeit2 + 1
                bewegung2[0] = bewegung2[0] + geschwindigkeit2
                bewegung2[1] = bewegung2[1] + geschwindigkeit2
            if event.key == pygame.K_MINUS:
                geschwindigkeit2 = geschwindigkeit2 - 1
                bewegung2[0] = bewegung2[0] - geschwindigkeit2
                bewegung2[1] = bewegung2[1] - geschwindigkeit2
            if event.key == pygame.K_SPACE:
                bewegung2 = [0, 0]
            if event.key == pygame.K_w:
                bewegung2[1] = bewegung2[1] - 1
                bewegung2[0] = 0
            if event.key == pygame.K_s:
                bewegung2[1] = bewegung2[1] + 1 
                bewegung2[0] = 0
            if event.key == pygame.K_a:
                bewegung2[0] = bewegung2[0] - 1 
                bewegung2[1] = 0
            if event.key == pygame.K_d:
                bewegung2[0] = bewegung2[0] + 1
                bewegung2[1] = 0

          
    ballrect = ballrect.move(bewegung)
    if ballrect.left < 0 or ballrect.right > width:
        bewegung[0] = -bewegung[0]
        
    if ballrect.top < 0 or ballrect.bottom > height:
        bewegung[1] = -bewegung[1]

    if ballrect.top == ballrect2.bottom or ballrect.top == ballrect2.left or ballrect.top == ballrect2.right or ballrect.top == ballrect2.top:
        
        schleife = False
        print "Test"
            
    ballrect2 = ballrect2.move(bewegung2)
    if ballrect2.left < 0 or ballrect2.right > width:
        bewegung2[0] = -bewegung2[0]
        

    if ballrect2.top < 0 or ballrect2.bottom > height:
        bewegung2[1] = -bewegung2[1]
        
        
    screen.fill(color)
    screen.blit(ball, ballrect)
    screen.blit(ball2, ballrect2)
    pygame.display.flip()
Ich bin führ jede hilfe dankbar.
deets

Hilfe du brauchst viel, junger Padawan

Zuerstmal solltest du deine Kollisionsabfrage mit den dafuer vorgesehenen Methoden machen:

http://www.pygame.org/docs/ref/rect.html

Denn deine Art bekommt ein problem, wenn sich mal etwas schneller als einen Pixel pro Frame bewegt - denn dann kommen zwei Rechtecke vielleicht niemals Kante auf Kante.

Zweitens solltest du die Bilder *einmal* laden, und dann immer wieder verwenden, statt sie jedesmal neu zu laden. Am besten schmeisst du sie in ein Dictionary, und holst dann das raus, was du je nach Tastendruck benutzen willst.


Drittens sind deine Variablen sehr verwirrend benannt - ball und ball2, aber das eine ist ein Arrow? Wer soll da durchblicken?

Und zum eigentlichen Problem: Du haelst deine Koordinaten ja in der rects vor (ballrect). Die holst du dir einfach indem du das Bild laedst, und dann das bild-eigene rect nimmst.

So weit, so gut. Aber das hat natuerlich immer die Koordinate (0, 0).

Wen du das aendern willst, dann musst du also eines der beiden (oder gar beide) erstmal bewegen, so, wie du das ja auch schon sonst tust:

Code: Alles auswählen

import random()
x = int(random.random() * screen_width - image_width)
y = int(random.random() * screen_height - image_height)
ballrect.move((x, y))
So grob jedenfalls.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du "blittest" doch bereits die beiden Figuren auf den Screen. Dort gibst Du doch auch unterschiedliche Zielkoordinaten an. Insofern kapiere ich die Frage nicht wirklich - zumal: Wie kannst Du solche Unmengen an Code zusammenschreiben, der augenscheinlich nicht funktioniert. Denn diese Startposition scheint doch für Dein Spiel essenziell zu sein :K

Generell solltest Du bei so langem Code diesen hier nicht direkt posten, sondern ihn in ein Paste-Bin auslagern, wie das hier im Board oder paste.pocoo.org.

Die Logik in den if-Kaskaden ist übrigens teilweise holprig. Wieso wird das

Code: Alles auswählen

if event.type == pygame.KEYDOWN:
zweimal abgefragt?

Generell impliziert der Name ball2, dass Du da eine Liste verwenden willst. Das erste Objekt in der Liste ist dann eben die eine Spielfigur, das zweite die zweite und ggf. eben so weiter.

Du lädst augenscheinlich in der Schleife - je nach Tastendruck - mehrfach dieselben Bilder. Das solltest Du vermeiden und Dir diese Objekte am Anfang einmal aus den Bilddateien laden und dann in einer Datenstruktur wie einer Liste o.ä. merken.

Die deutschen Bezeichner wirken auch etwas unhandlich ;-)

Ich würde bei so einem Spiel wohl auch auf Sprites zurückgreifen. Zudem würde ich mir wohl eine Klasse für eine Spielfigur erstellen, die die Grafik, die aktuelle Position sowie die Bewegung als Attribute besitzt. Dazu muss man natürlich mit OOP vertraut sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ethnic
User
Beiträge: 5
Registriert: Freitag 18. März 2011, 12:54

Ok danke erstmal für die schnnellen Antworten ich werde alles nochmal überarbeiten und mir es nochmal genau angucken.

PS.Ich arbeite mit Python erst 5 Tage und kannte davor auch noch keine andere Programmiersprache.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ethnic hat geschrieben: PS.Ich arbeite mit Python erst 5 Tage und kannte davor auch noch keine andere Programmiersprache.
Ganz ehrlich: Dann würde ich Dir von pygame momentan abraten! Lerne erst mal die Grundlagen, dann kommst Du später damit viel leichter klar.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ethnic
User
Beiträge: 5
Registriert: Freitag 18. März 2011, 12:54

Jo mach ich auch, ich wollte mir pygame nur mal angucken. ;D
deets

Hyperion hat geschrieben:
Ethnic hat geschrieben: PS.Ich arbeite mit Python erst 5 Tage und kannte davor auch noch keine andere Programmiersprache.
Ganz ehrlich: Dann würde ich Dir von pygame momentan abraten! Lerne erst mal die Grundlagen, dann kommst Du später damit viel leichter klar.
Warum? Weil er was kaputt machen koennte? Programmieren lernt man nur, wenn man sich an Themen abarbeitet, die einen begeistern. Womit habe ich damals (zuzugebenermassen lange erfolglos...) Assembler auf dem 68K auf ST und AMIGA gelernt? Demo-Programmieren. Eine Laufschrift oder nen Sternenscroller zu coden war das, was mich tagelang vor die Maschine gefesselt hat.

Trockene Vererbungsuebungen sind IMHO sinnlos.
BlackJack

@deets: Programmierung ist seit dem deutlich komplexer und abstrakter geworden. Und die Quelltexte von damals waren auch alle grauenvoll. Sind jedenfalls meine Anfänge in BASIC und Assembler gewesen.
deets

@BlackJack:

Oh, ganz bestimmt waren die Anfaenge grauenvoll. Wie jeder Anfang.

Ich finde aber nicht, dass die Dinge per se komplexer geworden sind. Abstrakter - ja. Aber genau diese Abstraktion erlaubt es dir doch heute, zB mit pygame in 0,nix ein Fenster heraufzubeschwoeren und darin rumzumalen. Und wenn du einen Fehler gemacht hast, dann gibt's nen sauberer Stacktrace im Terminal. Statt einer Guru-Meditation und einem leise blinkenden Floppy-LED.

Nateurlich ist heute mehr moeglich, und darum wird's dann komplexer - 3D, Netzwerkkommunikation, waren alles keine Themen damals. Bzw. fingen so gerade an (hach, mein erster texturierter Cube auf dem A1200... seufz)

Aber damit muss man ja nicht anfangen.
BlackJack

@deets: Ich denke durch die Abstraktionen ist es schon auch komplexer geworden. Um Pygame verwenden zu können, muss man OOP zumindest irgendwie "intuitiv" erfassen. Bei Assembler oder BASIC damals waren die Bausteine viel einfacher. Man brauchte mehr davon um etwas vorzeigbares zusammen zu basteln, aber die einzelnen Minischritte, die man sich da erarbeitet hat, waren IMHO einfacher zu verstehen.
deets

@blackjack

Ich wuerde schon sagen, dass Python heute immer einfacher ist als BASIC, Assembler & Co damals. Und das zieht noch nicht mal in Betracht, was man heutzutage mit dem Internet an Resourcen zur Problemloesung hat.

Aber wir beide haben wohl schon ein paar Jahresringe zuviel, um wirklich beurteilen zu koennen, wie man heute programmieren lernt.

Doch unabhaengig davon hat der OP ja den Wunsch, hier & heute python zu lernen. Und da finde ich ist ein Pygame-Projekt ebenso geeignet wie alles andere. Ich bin mir sicher (fuer mich selbst kann ich das 100%ig sagen, und kenne andere), dass auch damals die meisten ersten Programmierschritte nicht das abarbeiten von oeden Dingen wie Sortieren und Datenstrukturen waren. Das habe ich in der Schule machen "muessen".

Sondern sich bevorzugt mit Grafik und Musik beschaeftigt haben. Weil das einfach toll ist. Und insofern bleibe ich dabei: OOP zu lernen kann man genausogut an einem pygame-projekt. Ich denke wir beide koennte recht schnell + mit wenigen Zeilen obiges Programm "konvertieren", und eben diese Basics vermitteln.
Pacman
User
Beiträge: 3
Registriert: Donnerstag 7. April 2011, 19:07

Nun ja..
Apropos Anfangen mit Python:Ich habe auch erst mit Text bzw. GUI-basierenden ,ziemlich simplen Programmen
angefangen:Relativ empfehlenswert erscheint mir das Buch "Hello World",was zwar ein paar Übersetzungsfehler
aufweist,aber durchaus die Grundlagen lehrt und SCHRITTWEISE an die Grafikprogrammierung und kompliziertereGUIs
(mit PythonCard) ranführt. :arrow:
Antworten