Sprung routine

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

5k41

Betreff: Sprung routine

BeitragSo, Mai 08, 2005 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe mich heute mal wieder an meinen PC gesetzt um (mal wieder) mich an einer sprung routine zu versuchen...dabei rausgekomnmen ist das:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2

SetBuffer BackBuffer()

x=0

y=500

While Not KeyDown (1)

If jump=0 And KeyDown(57) Then jump=1

If KeyDown(203) Then x=x-3

If KeyDown(205) Then x=x+3

If jump=1 Then y=y-1

If jump=2 Then y=y+1

If y=450 Then jump=2

If jump=2 And y=500 Then jump=0

Rect x,y,100,100

Flip

Cls

Wend

End

irgendwie sieht es aber so eckig aus... ich hatte die selbe frage schon mal vor nem halben Jahr gestellt doch damals hab ich die antwort noch überhaupt nicht verstanden...könnte mir bitte einer erklären wie man sowas "runder" aussehen lässt...thx

diGGa

GruppenKaspar

BeitragSo, Mai 08, 2005 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst es schaffen das der kasten "immer langsamer springt" desto näher er der max-höhe kommt
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

5k41

BeitragSo, Mai 08, 2005 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
auf jeden fall ist es so besser:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2

SetBuffer BackBuffer()

x=0

y=500

While Not KeyDown (1)

If jump=0 And KeyDown(57) Then jump=1

If KeyDown(203) Then x=x-3

If KeyDown(205) Then x=x+3

If jump=1 And y=440 Then jump=2

If jump=2 And y=380 Then jump=3

If jump=3 And y=350 Then jump=4

If jump=1 Then y=y-3

If jump=2 Then y=y-2

If jump=3 Then y=y-1

If jump=4 Then y=y+3

If jump=4 And y=500 Then jump=0

Rect x,y,100,100

Flip

Cls

Wend

End

aber irgendwas fehlt da noch...
 

hitokiri

BeitragSo, Mai 08, 2005 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Is zwar was ganz anderes und "etwas" komplexer aber das sollte hübsch rund sein:

Code: [AUSKLAPPEN]


fixed=10

if jump=0 and keydown(57)
jump=1
jumpcount=1
endif

if keydown(203) then x=x-3
if keydown(205) then x=x+3

if jump=1
 
 y=y-3*sin(abs(100-jumpcount*fixed))
;das fixed steht für die anzahl an steps die dein sprung dauert.
;nimm zum beispiel 10 dann hast du 19 steps wobei der scheitelpunkt bei ;step 10 liegt. kannst also mit jumpcount und step rumexperimentieren.

jumpcount=jumpcount+1

if jumpcount=19 then jump=0

endif


Jan_

Ehemaliger Admin

BeitragMo, Mai 09, 2005 7:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich mache das immer anders.
Das mit der sion Methode ist nciht schlecht, aber langsam und schwer zu kombinieren, mit so manscher Kollisionsprüfung.

BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,32,2
y=100
x=100
ClsColor 200,200,255
Repeat
Cls

;Für Kollisionen
asprung=sprung

;Links rechts Laufen
If KeyDown(203) speed#=speed#-1
If KeyDown(205) speed#=speed#+1

;Verzögertes laufen
speed#=speed#*0.9
x=x+speed#

;Schwerkraft
sprung = sprung -1
y=y-Sprung

; Kollisionen mti Gerade
If y>= 400 Then sprung =1: y=400

;Wenn nciht Sprung, dann
If asprung =1 And sprung =1 Then
;WEnn Taste Oben, ddann Springen
If KeyHit(200) sprung= 20
EndIf

;ausgabe
Color 0,255,0
Rect 0,400,640,80,1
Color 255,0,0
Text X,Y-8,\"Player\",0,1
Color 0,0,0
Text 0,0,\"Sprung: \" + sprung

Flip 1
Until KeyHit(1)
between angels and insects
 

hitokiri

BeitragMo, Mai 09, 2005 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich wollte ich ne Bezierkurve nehmen, deswegen auch das ganz "anders", aber da müsstest du dann alle werte vorher berechnen und in nem array speichern , das wäre wirklich zu langsam...dafür aber eine wirklich perfekt runde sprungbewegung bei der du dann sogar noch spässe einbauen könntest wie maximale höhe des sprungs wird kleiner wenn du dich währenddessen auf der x achse bewegst etc...
 

Bigfreddy

BeitragMo, Mai 09, 2005 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie findet ihr dies:


BlitzBasic: [AUSKLAPPEN]


Graphics 800,600,16,2
SetBuffer BackBuffer()

Type Personen
Field x
Field y
Field Groesse
Field Sprung
End Type

Type Schuesse
Field x
Field y
Field richtung
Field laenge
End Type

Global Spieler.Personen=New Personen

Global springen=0,pause=15,speed=5,alty,doppelsprung,speed_kugel=10,laengenmax=40
;sprungmodus an/aus
;verzoegerung beim springen
;Spieler
;\"0-Ebene\"
;un-/möglich

Spieler\Groesse=30
Spieler\x=200
Spieler\y=300-(Spieler\groesse/2)
Spieler\Sprung=15
alty=spieler\y
doppelsprung=0
anzahl=0
richtung=1


Color 0,255,0

Repeat
Cls


If MouseHit(1) Then
schuss.schuesse=New schuesse
schuss\x=spieler\x+(spieler\groesse*(richtung=1))
schuss\y=spieler\y+(spieler\groesse/2)
schuss\richtung=richtung
schuss\laenge=1
EndIf

For schuss=Each schuesse ;Schuesse updaten
schuss\x=schuss\x+(schuss\richtung*speed_kugel)
If schuss\laenge<laengenmax Then schuss\laenge=schuss\laenge+1
Rect schuss\x,schuss\y,schuss\laenge,1
If(schuss\x-schuss\laenge)>=800 Or (schuss\x<=0) Then Delete schuss
Next

Oval Spieler\x,Spieler\y,Spieler\groesse,Spieler\groesse

;Die Steuerung würde ich noch anders machen....
If KeyDown(203) And spieler\x>0 Then
spieler\x=spieler\x-speed ;Spieler bewegt sich nach links
richtung=-1
EndIf

If KeyDown(205) And Spieler\x<GraphicsWidth() Then
spieler\x=spieler\x+speed ;Spieler bewegt sich nach rechts
richtung=1
EndIf

If Spieler\x>GraphicsWidth() Then Spieler\x=1-Spieler\Groesse ;setzt Spieler ans
If Spieler\x<(0-Spieler\groesse) Then Spieler\x=800 ;andere Ende

If (KeyHit(200))And (doppelsprung=0)Then ;Sprung
If springen=1 Then doppelsprung=1
springen=1
sprunghilfs=-1 ;Richtung die Spieler springt -= hoch
EndIf

If (springen=1)And(startpause+pause<MilliSecs())Then;Falls Sprung u.Verzögerung
spieler\y=spieler\y+sprunghilfs ;Spieler hüpft
If sprunghilfs<0 Then sprunghilfs=sprunghilfs-1 ;springt weiter
If sprunghilfs=-spieler\sprung Then sprunghilfs=1 ;kehrt zurück

If sprunghilfs>0 Then sprunghilfs=sprunghilfs+1 ;geht runter
If spieler\y>=alty Then
spieler\y=alty
springen=0
doppelsprung=0
EndIf

startpause=MilliSecs()

EndIf

Flip
Until KeyDown(1)
End

 

totonak5

BeitragMo, Mai 09, 2005 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
ich finde das sieht eher so aus, als ob das objekt gegen eine wand hüpft und darum nicht höher kommt!

... aber vielleicht sollte ich nicht so groß reden wenn ich nichts eigenes poste ...
Just for Fun!
Jesus loves U!

Triton

BeitragMo, Mai 09, 2005 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn man bei der Form und dem Einfachen der Routine des Topicstarters bleiben will, kann mans auch einfach so lösen:

Code: [AUSKLAPPEN]

Graphics 800,600,32,2

SetBuffer BackBuffer()

x=0
y=500
maxh=200     ;sprunghöhe
v=3         ;wie schnell verläuft der sprung

While Not KeyDown (1)
        If jump=0 And KeyDown(57) Then jump=1
      If jump=1 Then a=a+v
      If a>180 Then jump=0:a=0
        If KeyDown(203) Then x=x-3
        If KeyDown(205) Then x=x+3
      y2=Sin(-a)*maxh
      Rect x,y2+y,100,100
      Text 10,10,jump
        Flip
        Cls
       
Wend

End


Das muss ja nicht unnötig kompliziert und lang werden.
1 min drüber und das sieht doch gleich viel schöner aus Smile
Coding: silizium-net.de | Portfolio: Triton.ch.vu
  • Zuletzt bearbeitet von Triton am Mo, Mai 09, 2005 21:07, insgesamt 2-mal bearbeitet
 

hitokiri

BeitragMo, Mai 09, 2005 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
noch die sinuswerte in einem array speichern da sie begrenzt sind...und es ist perfekt Wink

Triton

BeitragMo, Mai 09, 2005 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaube, bei sowas kann man es in Sachen Geschwindigkeit noch gerade so vertreten, auch mal die Original-Sin-fkt zu nutzen Wink
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

Bigfreddy

BeitragMo, Mai 09, 2005 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@triton: des schaut supi aus...auch wenns für dich eine Zitat:
Einfache. ... Routine
ist...

ich versteh nur y2=Sin(-a)*maxh nicht (hab erst grad mir sin,cos und tan in der schule angefangen)

Triton

BeitragDi, Mai 10, 2005 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Im grunde muss man nur wissen, dass Sinus eine schöne Kurve erzeugt, die am oberen und unteren Wert sich diesem sanft annähert.

y2=Sin(-a)*maxh

sin(a) erzeugt positive werte, wenn a > 0 (was hier der fall ist). Da dann der Sprung aber nach unten verlaufen würde, sin(-a). Und das ganze mit maxh multipliziert (sin erzeugt nur werte zwischen 0 und 1), damit man auf die wirkliche Sprunghöhe kommt.

Smile
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

Bigfreddy

BeitragDi, Mai 10, 2005 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
aha...
naja ich hätts mir eigentlich auch alleine zamreimen können, aber trotzdem thx

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 05, 2005 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@Alle,
ich würde das ganz ohne Sin/Cos oder anderen Funktionen machen. Wenn man die 'Flugbahn' vorberechnet, dann hat man weniger Chancen eine vernünftige Reaktion auf unerwartete Ereignisse zu machen. Zum Beispiel: Spielfigur trifft auf ner Bauer/Gegner oder sonst was. Da ich mich immer wieder darüber aufrege, habe ich eben mal ein Code geschrieben der so alle Probleme beseitigen sollte. Das einzige manko ist, daß die Kollisionsabfrage im Beispiel per ReadPixel gemacht wird. Ist natürlich unschön sowas, ich weiß. Aber Images auf Webspace und son Kramm hab ich nicht.

Gesprungen wird mit [SPACE] und das nur wenn Boden unter den Füssen vorhanden ist. Die 'Flugbahn' kann durch äussere Einflüsse wie Mauer/Boden/Decke in Echtzeit beeinflusst werden.

Code: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()

xp#=40   ; X-Position
yp#=40   ; Y-Position
yg#=0   ; Y-Geschwindigkeit




While Not KeyHit(1)

 Color 64,64,64 ; Spiel(Feld/Plattform) Farbe
 Rect 0,0,20,480,1 ; Spielfeldbegrenzung linker Balken
 Rect 619,0,20,480,1 ; Spielfeldbegrenzung rechter Balken
 Rect 20,459,600,20,1 ; Spielfeldbegrenzung unterer Balken
 Rect 299,200,320,20,1 ; Plattform rechts
 Rect 20,330,200,20,1 ; Plattform links
 For q=460 To 480:Line 200,q,620,q-40:Next ; Schräge Plattform

 If KeyDown(203) Then xp=xp-2 ; Spieler nach links Verschieben
 If KeyDown(205) Then xp=xp+2 ; Spieler nach rechts Verschieben
 If KeyDown(57) And ReadPixel(xp,yp+13)<>-16777216 Then yg=-6 ; Spieler Springen lassen wenn Boden unter den Füssen

 yg=yg+0.1 ; Eine Gravitation damit der Spieler auch Richtung Boden beschleunigt wenn er sich in der Luft aufhällt
 yp=yp+yg ; Position wird von der Geschwindigkeit beeinflusst, Wird benötigt für weichere Bewegungen

 If Not ReadPixel(xp-1,yp+5)=-16777216 Then xp=xp+2
 If Not ReadPixel(xp+11,yp+5)=-16777216 Then xp=xp-2
 If Not ReadPixel(xp+5,yp-1)=-16777216 Then yp=yp-yg:yg=-yg/4
 If Not ReadPixel(xp,yp+11)=-16777216 Then yp=yp-yg:yg=-yg/4:yp=yp-0.5

 Color 255,255,255 ; Spielerfarbe weiß
 Rect xp,yp,10,10,1 ; Spielerkörper zeichnen

 Flip
 Cls
Wend
End

 

krux

BeitragFr, Aug 12, 2005 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
wie wärs mit kurz und einfach
Code: [AUSKLAPPEN]

graphics 800,600,16,0
setbuffer backbuffer()

posx = 400
posy = 300
xspeed# = 0
yspeed# = 0


while not keyhit(1)
   cls
   if posy >= 550 then
      posy = 550
      yspeed = 0
   endif
   
   if keyhit(57) and posy = 550 then
     yspeed = -10
   endif
   
   
   yspeed = yspeed + 0.1
   posy = posy + yspeed
   
   oval posx-10,posy-10,20,20
   
   flip
wend
end
[/code]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 12, 2005 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo krux,
hast du dir meinen Code mal auch angeschaut? Oder zumindest mal gestartet? Dann wirst du sehen, daß mein Code sich von der Logik von deinem garnicht unterscheidet, sondern das in meinem zusätzlich noch eine Steuerung, realistischere 'Abprallphysik', Kolisionsabfrage und Kommentarzeilen eingebaut ist.

Naja, die Kollisionsabfrage ist im Beispiel mit ReadPixel gemacht, nicht schön, aber soll nur ein Beispiel sein. In einem Spiel würde ich das anders machen. Immerhin lässt die Kollisionsabfrage aber leicht schräg verlaufende Böden zu...

Ich wollte nur davon abraten mit irgendwelchen Wurfparabeln, if/then Anweisungen oder sonst son Quatsch rum zu hantieren.

Alfadur

BeitragSa, Aug 13, 2005 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
sondern das in meinem zusätzlich noch eine Steuerung, realistischere 'Abprallphysik', Kolisionsabfrage und Kommentarzeilen eingebaut ist.


klingt ein bißchen wie : meiner ist größer UND dicker!! und überhaupt nich so krumm wie deiner ...

ich finde : wenns passt soll er machen wie ers für richtig hält... und um if/then bist nichmal du drumrum gekommen ... is doch nett das es für ein problem soviele lösungen gibt ...
A Cray is the only computer that runs an endless loop in less than four hours.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Aug 13, 2005 2:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@Alfadur,
na wenn du meinst...
 

krux

BeitragSa, Aug 13, 2005 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@ hectic
sorry nee ich hab dein code nich durchgelesen ich hab nur diesen endlosen quelltext gesehen und wollte das Problen direkt und kurz abhaken. Jedenfalls ist es wichtig eine Variable für die Vertikalbewegung zu haben die sich immer zur Spielerposition Addiert und ausschieslich dort veränderungen vorzunemen wie z.b. die einwiorkende Schwerkraft

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group