[PyGame] Gravitation & Springen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Samstag 26. Januar 2008, 22:50

Hi, Leute!

Ich suche schon seit einigen, vielen Stunden nach einem Tutorial/Example oder was auch immer, um in PyGame ein Objekt springen zu lassen.

Habt ihr vllt. eine Idee, wie man das machen kann, oder kennt ihr ein gutes Tutorial oder sonst irgendwas?

Danke schonmal ;)


~DarX
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Samstag 26. Januar 2008, 23:04

Am besten siehst du dir einfach mal den Sourcecode von einem Pong Clone an. Das Spiel besteht ja aus nicht viel anderem ;)

Falls du nichts finden solltest habe ich selbst noch so einen Pong-Klon mit Pygame geschrieben. Der ist jedoch ziemlich hässlich ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Samstag 26. Januar 2008, 23:15

Ich denke mal ich hab grad ein Brett vor'm Kopf...
Aber seit wann hat Pong was mit Springen zu tun? :S
Sorry >_<
BlackJack

Samstag 26. Januar 2008, 23:16

@DarXun: Was genau soll das denn werden? Am einfachsten ist es für der Y-Koordinate über die Zeit die Werte der ersten Hälfte einer Sinusschwingung zu geben. Das ist natürlich keine physikalisch korrekte Simulation, aber rein optisch hat das schon in vielen Spielen und Demos ausgereicht. :-)
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Samstag 26. Januar 2008, 23:18

Dann sollte ich mir wohl dringend mal Sinus, Cosinus und Tangens anschauen?
Bin erst im 2. Halbjahr der 10. Klasse am Gymnasium... Bisher hatten wir noch kein Sinus & Co.
Weiß nur in etwa wie der Funktionsgraph( oda whatever) aussieht.

Edit:

Wollte einfach mal ein Character springen lassen...
Wir fangen in der Schule im Informatikunterricht bald mit Projekten in kleinen Gruppen an.
Wir haben zwar bisher nicht einmal Schleifen durchgenommen, aber ich schau mir das alles selbst an, weil ich mich wirklich sehr für sowas interessiere.
Als Projekt hatte ich mir dann was relativ simples vorgestellt.
'ne Kleine Jump & Run - Engine.
Wie gesagt... nix großartiges für EUREN Standard, aber bestimmt 'ne 1 für den Infokurs-Standard.
:D
BlackJack

Samstag 26. Januar 2008, 23:35

Hier mal ein ganz simples Stück Quelltext, das die Bewegung zumindest erahnen lässt. Das "hüpfen" ist "seitwärts", also am besten den Kopf oder den Monitor entsprechend drehen. :-)

Code: Alles auswählen

import sys
import time
from math import pi, sin

def main():
    steps = 50
    amplitude = 70
    while True:
        for i in xrange(steps):
            x = int(amplitude * sin(pi / steps * i))
            sys.stdout.write('%s*  %s\n' % (' ' * x, x))
            sys.stdout.flush()
            time.sleep(0.1)
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Samstag 26. Januar 2008, 23:49

Hab den Monitor gedreht... :D
Danke... ist schonmal recht gut...
Werd' das wohl erstmal benutzen, bis ich was physikalisch richtiges gefunden hab.
Hab schon in einigen Sourcecodes von Spielen nachgeschaut, ist aber ziemlich schwer, wenn die Leute so wenig Kommentare einbringen... Und naja, 10.000 Klassen anschauen ist auch so'ne Sache >_<
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Sonntag 27. Januar 2008, 09:26

Ähm, du hast doch in den Titel geschrieben, dass du Pygame benutzen willst, also kannst du doch ganz bequem pygame.surface.move(x, y) nutzen. Da brauchst du keinen Sinus. Pygame kann ein Objekt auch zwei bewegungen gleichzeitig ausführen lassen. So dass du sehr bequem eine ähnliche steuerung wie in den guten mario Spielen hinkriegen dürftest.
BlackJack

Sonntag 27. Januar 2008, 11:09

@Imperator: DarXun möchte eine typische Hüpfbewegung und da müssen über die Zeit irgendwoher Y-Kooridinaten kommen, die so aussehen als wenn die Aufwärtsbewegung erst schnell ist, dann langsamer wird, umkippt, und nach unten wieder schneller wird. Das ist nunmal am einfachsten mit einer "halben" Sinuskurve darstellbar.

Okay, es geht noch einfacher indem man einfach 'ne Zeitlang gleichmässig nach oben geht und dann wieder gleichmässig nach unten, aber da DarXun "Gravitation" im Titel geschrieben hat, dachte ich *das* wäre zu simpel und unansehnlich.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Sonntag 27. Januar 2008, 14:19

Achso, dann kann ich als 8. Klässler wohl kaum weiterhelfen.
Trotzdem viel Glück DarXun!
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Sonntag 27. Januar 2008, 15:39

DarXun hat geschrieben:Aber seit wann hat Pong was mit Springen zu tun? :S
Darin wird das grösste Problem dabei gelöst, die Kollisionserkennung. Danach musst du dich noch um die Impulserhaltung kümmern. Ich versuche mal ein Beispiel zu machen:

Code: Alles auswählen

import time
class Body:
  def __init__(self, x, y, vx, vy):
    # position
    self.x = x
    self.y = y
    # velocity
    self.vx = vx
    self.vy = vy
    # we leave out the acceleration for simplicity

box_width = 400
box_height = 300
gravity = 9.81
# 0.8 is the amount of energy that is reflected
bounciness = -0.8
body = Body(10, 10, 10, 10)
while True:
    # obey gravity its the law!
    body.vy += 9.81
    body.x += body.vx
    body.y += body.vy
    # collision detection
    if body.x < 0:
        body.x *= -1
        body.vx *= bounciness
    elif body.x > box_width:
        body.x = box_width - (body.x % box_width)
        body.vx *= bounciness
    if body.y < 0:
        body.y *= -1
        body.vy *= bounciness
    elif body.y > box_height:
        body.y = box_height - (body.y % box_height)
        body.vy *= bounciness
    print body.x, body.y
    time.sleep(1)
Sollte einen hüpfenden Punkt in einer Box unter dem einfluss der Schwerkraft simulieren. Ich hoffe es Funktioniert ;)

Wenn nicht hat Pyglet ein Beispiel dazu:
http://pyglet.googlecode.com/svn/trunk/ ... y/noisy.py
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Sonntag 27. Januar 2008, 17:23

Müsste wohl funktionieren. Hier ist der Output:
20 29.81
30 59.43
40 98.86
50 148.1
60 207.15
70 276.01
80 245.32
90 192.194
100 148.878
110 115.372
120 91.676
130 77.79
140 73.714
150 79.448
Antworten