Objekt wird in 2 gespalten (PyGame)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Sonntag 16. Dezember 2007, 18:40

Hallo liebe Community,

ich poste erst den Code, dann folgt eine ausführliche Problembeschrteibung:

Code: Alles auswählen

import pygame, os, sys
from pygame.locals import*
pygame.init()landschaft = pygame.image.load('Soil01.bmp')
hintergrund = pygame.transform.scale(landschaft, (900, 700))
karte = hintergrund.get_rect()
spieler = pygame.image.load('Hopsy.bmp')
player = spieler.get_rect()
black = 0, 0, 0
size = width, height = 900,700
screen = pygame.display.set_mode(size)
screen.fill(black)
gegner1 = pygame.image.load('Kunst.jpg')
gegner1_rect = gegner1.get_rect()
move_up = False
move_down = False
move_right = False
move_left = False
stehen = True
munition = 5
screen.blit(gegner1, (350, 450))
while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
            if event.key == K_w:
                move_down = False
                move_right = False
                move_left = False
                move_up = True
                stehen = False
            if event.key == K_s:
                move_up = False
                move_right = False
                move_left = False
                move_down = True
                stehen = False
            if event.key == K_a:
                move_down = False
                move_up = False
                move_right = False
                move_left = True
                stehen = False
            if event.key == K_d:
                move_down = False
                move_up = False
                move_left =False
                move_right = True
                stehen = False
            if event.key == K_SPACE:
                move_up = False
                move_down = False
                move_right = False
                move_left = False
                stehen = True
            if event.key == K_f:
                if stehen == True:
                    munition = 5
            
    if move_up:
        player = player.move(0, -1)
        gegner1_rect = gegner1_rect.move(0, 1)
    if move_down:
        player = player.move(0, 1)
        gegner1_rect = gegner1_rect.move(0, -1)
    if move_right:
        player = player.move(1, 0)
        gegner1_rect = gegner1_rect.move(-1, 0)
    if move_left:
        player = player.move(-1, 0)
        gegner1_rect = gegner1_rect.move(1, 0)
    
 
    
    if event.type == MOUSEBUTTONDOWN:
        isplaying = pygame.mixer.music.get_busy()
        if isplaying == False:
            if stehen == True:
                if munition > 0:
                    pygame.mixer.music.load('shot1.wav')
                    pygame.mixer.music.play()
                    munition = munition - 1

    
    screen.blit(spieler, player)
    screen.blit(gegner1, gegner1_rect)
    pygame.display.flip()  
Also, es öffnet sich ein fenster, und der Spieler wie auch der Gegner stehen in der linken oberen Ecke. Das ist der erste Fehler, da der Gegner eigentlich in der Mitte stehen müsste. Inzwischen fand ich heraus, dass das daran liegt, dass der Hintergrund den gegner überdeckt. Nimmt man aber das blitten des Hintergrundes aus der endlosschleife heraus, so radieren die Spielfiguren ihn beim Bewegen weg. Und warum wird der Gegner an zwei verschiedenen Stellen auf einmal angezeigt? Das komische ist, dass sich nur das Bild von ihm das am Anfang in der Ecke steht, bewegen lässt.
BlackJack

Sonntag 16. Dezember 2007, 19:59

In Zeile 20 "blittest" Du den `gegner` in die Mitte. Innerhalb der Schleife wird `gegner_rec` zum platzieren benutzt. Das ist nicht in der Mitte. Warum sollte es auch!?
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Montag 17. Dezember 2007, 16:53

Hm, das stimmt, aber ich muss doch das gegner1_rect mitblitten und kann beim .blit() in der Endlosschleife keine leeren Positionsangaben machen. Wenn ich das tue gibts nen error. Und man braucht mindestens 2 argumente.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Dienstag 18. Dezember 2007, 16:15

Hallo,

.blit benutzt nicht das vorherige Rechteck als Ausgangspunkt, sondern immer den Nullpunkt. In Zeile 20 blittest du, wie BlackJack schon sagte, 'einfach so' in die Mitte:

Code: Alles auswählen

screen.blit(gegner1, (350, 450))
Die Position von 'gegner1_rect' ist aber noch oben links. Du müsstest also eher gegner1_rect setzen.

Code: Alles auswählen

gegner1_rect.topleft = (350, 450)
screen.blit(gegner1, gegner1_rect)
Der Grund dafür, dass er zweimal angezeigt wird und 'wegradiert' werden kann: Du hast vergessen, beim Anfang jedes Schleifendurchlaufes den Hintergrund zu säubern:

Code: Alles auswählen

screen.fill([0,0,0,0])
Ich würde dir wirklich empfehlen: Arbeite piman's sprite tutorial durch. Danach wird dir vieles klarer sein ;)

Der Code oben ist jetzt nicht getestet, aber ich hoffe mal, ich habe dir keinen Mist erzählt :?

Gruß Fred
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Dienstag 18. Dezember 2007, 19:14

Hui, es funktioniert :D
Danke Fred!
Und Piman`s Sprite Tutorial ist definitiv ein Fall für die baldigen weihnachtsferien.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Donnerstag 20. Dezember 2007, 18:38

Ich hätte da jetzt doch noch eine Frage. Wie kann ich nur den topleft.x oder .y Wert erhalten? Auf der PyGame-Homepage steht dazu leider nichts.

Edit: Sorry, jetzt hab ichs.
Antworten