Seite 1 von 1

prob mit 2-tem objekt im spiel

Verfasst: Freitag 7. Mai 2004, 14:05
von lionking
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()

Verfasst: Freitag 7. Mai 2004, 15:25
von Christopy
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:

Verfasst: Freitag 7. Mai 2004, 16:01
von lionking
das ändert leider nix

Verfasst: Freitag 7. Mai 2004, 16:43
von Christopy

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.

Verfasst: Freitag 7. Mai 2004, 16:47
von lionking
hey cool danke, hat gefunzt...

aber das mit der höhe noch nicht

Verfasst: Freitag 7. Mai 2004, 16:52
von Christopy
:?:
versuch mal: ziel1.pos = (200,30)

Verfasst: Freitag 7. Mai 2004, 16:58
von lionking
da ändert sich nix, egal was ich eingebe... :(

Verfasst: Freitag 7. Mai 2004, 17:01
von Christopy
jetzt seh ichs... :D
ziel1.pos( 200, 30 ) muss man natürlich aufrufen. Ist ja eine Funktion...

Verfasst: Freitag 7. Mai 2004, 17:28
von lionking
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]

Verfasst: Montag 19. Dezember 2005, 19:35
von Gast
lionking hat geschrieben:da ändert sich nix, egal was ich eingebe... :(
stimmt