KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: Lua- ein paar Anfängerfragen :)
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo
ich habe angefangen Lua zu programmieren.
Jetzt wollte mich mit meinenm ersten Spiel anfangen.

Es soll ein kleines Labyrinth für meinen 4 jährigen Cousin werden.

Es soll in etwa so aussehen:



a=Image.load("Boden.JPG")
b=Image.load("Wand.JPG")
c=Image.load("Ziel.JPG")
Spieler=Image.load("Spieler.JPG")

Spieler_x = 64
Spieler_y = 224
map={
{b,b,b,b,b,b,b,b,b,b,b,b,b,b,b},
{b,a,a,a,a,a,b,b,b,b,b,b,b,b,b},
{b,a,b,b,b,a,b,b,b,b,b,b,b,b,b},
{b,a,b,b,b,a,b,b,b,b,a,a,a,a,b},
{b,a,b,b,b,a,a,a,b,b,a,b,b,a,b},
{b,a,b,b,b,b,b,a,b,b,a,b,b,a,b},
{b,a,b,b,b,b,b,a,a,a,a,b,b,c,b},
{b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}
}

while true do
for c=1,8 do
for d=1,15 do
screen:blit(d*32,c*32,map[c][d],false)
end
end

pad = Controls.read()

dx = pad:analogX()
dy = pad:analogY()

if dx > 30 then
Spieler_x = Spieler_x + (math.abs(pad:analogX())/64)
end
if dx < -30 then
Spieler_x = Spieler_x - (math.abs(pad:analogX())/64)
end
if dy > 30 then
Spieler_y = Spieler_y + (math.abs(pad:analogY())/64)
end
if dy < -30 then
Spieler_y = Spieler_y - (math.abs(pad:analogY())/64)
end

screen:blit(Spieler_x, Spieler_y, Spieler, true)
screen.flip()
screen.waitVblankStart()
end

Meine Fragen:

1. Wieso ist die Map leicht nach rechts unten versetzt?!
2. Wie bekomme ich die Kollison zwischen Spieler und Wand hin?

Danke im vorraus
Lukas


PS: Ziel des Spiels soll es werden, dass man wie in kinderzeitschriften den richtigen weg findne muss Wink
Kann mir denn keiner Helfen? Sad

LG Lukas
Die erste Frage weiß ich nicht, ist aber eigentl. auch egal, oder ?

Zu 2.

Code:
if x = 30 and y = 44 then --Wenn deine Variable (x) auf 30 (Koordinate)  und y auf 44 "berührt", dann


dofile("labyrinth.lua") -- Startet deine z.B. "labyrinth.lua" (dein Spiel) von vorne .


end -- Ende ^^


Ich hoffe, du verstehst es .
Du kannst dir ja, mein Code, zu meinem Maze Game anschauen .
Ist das selbe Prinzip .

^^

Hallo
ich glaube du hast den sinn des Spiels nicht ganz verstanden(nicht böse gemeinst Wink )
Sinn ist es den weg entlangzulaufen und zum Ziel(grün) zu kommen. Später gibt es dann auch abzeigungen, sackgassen,usw.

Das das Bild, nach rechts unten verschoben ist, stört mich schon :/

Zu dem anderen. Kann man es nicht einfach machen:

Wenn Bild a mit bild b kollidiert, dann blablabla ?
Weil so wie du es beschrieben hast, ist es sehr aufwendig :/
Danke im Vorraus
Lukas
setze c und d = 0 und nicht =1, dann ist das bild nicht verschoben
Hallo

du meinst
while true do
for c=0,8 do
for d=0,15 do
screen:blit(d*32,c*32,map[c][d],false)
end
end

Wenn du es so meinst stürzt das Programm ab :/

c und d sind doch auch nur variable oder? weil evtl. könnte es probleme geben, da ich oben c schonmal für Ziel definiert habe :/
Kannst du die Dateien irgendwo hochladen? Dann kann ich dir helfen.
Jop mach ich nachher Wink

LG Lukas

Windows XD :
Hallo

du meinst
while true do
for c=0,8 do
for d=0,15 do
screen:blit(d*32,c*32,map[c][d],false)
end
end

Wenn du es so meinst stürzt das Programm ab :/

c und d sind doch auch nur variable oder? weil evtl. könnte es probleme geben, da ich oben c schonmal für Ziel definiert habe :/

ja so meinte ich das eigentlich. wenn du mit c und d=1 anfängst, dann sieht das erste screen:blit so aus:
screen:blit(32,32,map[1][1],false)
denmach fängt er nicht bei den koordinaten 0 0 an, sondern bei 32 32.

aber ich denke ich habe den fehler gefunden, machs mal so:

Code:
for c=1,8 do
for d=1,15 do
screen:blit((d-1)*32,(c-1)*32,map[c][d],false)
end
end


dann sollte es weder nach rechts verschoben sein, noch abstürzen.

Hallo
1000dank es funktioniert. Das Bild ist nicht mehr verschoben!

Jetzt nochmal zu der Frage mit den Kollisionen.
Ich habe an 2 Möglichkeiten gedacht.

1. Möglichkeit
Wenn bild a mit Bild SPieler zusammenstößt gehts nicht weiter (gibt es wahrscheinlich nicht)

2. Möglichkeit (scheint mir aber sehr kompliziert, geht aber wahrscheinlich nicht anders.)

Ich mache mehrere modi.
Modus 1 Spieler kann in alle richtungen bewegt werden.
Modus 2 Spieler kann sich nur nach oben und unten bewegen
und dann eght das immer so weiter..

Oder gibt es noch eine 3. Möglichkeit?

LG Lukas
Es ist absolut ungestetstet (da ich auch dein programm grade nich da habe (kb es nachzuschreiben), aber rein theoretisch sollte es so klappen:

Code:
sposxa=Spieler_x
sposya=Spieler_y
if dx &gt; 30 then
Spieler_x = Spieler_x + (math.abs(pad:analogX())/64)
end
if dx &lt; -30 then
Spieler_x = Spieler_x - (math.abs(pad:analogX())/64)
end
if dy &gt; 30 then
Spieler_y = Spieler_y + (math.abs(pad:analogY())/64)
end
if dy &lt; -30 then
Spieler_y = Spieler_y - (math.abs(pad:analogY())/64)
end
color1 = screen:pixel(Spieler_x+31, spieler_y+31)
colors1 = color:colors()
color2 = screen:pixel(Spieler_x+31, spieler_y+31)
colors2 = color:colors()
if colors1.r~=0 or colors1.g~=0 or colors1.b~=0 or colors2.r~=0 or colors2.g~=0 or colors2.b~=0 then
    Spieler_x=sposxa
    Spieler_y=sposya
end

Es überprüft einfach ob der Spieler sich komplett auf einem schwarzen Feld befindet. Und wenn das nicht der fall ist wird die Spielerposition auf die vom vorherigen frame zurückgesetzt.

Es ist absolut ungestetstet (da ich auch dein programm grade nich da habe (kb es nachzuschreiben), aber rein theoretisch sollte es so klappen:

Code:
sposxa=Spieler_x
sposya=Spieler_y
if dx &gt; 30 then
Spieler_x = Spieler_x + (math.abs(pad:analogX())/64)
end
if dx &lt; -30 then
Spieler_x = Spieler_x - (math.abs(pad:analogX())/64)
end
if dy &gt; 30 then
Spieler_y = Spieler_y + (math.abs(pad:analogY())/64)
end
if dy &lt; -30 then
Spieler_y = Spieler_y - (math.abs(pad:analogY())/64)
end
color1 = screen:pixel(Spieler_x+31, spieler_y+31)
colors1 = color:colors()
color2 = screen:pixel(Spieler_x+31, spieler_y+31)
colors2 = color:colors()
if colors1.r~=0 or colors1.g~=0 or colors1.b~=0 or colors2.r~=0 or colors2.g~=0 or colors2.b~=0 then
    Spieler_x=sposxa
    Spieler_y=sposya
end

Es überprüft einfach ob der Spieler sich komplett auf einem schwarzen Feld befindet. Und wenn das nicht der fall ist wird die Spielerposition auf die vom vorherigen frame zurückgesetzt.

EDIT: du musst natürlich das &gt; durch > und das &lt; durch < ersetzen.

Vielen dank, für die Mühe, jedoch funktioniert es leider immer noch nicht.

Ich denke, dass es am Aufbau meines Programmms liegt.
Leider habe ich noch nicht genau verstanden, was es mit dem Color1, Colors1, usw auf sich hat.
außerdem verstehe ich folgende Zeilen nicht ganz :
color1 = screenTongueixel(Spieler_x+31, Spieler_y+31)
colors1 = color:colors()
color2 = screenTongueixel(Spieler_x+31, Spieler_y+31)
colors2 = color:colors()
if colors1.r~=0 or colors1.g~=0 or colors1.b~=0 or colors2.r~=0 or colors2.g~=0 or colors2.b~=0 then

ich habe nur verstanden, dass er in der letzten Zeile überprüft, ob der Spieler noch auf dem Schwarzen Feld ist. Wenn nicht wird er zurückgesetzt.

"Scannt" das Programm in dem Codblock davor, auf welcher farbe sich der Spieler befindet, oder wie muss ich mir das Vorstellen?

Hier der Komplette Code:

a=Image.load("Boden.JPG")
b=Image.load("Wand.JPG")
z=Image.load("Ziel.JPG")
Spieler=Image.load("Spieler.JPG")

Spieler_x = 32
Spieler_y = 192
map={
{b,b,b,b,b,b,b,b,b,b,b,b,b,b,b},
{b,a,a,a,a,a,b,b,b,b,b,b,b,b,b},
{b,a,b,b,b,a,b,b,b,b,b,b,b,b,b},
{b,a,b,b,b,a,b,b,b,b,a,a,a,a,b},
{b,a,b,b,b,a,a,a,b,b,a,b,b,a,b},
{b,a,b,b,b,b,b,a,b,b,a,b,b,a,b},
{b,a,b,b,b,b,b,a,a,a,a,b,b,z,b},
{b,b,b,b,b,b,b,b,b,b,b,b,b,b,b}
}

while true do
for c=1,8 do
for d=1,15 do
screen:blit((d-1)*32,(c-1)*32,map[c][d],false)
end
end

pad = Controls.read()

dx = pad:analogX()
dy = pad:analogY()

sposxa=Spieler_x
sposya=Spieler_y
if dx > 30 then
Spieler_x = Spieler_x + (math.abs(pad:analogX())/64)
end
if dx < -30 then
Spieler_x = Spieler_x - (math.abs(pad:analogX())/64)
end
if dy > 30 then
Spieler_y = Spieler_y + (math.abs(pad:analogY())/64)
end
if dy < -30 then
Spieler_y = Spieler_y - (math.abs(pad:analogY())/64)
end
color1 = screenTongueixel(Spieler_x+31, Spieler_y+31)
colors1 = color:colors()
color2 = screenTongueixel(Spieler_x+31, Spieler_y+31)
colors2 = color:colors()
if colors1.r~=0 or colors1.g~=0 or colors1.b~=0 or colors2.r~=0 or colors2.g~=0 or colors2.b~=0 then
Spieler_x=sposxa
Spieler_y=sposya
end
screen:blit(Spieler_x, Spieler_y, Spieler, true)
screen.flip()
screen.waitVblankStart()
end


Danke im Vorraus

Lukas
oh mist, da ist noch ein fehler. ich werde das ganze mal eben testen udn zum laufen bringen, ich schätze in ner viertel stunde oder so läufts.
Ok Danke!!

Sag mir dann noch pls wo der Fehler war.

Lass dir Zeit Wink
Ich gehe jetzt eh schlafen und guck mir das ganze morgen ausgeschlafen an Smile

Gute Nacht

Lukas
Seiten: 1 2 3
Referenz-URLs