Soundausgabe mit Mixer -- verzögerung

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

Hey,
ich programmiere gerade ein 2d-egoshooter Spiel, klappt auch alles super, nur habe ich jetzt sounds eingefügt, dass die Waffen auch töne von sich geben ;P
Das habe ich mit dem pygame modul pygame.mixer gemacht.. ( nach diesem Schema )

Code: Alles auswählen

pygame.mixer.init()
a = pygame.mixer.Sound("Sounds/schuss.wav")
a.play()
Mein problem ist, dass der Sound erst etwa 2-3 Sekunden nachdem der schuss fällt abgespielt wird. Es ist also immer eine sehr große verzögerung da. Kann man da irgend etwas ändern oder kennt ihr ein anderes modul was dafür besser geeignet wäre ?..
Schonmal vielen Dank.

Gruß Teabag
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Versuche mal, etwas mit der Buffergroesse bei

mixer.pre_init

herumzuexperimentieren. Jedenfalls konnte ich damit die Verzoegerungszeit etwas beeinflussen:

Code: Alles auswählen

#!/usr/bin/env python

####

import pygame as pyg

####

class Display(object):
          

  def __init__(self, width, height, sound_name):

    pyg.mixer.pre_init(44100, -16, 2, 768)
    pyg.init()
    self.screen = pyg.display.set_mode((width, height), pyg.DOUBLEBUF)
    self.font = pyg.font.Font(None, 500)
    self.clock = pyg.time.Clock()
    self.sound = pyg.mixer.Sound(sound_name)
    self.act_key = ''

  
  def dispatch_events(self):

    event = pyg.event.poll()
    if event == pyg.NOEVENT:
      return None
    
    if event.type == pyg.QUIT:
      return 'q'          
    if event.type == pyg.KEYDOWN:
      if event.key == pyg.K_ESCAPE:
        return 'q'
      self.act_key = str(event.key)
      return 'do_sound'

    return None


  def do_sound(self):

    self.sound.play()
    
 
  def draw_text(self):

    surface = self.font.render(self.act_key, True, (0, 255, 0))
    self.screen.blit(surface, (0, 0))
  
       
  def flip(self):

    self.clock.tick(70)
    pyg.display.flip()
    self.screen.fill((0,0,0))

####

class Controller(object):


  def __init__(self, sound_name):

    self.display = Display(800, 500, sound_name)


  def run(self):

    ev = None
    while not ev == 'q':
      ev = self.display.dispatch_events()
      self.display.draw_text()
      if ev == 'do_sound':
        self.display.do_sound()
      self.display.flip()

####
      
if __name__ == '__main__':
  
  Controller('blip.wav').run()
Auf Tastendruck wird der Sound aus 'blip.wav' abgespielt, das
must Du natuerlich entsprechend anpassen.

:wink:
yipyip
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

hm danke, aber das hat bei mir leider nicht geholfen..
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

...und dabei habe ich meine Kristallkugel extra blank geputzt... :(
Py19917062
User
Beiträge: 113
Registriert: Freitag 30. Januar 2009, 00:53
Wohnort: Dortmund
Kontaktdaten:

vlt ist zwischen dem schuss und dem sound das diese verzögerung auslöst eine schleife die in diesen 2-3 sekunden abläuft und dann erst den sound abspielt
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Die Sounddatei wird doch wohl nicht erst in der Mainloop geladen?
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

nein wird sie natürlich nicht, habe ja nur das Prinzip erklärt wie ich die Sound-datei abspiele.
Aber es liegt auch keine Schleife zwischen dem Schuss und dem Sound..
Py19917062
User
Beiträge: 113
Registriert: Freitag 30. Januar 2009, 00:53
Wohnort: Dortmund
Kontaktdaten:

und womit fängst du den sound ab? schuss und sound mit dem mausbutton oder wird der sound nach der animation des schusses abgefangen?
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

schuss und sound mit dem mausbutton
Py19917062
User
Beiträge: 113
Registriert: Freitag 30. Januar 2009, 00:53
Wohnort: Dortmund
Kontaktdaten:

werden beide aktionen vom selben anweisungblock abgefangen oder sind sie separat?
BlackJack

@Teabag: Ist das in Deinem ersten Beitrag ein Beispiel wo es die Verzögerung gibt?
Antworten