2 Probleme - falsche Bewegung u. keine Anzeigeaktualisierung

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Servus,

ich bastel immer noch an nem Prototypen eines kleinen Lernspiels, bei dem sich Figuren über eine Karte bewegen und dort Fragen suchen, herum.
Im Moment hab ich zwei Probleme, auf deren Lösung ich nicht komme.
Zum einen, wenn ich eine Spielfigur bewegen will, klick ich mit der Maus irgendwohin und lass das figur sich dort hin bewegen. Soweit so gut, oft funktionierts ohne Probleme, oft fährt die Figur aber auch einfach über die geklickte Position hinaus oder bleibt schon vorher stehen.

Code: Alles auswählen

if event.type == MOUSEBUTTONUP:
                if event.button == 1:
                    playerPhysimon.mouseClicked(event.pos[0], event.pos[1])

Code: Alles auswählen

    def mouseClicked (self, x, y):
        a = x - self.artifactRect.left;
        b = y - self.artifactRect.top;
        theta = math.atan2(a, b);
        self.moveX = self.moveSpeed * math.sin(theta);
        self.moveY = self.moveSpeed * math.cos(theta);
        self.newX = x
        self.newY = y

Code: Alles auswählen

def move(player):
    playerRect = playerPhysimon.getArtifactRect()
    if(playerRect.centery!=playerPhysimon.getNewY() and playerRect.centerx!=playerPhysimon.getNewX()):
        playerRect.centery += playerPhysimon.getMoveY()
        playerRect.centerx += playerPhysimon.getMoveX()
        if (playerRect.left < 0):
            # the previous submap is loaded
            returnToSubmap()
            playerPhysimon.setMoveX(math.fabs(playerPhysimon.getMoveX()))
        if (playerRect.left + playerRect.width > SUBMAPWIDTH):
            # enter next submap, will check if player is allowed to
            enterNewSubMap()
        if (playerRect.top < 0):
            playerRect.top = 0
            playerPhysimon.setMoveY(math.fabs(playerPhysimon.getMoveY()))
        if (playerRect.top + playerRect.height > SUBMAPHEIGHT):
            playerRect.top = SUBMAPHEIGHT - playerRect.height
            playerPhysimon.setMoveY(-1.0 * math.fabs(playerPhysimon.getMoveY()))
Und zum anderen, wollt ich, wenn der Spieler eine Frage auswählt, den Bildschirm, auf dem zu diesen Zeitpunkt die Karte angezeigt wird, einfach in einer neuen Farbe füllen und dann den Text hinzeichnen lassen, so lang bis eine Antwort ausgewählt wurde. Alle was bis jetz passiert, ist, dass er in die Warte-Schleife reingeht und nix mehr gemacht werden kann. Die Bildschirmanzeige ändert sich nicht.

Code: Alles auswählen

    def printMap(self, allPhysimons, playerPhysimon, questionList1, questionList2, bouncer):
        ''
        self.windowSurface.fill(self.backgroundColor)
        imageString = playerPhysimon.getName()
        imageString += '_klein.png'
        try:
            playerImage = pygame.image.load(imageString)
        except pygame.error:
            playerImage = pygame.image.load('UserCar.png')
        playerImage = pygame.transform.scale(playerImage, (playerPhysimon.getArtifactRect().width,playerPhysimon.getArtifactRect().height))
        self.windowSurface.blit(playerImage, playerPhysimon.getArtifactRect())
        for physimon in allPhysimons:
            imageString = physimon.getName()
            imageString += '_klein.png'
            try:
                opponentImage = pygame.image.load(imageString)
            except pygame.error:
                opponentImage = pygame.image.load('UserCar.png')
            self.windowSurface.blit(opponentImage, physimon.getArtifactRect())
        if len(questionList1) != 0:
            self.questionImage = pygame.transform.scale(self.questionImage, (questionList1[0].getArtifactRect().width, questionList1[0].getArtifactRect().height))
            self.windowSurface.blit(self.questionImage, questionList1[0].getArtifactRect())
        else:
            self.windowSurface.blit(self.noQuestionImage, (100,200))
        if len(questionList2) != 0:
            self.questionImage = pygame.transform.scale(self.questionImage, (questionList2[0].getArtifactRect().width, questionList2[0].getArtifactRect().height))
            self.windowSurface.blit(self.questionImage, questionList2[0].getArtifactRect())
        else:
            self.windowSurface.blit(self.noQuestionImage, (300,400))
        
        if (playerPhysimon.getOpenSubmaps <= self.id):    
            self.windowSurface.blit(self.questionImage, bouncer.getArtifactRect())
        
        pygame.display.update()

    def showQuestion(self, question):
        
        self.windowSurface.fill((253, 245 , 230))
        
        self.thisQuestion = self.font.render(str(question.getProblemStatement), 1, (0,0,0))
        self.right = self.font.render(str(question.getRightAnswerText), 1, (0,0,0))
        self.wrong = self.font.render(str(question.getWrongAnswerTextA), 1, (0,0,0))
        self.wrong2 = self.font.render(str(question.getWrongAnswerTextB), 1, (0,0,0))
        
        self.questionRect = self.thisQuestion.get_rect()
        self.rightRect = self.right.get_rect()
        self.wrongRect = self.wrong.get_rect()
        self.wrongRect2 = self.wrong2.get_rect()
        
        self.questionRect.topleft = (10, 10)
        #random setting of answer positions
        self.rightRect.topleft = (110, 10)
        self.wrongRect.topleft = (140, 10)
        self.wrongRect2.topleft = (170, 10)
        
        self.windowSurface.blit(self.thisQuestion, self.questionRect)
        self.windowSurface.blit(self.right, self.rightRect)
        self.windowSurface.blit(self.wrong, self.wrongRect)
        self.windowSurface.blit(self.wrong2, self.wrongRect2)  
Vermutlich sind das mal wieder irgendwelche Blödsinnsfehler. Aber ich seh da grad den Wald vor lauter Bäumen nicht...

Vielen Dank also schonmal für eure Mühen.
grüße greven
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Bei deinem Problem mit dem Mausklick würde ich vermuten das liegt an deiner Geschwindigkeit, da du diese anhand der Entfernung zur Figur berechnest.

So kommt durch das regelmäßige Neuzeichnen und auch das dadurch erneute Überprüfen deiner Position, deine unterschiedlichen Positionen zustande.

Sagen wir mal deine Figur soll sich 10 Felder vorbewegen hat aber ein tempo von 3
Felder pro Aktualisierung so, stoppt diese erst bei zwölf bzw bei neun, je nach dem wie du prüfst.
Anders bei 2 Felder pro Aktualisierung triffst du genau die 10.

Edit: Bei zweiten Teil kann ich dir leider nicht helfen, zudem sieht er ziemlich unübersichtlich aus - du weißt aber, das in Python die Namenskonvention Großbuchstaben etwas anders ist als in C ?

Ach machst du eigentlich auch ein update bei der Frage, der Bilschirm muss auch wenn auf die Eingabe gewartet werden soll akualisiert werden.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

War mir ja eigentlich klar, dass es so n Mist is... :-/

Merci!!! :)

Ach ja, das mit den Namenskonventionen hab ich gelesen, nur leider viel zu spät. :( Jetz hab ich das alles in alter C-Manier gemacht.
Naja, werd ich demnächst alles mal ändern...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also in C nutzt man auch nicht solche Konventionen, was teils auch daran liegt dass C so Konzepte wie Attribute von Klassen unbekannt sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Aso, ok. Bin einfach davon ausgegangen, dass in C die gleichen Konventionen wie in Objective-C (iPhone-Programmierung) gelten. Und da hatten wir das so gelernt, wenn ich das richtig im Kopf hab. ^^

Is ja auch ned so wichtig. Ich werd das alles eh noch anpassen. :)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@Leonidas
War auch nur allgemein gesprochen - in C# ist es zB. so
Aber das war ja auch nich der Punkt in welchen Sprachen es so aussieht, sondern das es in Python nicht so gemacht werden sollte.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten