KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [Lua] Sprung Animation
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo, also ich habe ein Frage:

Wenn ich meine Figur springen lassen will, habe ich 2 Probleme.

1. Sobald ich den Lua Player starte, sinkt meine Figur bis zur hälfte unter den Bildschirm rand. Wenn ich dann 1 mal nach oben drücke, sinkt sie wieder, aber auch wieder unter den Bildschirm rand

weiß jemand, wie ich das ändern kann ?

Ich hab den Wert 250 auch schon verändert, es hat nunmal nichts gebracht :/

y = 0 ist jetzt irgendwie an Falsche stelle, normal steht dort immer 220.


Gelöst!

2. Meine Frage: Wenn ich beim springen eine Animation machen will (mit zähler) dann würde es sich doch überlappen oder ?

Denn wenn die Figur springt, dann geht der zähler hoch, und wenn sie Sinkt, dann geht doch der zähler auch wieder runter oder irre ich mich dort ? Geht es auch, das wenn meine Figur sinkt, das der zähler steigt ?

Ich hoffe ihr versteht mein Problem ! Smile
Soweit ich das verstehe startest du bei y=0. Dabei ist y < 250 und deshalb sinkt die Figur bei jedem Durchlauf des Loops um einen halben Pixel nach unten. Am Ende bleibt sie bei Y=250 stehen, das entspricht dem unteren Bildschirmrand (272px), sodass sie da unten hängt. Wenn du nach oben drückst geht die schleife, die die Figur normal nach unten schickt nicht aus.
Zu der Sprunganimation: Ich würde einen Zähler nehmen, auf den du ddann mit s=1/2at^2 aufbauen kannst. Damit kriegst du realistische Beschleunigungs- und Bremsvorgänge hin. S ist die Position, a ist die Beschleunigung (negativer Wert für einen Bremsvorgang) und t die Zeit, die du mit einem Timer definierst.
Ok, also das Problem, das meine Figur weiter unten ist, habe ich gelöst bekommen (danke DuLouser Big Grin )

Kann ich bei dem Animation Timer auch

Code:
if zaehler = zaehler &lt; 20 then
screen:blit:(x,y,bild)
elseif zaehler = zaehler &lt; 40 then
blablabla...


Natürlich anders geschrieben, aber ich meine, das bei jedem Tick ein neues Bild geladen wird ?

oder überlappt sich da was ?

Code:
modus = "steht"
normal = Image.load("normal.png")
springen = Image.load("springen.png")

x=220
y=272 - normal:height()

while true do

pad = Controls.read()

screen:clear()

if pad:up() and oldpad:up() ~= pad:up() and y ==272 - normal:height() then
y = y - 10
mode= "springt"
else
mode = "steht"
end

if y &lt; 272 - normal:height() then
y = y + 0.10
elseif y &gt; 272 - normal:height() then
272
end

if mode == "steht" then
screen:blit(x,y,normal)
elseif mode == "springt" then
screen:blit(x,y,springen)
end


screen.flip()
oldpad = pad
end


*EDIT* Fehler korrigiert

Oke, also ich hab das jetzt 2 mal gemacht:

1 mal habe ich einen Zeiger gesetzt und dann bei jedem Tick ein neues Bild zu machen. Es ging, allerdings ist meine Figur kein Meter hoch, danach habe ich noch den Zähler weggemacht, aber Meine Figur ist kein Meter gesprungen Noidea
ohh, da ist ein fehler drin. sry
wenn du einen realistischen sprung haben willst, der wirklich parabelform hat, musste der figur ne y-geschwindigkeit geben. dann noch ne variable die die gravitation beinhalttet, kannste z.b. gravity nennen.

gravity würde ich einfach vor der while schleife zum testen erstmal auf 1 setzen (entspricht einer Beschleunigung von 1 pixel/frame^2)

dann in der while schleife machste dann, damit die gravitation auch eine wirkung hat, was in der art:

PHP-Code:
if y+vy+gravity<220 then
    vy
=vy+gravity
    y
=y+vy
else
    
y=220
    vy
=0
end 


und dann halt um nen sprung zu machen:

PHP-Code:
if oldpad:up() and not pad:up() then
    vy
=-10
end 


ist zwar nicht getestet, aber so sollte man einen recht realistischen sprung hinbekommen.
je höher du die variable gravity setzt, dest stärker ist die gravitation. je weiter unter 0 man vy beim sprung setzt, desto stärker ist der sprung.

@ DuLouser, jetzt fällt meine Figur nach unten wenn ich nach oben drücke Sad

@Neutrosider: Sorry, aber ich habe kein Wort verstanden, soweit bin ich noch lange nicht :o

Edit: DuLouser, ausnahmsweise hab ich den Code copy&paste, und selbst kommt ein Fehler. Die Figur springt ganz kurz, sinkt und dann ist sie weg O.o
ich habs nicht getestet, aber so könntest klappen, vorausgesetzt ich hab keinen fehler reingemacht:

PHP-Code:
normal Image.load("normal.png")
springen Image.load("springen.png")
bild=normal
x
=220
y
=272 normal:height()

while 
true do
    
pad Controls.read()
    
screen:clear()
    
    if 
oldpad:up() and not pad:up() then
        vy
=-10
        bild
=springen
    end 
    
    
if 272 normal:height() or vy~=0 then
        
if y+vy+gravity 272-normal:height() and  then
            vy
=vy+gravity
            y
=y+vy
        
else
            
y=220
            vy
=0
            bild
=normal
        end
    end
    screen
:blit(x,y,bild)
    
screen.flip()
    
oldpad pad
end 

Neutrosider, hat nicht geklappt, er meldet mir einen Fehler in zeile 11 das irgendwas mit oldpad sei, aber das versteh ich jetzt nicht.
ja wie gesagt. war nicht getestet. der fehler ist, dass die variable oldpad an der stelle noch nicht existiert. probiers mal damit:

PHP-Code:
normal Image.load("normal.png")
springen Image.load("springen.png")
bild=normal
x
=220
y
=272 normal:height()
vy=0
gravity
=1
oldpad 
Controls.read()

while 
true do
    
pad Controls.read()
    
screen:clear()
    
    if 
oldpad:up() and not pad:up() then
        vy
=-10
        bild
=springen
    end 
    
    
if 272 normal:height() or vy~=0 then
        
if y+vy+gravity 272-normal:height() and  then
            vy
=vy+gravity
            y
=y+vy
        
else
            
y=220
            vy
=0
            bild
=normal
        end
    end
    screen
:blit(x,y,bild)
    
screen.flip()
    
oldpad pad
end 


btw, die beiden Bilder normal.png und springen.png sind aber im HB-Ordner, oder?

Also ich habe jetzt die Animation bekommen, allerdings nur wenn er hochgespringt, wenn er sinkt, dann ist er wieder normal, da muss ich nochmal einen modus machen :/

Code:
modus = "steht"
white = Color.new(255,255,255)
normal = Image.load("normal.png")
springen = Image.load("springen3.png")

x=0
y=220

while true do
pad =  Controls.read()
screen:clear(white)

if pad:up() then
y = y - 1
end

if pad:up() then
mode = "springt"
else
mode = "steht"
end

if mode == "steht" then
screen:blit(x,y,normal)
elseif mode == "springt" then
screen:blit(x,y,springen)
end

if y &lt; 250 then
y = y + 0.750
end

if y &gt; 220 then
y = 220
end

screen.flip()
oldpad = pad
end

mit dem code erreichst du keinen realistischen sprung. was du damit erreichst ist, dass die figur solange nach oben schwebt, bis du die oben taste loslässt...

Neutrosider :
mit dem code erreichst du keinen realistischen sprung. was du damit erreichst ist, dass die figur solange nach oben schwebt, bis du die oben taste loslässt...


das reicht mir auch fürs erste. Ich habe noch Zeit bis ich ein Homebrew mache Wink

Allerdings muss ich noch herausfinden, wie ich meine Figur landen lassen kann, also das dass bild wieder ändert.

Referenz-URLs