KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: Lua, warten und springen
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi, heute hab ich gleich 2 Fragen:

1: Gibt es in Lua eine möglichkeit zu warten also "tue das, dann warte
2 sekunden, dann tue das" <-- jaaaa... so ungefähr halt Big Grin

2: Wie könnte mann in einem kleinem 2d spiel (super-mario sicht) einem charackter das springen beibringen? also das der typ sich hoch und wieder runter bewegt. wenn ich dass so ungefähr mache:

Code:
if pad:up() then
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
end


hab auch andere sachcen durchprobiert, nix hat geklappt Sad

und jetzt bitte ich um hilfe xD

~Manu

zum erstem: Was hatte er gemacht und wann soll er denn warten?

Zum zweitem: probiere ich später wenn ich Zeit haben sollte
Zum ersten:
für alle möglichen sachen z.b diese hier:

Code:
function ccz(object)
if (Player.x + 16 &gt; object.x) and (Player.x &lt; object.x + 16) and (Player.y + 16 &gt; object.y) and (Player.y &lt; object.y + 16) then
screen:fontPrint(fonta,210,136,"Sieg",white)
--warte 5 sekunden--
--starte das spiel neu--
end
end


also wenn der spieler so einigermaßen "im block drinne ist" soll das programm das spiel neustarten.

zum zweiten: ok danke Big Grin

Code:
if pad:up() then
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y - 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
Player.y = Player.y + 1
end


Wenn Sie das so machen wird das nie was, Sie verniedrigst und erhöhen den Wert ja nur im selben moment, bevor es der Player überhaupt auffassen kann.
Versuchen Sie vielleicht einen Umweg zu machen zum Beispiel:

(ich kann kein Lua also wird wahrscheinlich auch was falsch geschrieben sein ^^)

Code:
if pad:up() and playerJump &lt; 1 then
   playerJump = 1
end

if playerJump == 1 then
   Player.y = Player.y - 1
   if Player.y == 10 then
      playerJump = 2
   end
end
if playerJump == 2 then
   Player.y = Player.y + 1
   if Player.y == 20 then
      playerJump = 0
   end
end

Bild ausgabe...

(&lt; ist gleich < wird nur von der Codebox anders dargestellt)

Also so ungefähr, denken Sie sich einfach einen Umweg

Spoiler: (anzeigen)
wie dark-awesome schon schön sagt, darfst du nicht alle rechenschritte in einer sekunde ausführen lassen:

dark-awesome :
Code:
if pad:up() then
playerJump = 1
end

if playerJump == 1 then
Player.y = Player.y - 1
if Player.y == 10 then
playerJump = 2
end
end
if playerJump == 2 then
Player.y = Player.y + 1
if Player.y == 20 then
playerJump = 0
end
end

Bild ausgabe...


ich persöhnlich würde aber, wenns wie bei mario sein soll, auch nur einmal abspringen:


if pad:up() and Player.y == 272 then
Player.yspeed = Player.yspeed + 5
end
Player.y = Player.y - Player.yspeed
if Player.y > 272 then
Player.y = 272
end
if Player.y < 272 then
Player.yspeed = Player.yspeed - 0.03
end




Ich hab einfach mal 272 als unterste grenze genommen, kannst du ja abwandeln. Außerdem hab ich eine weitere Variable hinzugefügt, die für die Geschwindigkeit auf der y-achse zuständig ist.


Und wenn du den Bildschirm warten lassen willst, benutz

screen.waitVblankStart()

die zahl in der Klammer gibt die anzahl der miisekunden, die gewartet werden soll, an. Bei 5 sekunden wären das 5000 milisekunden:

screen.waitVblankStart(5000)

duLouser :
ich persöhnlich würde aber, wenns wie bei mario sein soll, auch nur einmal abspringen:


if pad:up() and Player.y == 272 then
Player.yspeed = Player.yspeed + 5
end
Player.y = Player.y - Player.yspeed
if Player.y > 272 then
Player.y = 272
end
if Player.y < 272 then
Player.yspeed = Player.yspeed - 0.03
end


Am besten nehmen Sie diese Methode, meine sollte eher als Denkanstoß wirken und war eher schnell getipp, weil ich essen musste ^^

Edit:
Mein Lösungsvorschlag ist eher zum genauen Springen. Der sprung wird immer die selbe höhe haben und immer die selbe Dauer.

Jo, danke, klingt gut, ich werde es gleich ausprobieren.

aber eine frage, wenn mann den befehl "scren.waitVblankStart()"
benutzt müsste ja der bildschrim warten, also dass in der zeit überhaupt garnichts mehr passiert/gemachtwerden kann. oder irre ich mich.

aber trotzdem danke, ich werde es probieren, wen ishc probleme ergeben melde ich mich nocheinemal.
Ok, habs mit beidem mal ausprobiert, mit dem ersten hats wie gesagt zwar funktioniert, aber wenn der spieler mal auf einer anderen höhe seien solte funktioniert dies natürlich nicht mehr.
aber trotzdem danke Big Grin

zum zweiten, gibt es wenig zu sagen: er funkitoniert nicht.

ich habe ihn ein bisschen abgeändert dass er dann so aussah:

Code:
Player.yspeed = 0
if pad:up() and Player.y == 235 then
Player.yspeed = Player.yspeed + 5
end
Player.y = Player.y - Player.yspeed
if Player.y &gt; 235 then
Player.y = 235
end
if Player.y &lt; 235 then
Player.yspeed = Player.yspeed - 0.03
end
end


ich habe nur die zahlen etwas geändert also, die ganzen 272'iger in 235'iger umgewandelt und oben den string

Code:
Player.yspeed = 0


hingesetzt, ohne den startete das spiel garnicht. aber nun bewegt sich wenn ich oben drücke der spieler nur um 5y hoch und bleibt dort stehen?!?! ich kapier es nicht mehr, und für mich sieht der code ja auch richtig aus!

habst du/ihr noch ideen? Noidea

luaprogrammer :
Ok, habs mit beidem mal ausprobiert, mit dem ersten hats wie gesagt zwar funktioniert, aber wenn der spieler mal auf einer anderen höhe seien solte funktioniert dies natürlich nicht mehr.
aber trotzdem danke Big Grin


Höhen können Sie ja nach belieben ändern.
Einfacher Denkanstoß: Man macht eine Grundhöhe die ist immer die höhe des Spielers somit sollte man immer gleich hoch springen. Der rest hängt von den gemachten Colisionen ab.

Beispiel:
grundhoehe = player.y

Wenn Sie es damit nicht hinbekommen werde ich nachher mal ein Beispiel machen. Ich muss jetzt aber noch sehr viel erledigen.

Edit:
Sie sollten auch noch eine allgemeine Gravitation machen.
Beispiel:
gravitation = 5
player.y = player.y - gravitation


Dies ist dafür da, falls der Player mal von einer hohen Position zu einer niedrigeren springen soll. Der Rest wird wie gesagt durch die Kollisionen geregelt.

ok, danke Big Grin
Ich bin mir nicht sicher aber für springen brauchst du glaube ich die gravitation Formel....

oder so ähnlich ich hab davon nicht viel Ahnung Big Grin


Quelle: http://de.wikipedia.org/wiki/Gravitationskonstante
:D klaaar =)

verlange aber kein danke von mir Tongue

Big Grin
sieh dir mal diesen Code auf Evilmana an.
Versuche ihn zu verstehen und ihn so umzuändern, dass er zu deinem Code passt Smile

secret :
Ich bin mir nicht sicher aber für springen brauchst du glaube ich die gravitation Formel....

oder so ähnlich ich hab davon nicht viel Ahnung Big Grin


Quelle: http://de.wikipedia.org/wiki/Gravitationskonstante


Die Gravitationskonstate wird benutzt um die anziehungskraft zwischen zwei Punktförmigen massen zu berechnen (z.b. die zwischen 2 planeten)

Wenn er Physikalisch korrekt da ran gehen will, sollte we viel mehr nur mit der Erdgravitation (etwa 9,81 m/s²) arbeiten. nenn wir sie mal sinngemäß a (a für acceleration -> Beschleunigung)

jetzt brauch er nurnoch beim sprung einmal den vy-wert auf z.b. -3 m/s setzten (hier muss er testen bei welchem wert die sprunghöhe am besten fürs gameplay ist)

und jetzt in der hauptschleife einfach immer diesen code ausführen:

Code:
Player.y = Player.y + Player.vy
Player.vy = Player.vy + g



im gesamten sähe das dann so aus:

Code:
a = 2 //Das ist die stärke der gravitation im spiel, 9,81 dürfte dafürs gameplay zu stark sein, musste ausprobieren welcher wert gut ist
vs = -4 //das ist die Geschwindigkeit auf die der player beim sprung gesetzt wird. je weiter die zahl ins negative geht, desto höher der Sprung

while true do //halt die normale haupt-schleife

... //hier halt irgend ein code von dir

if pad:up() then //hier wird der sprung gestartet
Player.vy = vs //indem die y-geschwindigkeit auf dei vorher festgelegte "sprungstärke" gesetzt wird
end


if Player.y &lt; 235 or Player.y == 235 and Player.vy ~= 0 Then //überprüfen ob der player grade springt
Player.y = Player.y + Player.vy //spieler bewegt sich nach oben bzw. ab der sprunghälfte nach unten
Player.vy = Player.vy + a //hier passiert die magie, denn die geschwindigkeit wird mit der gravitationsbeschleunigung angepasst, so dass es aussieht wie ein echter sprung
else //wenn der spieler nicht im sprung ist, dann ...
Player.y = 235 //... soll er auf der höhe 235 sein
Player.vy = 0 //und nicht beschleunigt sein
end

... //hier weiterer code von dir, inklusive dem code fürs anzeigen vom player

end //ende der hauptschleife


und für die lesbarkeit nochmal, aber ohne kommentare:

Code:
a = 2
vs = -4

while true do

...

if pad:up() then
Player.vy = vs
end

if Player.y &lt; 235 or Player.y == 235 and Player.vy ~= 0 Then
Player.y = Player.y + Player.vy
Player.vy = Player.vy + a
else
Player.y = 235
Player.vy = 0
end

...

end


der code ist komplett ungetestet, aber mit etwas glück habe ich keine fehler reingebaut, wenn doch, ist er am ehesten in der if bedingung zu suchen, in der geprüft wird ob der player grade springt

o.O ok danke! und eismal wirklich Big Grin

mal gucken ob der funktioniert, der von evilmana hat nur halb funktioniert, er hatte ein paar... bugs Big Grin
Seiten: 1 2
Referenz-URLs