prob mit 2-tem objekt im spiel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

moin

ich hab mal versucht das chimp-'spiel', dass bei pygame dabei ist zu verändern. da hab ich das problem, dass wenn ich ein zweites objekt (wie der chimpanse) einfüge, reagiert es nicht auf den schuss...
ausserdem sollte die position von dem zweiten objekt weiter unten sein...

wär schön wenn sich das jemand mal anguckt...:


Danke, lionking

Code: Alles auswählen

import os, pygame
from pygame.locals import *
import random

if not pygame.mixer: print 'Achtung kein Sound'


def load_image(name, colorkey=None):
    fullname = os.path.join('daten', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Konnte bild nicht laden:', fullname
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()

def load_sound(name):
    class NoneSound:
        def play(self): pass
    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()
    fullname = os.path.join('daten', name)
    try:
        sound = pygame.mixer.Sound(fullname)
    except pygame.error, message:
        print 'Konnte Sound nicht laden:', fullname
        raise SystemExit, message
    return sound


class Fadenkreuz(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect = load_image('fadenkreuz.bmp',-1)
        self.schiessen = 0

    def update(self):
        pos = pygame.mouse.get_pos()
        self.rect.midtop = pos

    def trifft(self, target):
        if not self.schiessen:
            self.schiessen = 1
            zielbereich = self.rect.inflate(-5,-5)
            return zielbereich.colliderect(target.rect)

    def geschossen(self):
        self.schiessen = 0

class Ziel(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('ziel.bmp',-1)
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.move = 9
        self.dizzy = 0

    def pos(self, posx, posy):
        self.rect.topleft = posx, posy

    def update(self):
        if self.dizzy:
            self._spin()
        else:
            self._walk()

    def _walk(self):
        newpos = self.rect.move((self.move,0))
        if self.rect.left < self.area.left or \
            self.rect.right > self.area.right:
            self.move = -self.move
            newpos = self.rect.move((self.move, 0))
            self.image = pygame.transform.flip(self.image, 1, 0)
        self.rect = newpos

    def _spin(self):
        "spin the monkey image"
        center = self.rect.bottom
        self.dizzy = self.dizzy + 10
        if self.dizzy >= 100:
            self.dizzy = 0
            self.image = self.original
        else:
            rotate = pygame.transform.scale
            self.image = rotate(self.original, (self.dizzy,0))
        self.rect = self.image.get_rect()
        self.rect.bottom = center


    def getroffen(self):
        if not self.dizzy:
            self.dizzy = 1
            self.original = self.image


def main():
    
    pygame.init()
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption('.....------Spiel.1------.....')
    pygame.mouse.set_visible(0)

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((250, 250, 250))

    screen.blit(background, (0, 0))
    pygame.display.flip()

    clock = pygame.time.Clock()
    daneben_sound = load_sound('daneben.wav')
    treffer_sound = load_sound('treffer.wav')
    fadenkreuz = Fadenkreuz()
    ziel = Ziel()
    ziel.pos(10,10)
    ziel1 = Ziel()
    ziel1.pos = (200,10)
    allsprites = pygame.sprite.RenderPlain((fadenkreuz, ziel, ziel1))


    while 1:
        clock.tick(60)

        for event in pygame.event.get():
            if event.type== KEYDOWN and event.key == K_ESCAPE:
                return
            elif event.type == MOUSEBUTTONDOWN:
                if fadenkreuz.trifft(ziel):
                    treffer_sound.play() 
                    ziel.getroffen()
                else:
                   daneben_sound.play()
                if fadenkreuz.trifft(ziel1):
                    treffer_sound.play()
                    ziel.getroffen()
                else:
                    daneben_sound.play()
            elif event.type == MOUSEBUTTONUP:
                fadenkreuz.geschossen()

        allsprites.update()


        screen.blit(background,(0,0))
        allsprites.draw(screen)
        pygame.display.flip()



if __name__ == '__main__': main()
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

ausserdem sollte die position von dem zweiten objekt weiter unten sein...
ziel1.pos = (200,10)

-> Der erste Wert ist die x-pos, der zweite die y-pos

reagiert es nicht auf den schuss...
ziel.getroffen()

-> soll vermutlich ziel1.getroffen() heissen :wink:
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

das ändert leider nix
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Code: Alles auswählen

    def trifft(self, target): 
        if not self.schiessen: 
            self.schiessen = 1 
            zielbereich = self.rect.inflate(-5,-5) 
            return zielbereich.colliderect(target.rect)
Du kannst nur einmal das Fadenkreuz abfragen, da schiessen=1 gesetzt wird. Wenn Du "if not self.schiessen" auskommentierst, geht es.
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

hey cool danke, hat gefunzt...

aber das mit der höhe noch nicht
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

:?:
versuch mal: ziel1.pos = (200,30)
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

da ändert sich nix, egal was ich eingebe... :(
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

jetzt seh ichs... :D
ziel1.pos( 200, 30 ) muss man natürlich aufrufen. Ist ja eine Funktion...
lionking
User
Beiträge: 28
Registriert: Mittwoch 28. April 2004, 16:03

naja ich habs doch noch anders hinbekommen:

nochwas: wie mach ich dass, dass die objekte vor jedem neuauftauchen neue speed- und pos-werte bekommen. jetzt ham sie nur beim start des spiels random-werte...

Code: Alles auswählen

import os, pygame
from pygame.locals import *
import random

if not pygame.mixer: print 'Achtung kein Sound'


def load_image(name, colorkey=None):
    fullname = os.path.join('daten', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Konnte bild nicht laden:', fullname
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()

def load_sound(name):
    class NoneSound:
        def play(self): pass
    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()
    fullname = os.path.join('daten', name)
    try:
        sound = pygame.mixer.Sound(fullname)
    except pygame.error, message:
        print 'Konnte Sound nicht laden:', fullname
        raise SystemExit, message
    return sound


class Fadenkreuz(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image,self.rect = load_image('fadenkreuz.bmp',-1)
        self.schiessen = 0

    def update(self):
        pos = pygame.mouse.get_pos()
        self.rect.midtop = pos

    def trifft(self, target):
            self.schiessen = 1
            zielbereich = self.rect.inflate(-2,-2)
            return zielbereich.colliderect(target.rect)

    def geschossen(self):
        self.schiessen = 0

class Ziel(pygame.sprite.Sprite):
    pos = 10
    speed = 9
    def __init__(self,pos,speed):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('ziel.bmp',-1)
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.rect.topleft = 10, pos
        self.move = speed
        self.dizzy = 0

    def update(self):
        if self.dizzy:
            self._spin()
        else:
            self._walk()

    def _walk(self):
        newpos = self.rect.move((self.move,0))
        if self.rect.left < self.area.left or \
            self.rect.right > self.area.right:
            #self.move = -self.move
            #newpos = self.rect.move((self.move, 0))
            #self.image = pygame.transform.flip(self.image, 1, 0)
            self.getroffen()
        self.rect = newpos

    def _spin(self):
        "spin the monkey image"
        center = self.rect.bottom
        self.dizzy = self.dizzy + 10
        if self.dizzy >= 100:
            self.dizzy = 0
            self.image = self.original
        else:
            rotate = pygame.transform.scale
            self.image = rotate(self.original, (self.dizzy,0))
        self.rect = self.image.get_rect()
        self.rect.bottom = center


    def getroffen(self):
        if not self.dizzy:
            self.dizzy = 1
            self.original = self.image


def main():
    
    pygame.init()
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption('.....------Spiel.1------.....')
    pygame.mouse.set_visible(0)

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((250, 250, 250))

    screen.blit(background, (0, 0))
    pygame.display.flip()

    clock = pygame.time.Clock()
    daneben_sound = load_sound('daneben.wav')
    treffer_sound = load_sound('treffer.wav')
    fadenkreuz = Fadenkreuz()

    speed = random.randint(5,20)
    pos = random.randint(10,590)
    speed1 = random.randint(5,20)
    pos1 = random.randint(10,590)
    
    ziel = Ziel(pos,speed)
    ziel1 = Ziel(pos1,speed)
    allsprites = pygame.sprite.RenderPlain((fadenkreuz, ziel, ziel1))


    while 1:
        clock.tick(60)

        for event in pygame.event.get():
            if event.type== KEYDOWN and event.key == K_ESCAPE:
                return
            elif event.type == MOUSEBUTTONDOWN:
                if fadenkreuz.trifft(ziel):
                    treffer_sound.play() 
                    ziel.getroffen()
                else:
                   daneben_sound.play()
                if fadenkreuz.trifft(ziel1):
                    treffer_sound.play()
                    ziel1.getroffen()
                else:
                    daneben_sound.play()
            elif event.type == MOUSEBUTTONUP:
                fadenkreuz.geschossen()

        allsprites.update()


        screen.blit(background,(0,0))
        allsprites.draw(screen)
        pygame.display.flip()



if __name__ == '__main__': main()
[/code]
Gast

lionking hat geschrieben:da ändert sich nix, egal was ich eingebe... :(
stimmt
Antworten