Spiel programmiert, aber Probleme!!!

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
Python-Neuling

Also, ich habe folgendes Problem.
Ich programmiere momentan dieses Spiel: http://vinh.home.t-link.de/spiel.zip

---------------------------------------------------------------------------

Code: Alles auswählen

import sys, pygame
import pygame.mixer, pygame.time
from pygame.locals import *

pygame.init()
size = width, height = 640, 480
speed = [3, 3]
black = 0, 0, 0
mixer = pygame.mixer
time = pygame.time
screen = pygame.display.set_mode(size)

pygame.mixer.music.load("mukke.mp3")
pygame.mixer.music.play(5,0.0)
pygame.mixer.music.get_volume()
pygame.mixer.music.set_volume(100)

background = pygame.image.load("background.jpg")
backgroundrect = background.get_rect() 

ball = pygame.image.load("ball.bmp")
ballrect = ball.get_rect()
ball.set_colorkey(black)

balken = pygame.image.load("balken.bmp")
balkenhoehe = balken.get_height()
balkenbreite = balken.get_width()
balkenx = width/2-balkenbreite/2
balkeny = height-20

stein1 = pygame.image.load("stein1.bmp")
steinbreite = stein1.get_width()
steinhoehe = stein1.get_height()
stein1rect = stein1.get_rect()
stein1rect.bottom = 270
stein1rect.right = 200
stein2 = pygame.image.load("stein2.bmp")
stein2rect = stein2.get_rect()
stein2rect.bottom = 270
stein2rect.right = 200+steinbreite+2
stein3 = pygame.image.load("stein3.bmp")
stein3rect = stein3.get_rect()
stein3rect.bottom = 270
stein3rect.right = 200+2*steinbreite+2*2
stein4 = pygame.image.load("stein4.bmp")
stein4rect = stein4.get_rect()
stein4rect.bottom = 270
stein4rect.right = 200+3*steinbreite+3*2
stein5 = pygame.image.load("stein5.bmp")
stein5rect = stein5.get_rect()
stein5rect.bottom = 270
stein5rect.right = 200+4*steinbreite+4*2
stein6 = pygame.image.load("stein6.bmp")
stein6rect = stein6.get_rect()
stein6rect.bottom = 270
stein6rect.right = 200+5*steinbreite+5*2

merker=1

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): sys.exit()
    
    keystate = pygame.key.get_pressed()
    balkenxmove = keystate[K_RIGHT]-keystate[K_LEFT]
    balkenymove = keystate[K_DOWN]-keystate[K_UP]
    balkenx+=2.5*balkenxmove
    balkeny+=balkenymove

    ballrect = ballrect.move(speed)

    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0:
        speed[1] = -speed[1]
        merker=merker or (ballrect.bottom < balkeny or ballrect.top > balkeny+balkenbreite)  
    if ballrect.right > balkenx and ballrect.left < balkenx+balkenbreite:
        if merker and ((ballrect.bottom > balkeny and speed[1]>0 ) or (ballrect.top < balkeny+balkenhoehe and speed[1]<0)):
            speed[1] = -speed[1]
            merker=0
    else:
        if ballrect.bottom > height:
            print '>>> GAME OVER <<<'
            sys.exit()
             
    screen.fill(black)
    screen.blit(background, backgroundrect)
    screen.blit(ball, ballrect)
    screen.blit(balken,(balkenx,balkeny))
    screen.blit(stein1, stein1rect)
    screen.blit(stein2, stein2rect)
    screen.blit(stein3, stein3rect)
    screen.blit(stein4, stein4rect)
    screen.blit(stein5, stein5rect)
    screen.blit(stein6, stein6rect)
    pygame.display.flip()
---------------------------------------------------------------------------

1. Ich will nicht die Steine immer alle einzeln aufrufen, müsste ja sonst ca 100 mal sowas reinschreiben.
2. Springt der Ball nicht richtig vom Balken ab und ich weiß momentan nicht, wie es klappen könnte, obwohl mein Code richtig sein müsste. Außerdem soll der Ball von den Seiten des Balken natürlich auch natürlich abspringen.
3. Der Ball soll je nachdem wo er auf dem Balken ankommt, verschieden abspringen, sprich wenn er mehr auf der linken Seite des Balken ankommt, nach links und auf der rechten Seite nach rechts. Ich müsste wohl dazu den Balken in X-Werte aufteilen und dann speed des x-Wertes ändern, hab aber atm kein Peil :/ Need HELP!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

ich hab mal den Code in [code]...[/code] gesetzt. Bitte denkt immer daran beim Posten von Pythoncode, da bei Python die Einrückungen zur Syntax gehören und die Einrückungen sonst nicht dargestellt werden!


Gruß

Dookie
Python-Neuling

aso sry, aber helfen kann mir keiner? :(
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
Python-Neuling hat geschrieben: 1. Ich will nicht die Steine immer alle einzeln aufrufen, müsste ja sonst ca 100 mal sowas reinschreiben.
Du könntest ein Array verwenden:

Code: Alles auswählen

...
balkeny = height-20

def rand_stein():
    from random import choice
    return choice(["stein1.bmp", "stein2.bmp", "stein3.bmp", "stein4.bmp", "stein5.bmp"])

steine = []
steinrect = []
for i in range(10):
    steine.append(pygame.image.load(rand_stein()))
    steinbreite = steine[i].get_width()
    steinhoehe = steine[i].get_height()
    steinrect.append(steine[i].get_rect())
    steinrect[i].bottom = 270
    steinrect[i].right = 200+i*steinbreite+i*2

merker=1
...
Dann kannst Du einfach darüber iterieren:

Code: Alles auswählen

...
screen.blit(balken,(balkenx,balkeny))
for i in range(len(steine)):
    screen.blit(steine[i], steinrect[i])
Hilft das?

Gruß, mawe
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Python-Neuling hat geschrieben: 2. Springt der Ball nicht richtig vom Balken ab...
Wieso? Der Ball verhält sich meiner Meinung nach eh richtig.
Python-Neuling hat geschrieben: 3. Der Ball soll je nachdem wo er auf dem Balken ankommt, verschieden abspringen, sprich wenn er mehr auf der linken Seite des Balken ankommt, nach links und auf der rechten Seite nach rechts.
Hä? Also wenn der Ball von links kommt und auf der linken Seite des Balkens auftrifft soll er wieder nach links zurückfliegen? :shock:
Oder versteh ich dich nicht richtig?

Gruß, mawe
Python-Neuling

Danke für deine Hilfe.
Ähm, und wie ist das jetzt wenn ich mehrere Reihen von den Steinen machen will? Außerdem will ich ja dass jeder Stein verschwindet, wenn der Ball ihn trifft. =)
Python-Neuling

Zu 3.
Also sagen wir der Balken ist 25 Pixel breit.
Dann ist z.B. der 1. Pixel ganz links oben auf der Fläche und der 25. Pixel ganz rechts oben auf der Fläche. So, wenn der Ball nun von oben auf den 1. Pixel trifft, soll der Ball nach links zurückprallen, wenn er auf den 25. Pixel trifft, ganz nach rechts zurückprallen und wenn er z.b. auf den 12. Pixel trifft, ca. nach oben mitte zurückprallen. Also je nachdem auf welchen Pixel der Ball trifft, springt er verschieden ab!
Würde das gerne realisieren, weiß aber nicht wie das atm funzt.
Python-Neuling

Hab mal etwas gemacht:

Code: Alles auswählen

def rand_stein():
    return choice(["stein1.bmp", "stein2.bmp", "stein3.bmp", "stein4.bmp", "stein5.bmp", "stein6.bmp"])
#Sucht ein beliebiges der 6 verschiedenen Steine aus und gibt es aus

steine = []
steinrect = []
for a in range(10):
    steine.append(pygame.image.load(rand_stein()))
    steinbreite = steine[a].get_width()
    steinhoehe = steine[a].get_height()
    steinrect.append(steine[a].get_rect())
    steinrect[a].bottom = 270
    steinrect[a].left = 190+a*steinbreite+a*1

steineb = []
steinrectb = []
for b in range(10):
    steineb.append(pygame.image.load(rand_stein()))
    steinbreiteb = steine[b].get_width()
    steinhoeheb = steine[b].get_height()
    steinrectb.append(steine[b].get_rect())
    steinrectb[b].bottom = 259
    steinrectb[b].left = 190+b*steinbreiteb+b*1

steinec = []
steinrectc = []
for c in range(10):
    steinec.append(pygame.image.load(rand_stein()))
    steinbreitec = steine[c].get_width()
    steinhoehec = steine[c].get_height()
    steinrectc.append(steine[c].get_rect())
    steinrectc[c].bottom = 248
    steinrectc[c].left = 190+c*steinbreitec+c*1

steined = []
steinrectd = []
for d in range(10):
    steined.append(pygame.image.load(rand_stein()))
    steinbreited = steine[d].get_width()
    steinhoehed = steine[d].get_height()
    steinrectd.append(steine[d].get_rect())
    steinrectd[d].bottom = 237
    steinrectd[d].left = 190+d*steinbreited+d*1

steinee = []
steinrecte = []
for e in range(10):
    steinee.append(pygame.image.load(rand_stein()))
    steinbreitee = steine[e].get_width()
    steinhoehee = steine[e].get_height()
    steinrecte.append(steine[e].get_rect())
    steinrecte[e].bottom = 226
    steinrecte[e].left = 190+e*steinbreitee+e*1

steinef = []
steinrectf = []
for f in range(10):
    steinef.append(pygame.image.load(rand_stein()))
    steinbreitef = steine[f].get_width()
    steinhoehef = steine[f].get_height()
    steinrectf.append(steine[f].get_rect())
    steinrectf[f].bottom = 215
    steinrectf[f].left = 190+f*steinbreitef+f*1
So und dann hab ich das Abprallen von den Steinen mal gemacht!
Das ist aber irgendwie fehlerhaft und ich weis nicht woran es liegt:

Code: Alles auswählen

    if ballrect.bottom > steinrect[a].top and ballrect.top < steinrect[a].bottom:
        if (ballrect.left < steinrect[a].right and speed[0]>0) or (ballrect.right > steinrect[a].left and speed[0]<0):
            speed[0] = -speed[0]
    if ballrect.bottom > steinrectb[b].top and ballrect.top < steinrectb[b].bottom:
        if (ballrect.left < steinrectb[b].right and speed[0]>0) or (ballrect.right > steinrectb[b].left and speed[0]<0):
            speed[0] = -speed[0]
    if ballrect.bottom > steinrectc[c].top and ballrect.top < steinrectc[c].bottom:
        if (ballrect.left < steinrectc[c].right and speed[0]>0) or (ballrect.right > steinrectc[c].left and speed[0]<0):
            speed[0] = -speed[0]
    if ballrect.bottom > steinrectd[d].top and ballrect.top < steinrectd[d].bottom:
        if (ballrect.left < steinrectd[d].right and speed[0]>0) or (ballrect.right > steinrectd[d].left and speed[0]<0):
            speed[0] = -speed[0]
    if ballrect.bottom > steinrecte[e].top and ballrect.top < steinrecte[e].bottom:
        if (ballrect.left < steinrecte[e].right and speed[0]>0) or (ballrect.right > steinrecte[e].left and speed[0]<0):
            speed[0] = -speed[0]
    if ballrect.bottom > steinrectf[f].top and ballrect.top < steinrectf[f].bottom:
        if (ballrect.left < steinrectf[f].right and speed[0]>0) or (ballrect.right > steinrectf[f].left and speed[0]<0):
            speed[0] = -speed[0]

    if ballrect.left < steinrectf[f].right and ballrect.right > steinrectf[f].left:
        if (ballrect.bottom > steinrectf[f].top and speed[1]>0) or (ballrect.top < steinrectf[f].bottom and speed[1]<0):
            speed[1] = -speed[1]
etc........
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Hab auch mal etwas gemacht :wink:

Code: Alles auswählen

def rand_stein():
	return choice(["stein1.bmp", "stein2.bmp", "stein3.bmp", "stein4.bmp", "stein5.bmp"])

gesamtsteine = []
gesamtsteinerect = []

def create_row(x,y,n):
	steine = []
	steinrect = []
	for i in range(n):
		steine.append(pygame.image.load(rand_stein()))
		steinbreite = steine[i].get_width()
		steinhoehe = steine[i].get_height()
		steinrect.append(steine[i].get_rect())
		steinrect[i].bottom = x
		steinrect[i].right = y+i*steinbreite+i*2
	gesamtsteine.extend(steine)
	gesamtsteinerect.extend(steinrect)

def triangle():
	x = 200
	y = 350
	n = 1
	for i in range(10):
		create_row(x,y,n)
		x += 10; y -= 15; n += 1

triangle()

merker=1
...
Das Abprallen sieht dann so aus:

Code: Alles auswählen

for i in range(len(gesamtsteine)):
        if ballrect.bottom > gesamtsteinerect[i].top and ballrect.top < gesamtsteinerect[i].bottom:
            if (ballrect.left < gesamtsteinerect[i].right and speed[0]>0) or (ballrect.right > gesamtsteinerect[i].left and speed[0]<0):
                speed[0] = - speed[0]
Vielleicht fällts Dir nicht auf, aber da stimmt auch etwas nicht :oops:
Hab jetzt leider keine Zeit mehr, schau mir das aber morgen noch mal an.

Gruß, mawe
Python-Neuling

Aehm, wenn ich das einfüge sagt das Python-Shell das 'steine' not definied ist. Schick mal dann das ganze instructor.py an ninja@unterderbruecke.de das ist meine E-Mail :D oder schreib hier den ganzen Code ^^
Gast

Hi!

Also hier ist mal das ganze Programm:

Code: Alles auswählen

import sys, pygame
import pygame.mixer, pygame.time
from pygame.locals import *
from random import choice

pygame.init()
size = width, height = 640, 480
speed = [3, 3]
black = 0, 0, 0
mixer = pygame.mixer
time = pygame.time
screen = pygame.display.set_mode(size)

pygame.mixer.music.load("mukke.mp3")
pygame.mixer.music.play(5,0.0)
pygame.mixer.music.get_volume()
pygame.mixer.music.set_volume(100)

background = pygame.image.load("background.jpg")
backgroundrect = background.get_rect() 

ball = pygame.image.load("ball.bmp")
ballrect = ball.get_rect()
ball.set_colorkey(black)

balken = pygame.image.load("balken.bmp")
balkenhoehe = balken.get_height()
balkenbreite = balken.get_width()
balkenx = width/2-balkenbreite/2
balkeny = height-20

def rand_stein():
    return choice(["stein1.bmp", "stein2.bmp", "stein3.bmp", "stein4.bmp", "stein5.bmp"])

gesamtsteine = []
gesamtsteinerect = []

def create_row(x,y,n):
    steine = []
    steinrect = []
    for i in range(n):
    	steine.append(pygame.image.load(rand_stein()))
    	steinbreite = steine[i].get_width()
    	steinhoehe = steine[i].get_height()
    	steinrect.append(steine[i].get_rect())
    	steinrect[i].bottom = y
    	steinrect[i].right = x+i*steinbreite+i*2
    gesamtsteine.extend(steine)
    gesamtsteinerect.extend(steinrect)

def triangle(x,y,z):
    n = 1
    for i in range(z):
    	create_row(x,y,n)
    	x -= 15; y += 12; n += 1

def reverse_triangle(x,y,z):
    n = z
    for i in range(z):
    	create_row(x,y,n)
    	x += 15; y += 12; n -= 1

def rectangle(x,y,n):
    for i in range(5):
    	create_row(x,y,n)
    	y -= 12 

#create_row(270,200,10)
#triangle(300,150,10)
rectangle(200,200,10)
#reverse_triangle(250,150,10)

merker=1

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): sys.exit()
    
    keystate = pygame.key.get_pressed()
    balkenxmove = keystate[K_RIGHT]-keystate[K_LEFT]
    balkenymove = keystate[K_DOWN]-keystate[K_UP]
    balkenx+=2.5*balkenxmove
    balkeny+=balkenymove

    ballrect = ballrect.move(speed)

    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0:
        speed[1] = -speed[1]
        merker=merker or (ballrect.bottom < balkeny or ballrect.top > balkeny+balkenbreite)  
    if ballrect.right > balkenx and ballrect.left < balkenx+balkenbreite:
        if merker and ((ballrect.bottom > balkeny and speed[1]>0 ) or (ballrect.top < balkeny+balkenhoehe and speed[1]<0)):
            speed[1] = -speed[1]
            merker=0
    else:
        if ballrect.bottom > height:
            print '>>> GAME OVER <<<'
            sys.exit()

    for i in range(len(gesamtsteine)):
    	if speed[1]>0 and \
    		ballrect.bottom > gesamtsteinerect[i].top and \
    		ballrect.left < gesamtsteinerect[i].right and \
    		ballrect.right > gesamtsteinerect[i].left:
    		speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(background, backgroundrect)
    screen.blit(ball, ballrect)
    screen.blit(balken,(balkenx,balkeny))
    for i in range(len(gesamtsteine)):
    	screen.blit(gesamtsteine[i], gesamtsteinerect[i])
    
    pygame.display.flip()
Das Abprallen funktioniert noch immer nicht richtig. Dafür bin ich anscheinend zu blöd.

Gruß, mawe
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Dafür bin ich anscheinend zu blöd.
Und anscheinend auch fürs Einloggen :?

Gruß, mawe
Antworten