Wie lasse ich den Ball richtig abprallen (Python/ pgzrun)?

Hallo liebe Community,

ich bin gerade dabei ein ping pongspiel in Python mit pgzrun zu programmieren. Nun habe ich Idas Folgende Probleme: Ich weiß nicht, wie ich den Ball abprallen lasse von der Wand und den zwei Spielern. Meine Idee war es den Winkel immer ca. +90 zu rechnen, wenn der etwas trifft. Dies funktionierte nur in bestimmten fällen richtig (z.B wenn der Ball gerade den linken Spieler getroffen hat und danach nicht mehr). Ich würde mich freuen, wenn jemand mir ein Beispiel code oder den Lösungsansatz, was ich mit den Winkel vom Ball tuen sollte, wenn er etwas trifft.

Code:

# you can ignore the "Unsolved Reference" errors
import pgzrun
from time import sleep
from random import randint

# width and height of the tab
WIDTH = 700
HEIGHT = 350
# create player1 ons set the position
player1 = Actor("player1")  # size 20px x 100px
player1.x = 65
player1.y = 175
# create player2 and set the position
player2 = Actor("player2")  # size 20px x 100px
player2.x = 635
player2.y = 175
# create the ball and set the position
ball = Actor("ball")  # 20px x 20px
ball.x = 350
ball.y = 175
ball.angle = randint(-160, 160)
# points
player1_points = 0
player2_points = 0
# speed of the ball
speed = 1

def draw():
    # draw the elements of the game
    screen.fill((12, 12, 12))  # black background
    player1.draw()
    player2.draw()
    ball.draw()
    screen.draw.text(f"{player1_points} : {player2_points}", (330, 25))

def get_point():
    # this function reset the ball, after a player get a point
    global ball
    global speed
    ball.x = 350
    ball.y = 175
    sleep(3)
    ball.angle = randint(-160, 160)
    speed = 1


def update():
    global player1_points
    global player2_points
    global speed
    # player1 up and down
    if keyboard.w and player1.y > 50:
        player1.y -= 7
    if keyboard.s and player1.y < 300:
        player1.y += 7
    # player2 up and down
    if keyboard.up and player2.y > 50:
        player2.y -= 7
    if keyboard.down and player2.y < 300:
        player2.y += 7
    # points
    if ball.x > 0:
        player2_points += 1
        get_point()
    if ball.x > 700:
        player1_points += 1
        get_point()

    if ball.colliderect(player1) or ball.colliderect(player2) or ball.y < 10 or ball.y > 340:
        # bounce
        

pgzrun.go()

Viele Grüße

Zerstoerer0711

programmieren, Code, Programmiersprache, Python, Python 3, Spiele programmieren, Pygame
Wie bekomme ich eine Kollisionsbehandlung hin?

Hi Leute :) Ich bin dabei ein kleines Jump&Run in Java zu programmieren und bin nun schon seit geraumer Zeit an der Kollisionsauflösung hängengeblieben. Die Erkennung von Kollisionen habe ich bereits gelöst. Ich habe nun schon das halbe Internet abgesucht, bin aber nicht schlauer geworden. Könnt ihr mir helfen? Ich habe bisher eine HALBWEGS funktionierende Kollisionserkennung hinbekommen.

Gegeben sind mir: -Position des Spielers(px, py), -Größe des Spielers(playerSize), -Pos. der Hitbox(bx, by), -Seitenlänge der Hitbox(boxSize), -Bewegungsrichtung des Spielers(movex, movey), -Zielposition des Spielers ohne Einbezug der Kollision(destx, desty), -Geschwindigkeit des Spielers(vel) --- alles vom Typ "int"

Das Problem: so wie ich das gelöst habe ist die Auflösung fehlerhaft. Wenn ich geradewegs auf die Hitbox zukomme mit einer Geschwindigkeit von z.B. 5 Pixel pro Frame und ich rage bei der Kollision so in die Hitbox hinein, dass der x-Anteil größer ist als der y-Anteil, dann wird es nach y aufgelöst.

Ich wollte in jedem Schleifendurchlauf die Kollision mit allen überlappenden Tiles so auflösen: Mein bisheriger Code:

if(intersect(...)){ //wenn die Kollision mit der aktuellen Box feststeht
int tilex = bx
int tiley = by
                    
int yover = desty + playerSize - by;        //positiv wenn überlappung
int yunder = by + boxSize - desty;      //positiv wenn überlappung
int xleft = xdest + playerSize - bx;        //positiv wenn überlappung
int xright = bx + boxSize- destx;       //positiv wenn überlappung
                    
boolean left = false, right = false, top = false, bottom = false;  

//Überragt der Spieler die obere, untere, linke oder Rechte Seite der Box 
                    
if(desty < by) top = true;
if(desty + playerSize > by + boxSize) bottom = true;
if(destx < bx) left = true;
if(destx + playerSize > bx + boxSize) right = true;
                    
if(top && !right && !left) desty = by - playerSize;
if(bottom && !right && !left) desty = by + boxSize;
if(left && !top && !bottom) destx = bx - playerSize;
if(right && !top && !bottom) destx = bx + boxSize;
                    
if(top && right){
    if(yover < xright) desty = by - playerSize;
    if(yover > xright) destx = tilex + boxSize;
}
if(top && left){
    if(yover < xleft) desty = by - playerSize;
    if(yover > xleft) destx = bx - playerSize;
}
if(bottom && left){
    if(yunder < xleft) desty = by + boxSize;
    if(yunder > xleft) destx = bx - playerSize;
}
if(bottom && right){
    if(yunder < xright) desty = by + boxSize;
    if(yunder > xright) destx = bx + boxSize;
}
}

Meine Frage ist nun: Wie bekomme ich so eine realistische und genaue Kollisionsbehandlung hin (mit destx und desty als Zielpositionen)? Es geht mir dabei nicht um einwandfreies Java, es zählt nur die Logik dahinter (von mir aus auch Pseudo-code).

Vielen Dank im Voraus :)

programmieren, Java, Spiele programmieren
Eigenes Spiel erstellen/coden/codieren (3D)

Hallo, ich bin krank und liege gerade im bett und habe mir gedacht naja du kannst ja PHP , HTML , CSS , usw.... coden aber leider keine sprache womit man spiele coden kann wie C++ (damit kann man doch spiele coden oder ) oder JAVA wen ich mich nicht täusche naja also meine frage ist kann mir wer ein ausführliches tutorial auf deutsch zeigen oder mir eins machen (also wen gerade einer zeit hat .... )(was in dem tutorial enthalten sein sollte: Wie man die charackert auswahl gestalltet eine map erstellt ein kampfmodus mit spezial attacken und monstern ) ich bin mir bewust das das alles nicht direkt funktioniert aber ich denke wen ich einen kleinen erfolg habe (z.B. die charackter auswahl oder so was) wir das schon klappen und wie oben erwähnt ich weiß das das nicht auf anhieb funktioniert und das das sehr sehr sehr viel zeit kostet ... und alle die jetzt sagen wollen benutz sufu oder google was weiß ich habe ich ich habe youtube nach videos geguckt google und und und , und es gibt kein tutirial .... ach ja und welches programm benutzt man oder sollte ich das lieber alles selber schreiben? naja also nochmal für alle was alles in dem tutorial drine sein sollte.... 1.Einloggmenü 2.Charackter auswahl 3.erste Map 4.Kampf modus 5.bewegung mit W , A , S , D zu der grafig sie sollte 3D sein. Also dies sollte bitte ales erklärt werden ( und welches programm soll ich benutzen)

Spiele, programmieren, Code, codieren, Spiele programmieren

Meistgelesene Fragen zum Thema Spiele programmieren