Seite 2 von 5

Verfasst: 27.03.2009 20:45
von Bisonte
Also ihr hantiert ja mit einem Screen herum.

Dort bietet es sich doch geradezu an, mit Sprites zu basteln.
Um bei den Boxen zu bleiben :

Code: Alles auswählen

 Player = Createsprite(#PB_Any,32,32)
StartDrawing(SpriteOutput(Player))
Box(0,0,32,32,$009900)
StopDrawing()
Wenn man dann die Figuren auf dem Screen bewegt, läßt sich eine
Kollision recht einfach mit SpriteCollision() ermitteln.

Verfasst: 27.03.2009 20:47
von Kaeru Gaman
TeamBaba hat geschrieben:Ja wir haben schon runtergeschraubt, wir wollen einfach so ein Ding wie ein Labyrinth machen.

Das die Figur unten Beginnt (2D) und nach oben läuft und dann ende ?
Müsste man doch nur ein paar Boxen einfügen(Muss ja nicht so verwinkelt sein) und diese dann undurchlässig machen ?

:allright: :allright: :allright:
schaut euch mal ein beispiel zur Tile-Engine an:
http://www.purebasic.fr/german/viewtopi ... 634#116634
auf der Basis kann man jedes beliebige Labyrinth umsetzen.

Verfasst: 27.03.2009 21:16
von TeamBaba

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Game")
Global Ballx
Global Bally
Global Bewegung
Ballx=20
BallY=430
BewegungX=0
BewegungY=0
Repeat
ClearScreen(0+256*0+256*256*0)
StartDrawing(ScreenOutput())
FrontColor(255+256*255+256*256*255)
Box(Ballx-1,Bally-5,30,30)
Box (0,470,640,10,$009900)
Box (0,0,10,480,$009900)
Box (80,390,560,10,$663300)
Box (560,310,-550,10,$663300)
Box (10,240,300,10,$663300)
Box (350,240,290,10,$663300)
Box (10,140,580,10,$663300)
Box (80,80,560,10,$663300)
Box (280,0,-270,10,$663300)
Box (340,0,300,10,$663300)
StopDrawing()
FlipBuffers()
Ballx+BewegungX
Bally+BewegungY
ExamineKeyboard ()
If KeyboardPushed (208)
Ballx+0
Bally+2
EndIf
If KeyboardPushed (200)
Ballx+0
Bally-2
EndIf
If KeyboardPushed (205)
Ballx+2
Bally+0
EndIf
If KeyboardPushed (203)
Ballx-2
bally+0
EndIf
Until BallX>640 Or BallX<0 Or BallY<0 Or BallY>480 Or KeyboardPushed (1)
Ist ganz einfach und sieht auch dem entsprechend aus. Wir sind alles Totale anfänger und bitten um verbesserung, die währe das man nicht durch die Boxen kann. Mehr auch nicht. Hoffe jemand weiß wie das geht :D

Bild

Das Weiße ist die Spielfigur und das Blaue die Boxen.

Verfasst: 27.03.2009 21:40
von Kaeru Gaman
also, in diesem fall wäre das einfachste,
mit der Funktion Point() die Farbwerte neben eurer player-box abzufragen,
nachdem die wände-boxen gemalt wurden.

wenn der farbwert den wänden entspricht, darf sich der player nicht in die betreffende richtung bewegen.

und grundsätzlich:
- verwendet besser die Konstanten für die Tastenwerte, das läßt sich besser lesen.
- code einrücken, das ist übersichtlicher.

Verfasst: 27.03.2009 22:01
von TeamBaba
Könntest du das mit den Points
vielleicht mit einem Beispiel bzw. bei unserem.
Weil ich weiß nicht wie ich das Anstellen soll

Verfasst: 27.03.2009 22:18
von Kaeru Gaman
eure PlayerBox zeichnet ihr bei
Box(Ballx-1,Bally-5,30,30)
... was übrigens ziemlich krumm ist, nehmt besser entweder
Box(Ballx-15,Bally-15,30,30)
dann ist der punkt (Ballx,Bally) die mitte der Box, oder ganz simpel einfach
Box(Ballx,Bally,30,30)
dann ist der punkt (Ballx,Bally) die obere linke ecke, wie bei fast allen objekten.

also, gehen wir mal von Box(Ballx,Bally,30,30)
dann könnte ihr vier punkte checken:
PunktLO = Point( Ballx - 1, Bally - 1 )
PunktRO = Point( Ballx + 30, Bally - 1 )
PunktLU = Point( Ballx - 1, Bally + 30 )
PunktRU = Point( Ballx + 30, Bally + 30 )

schaut die Funktion Point() mal in der Help nach.

diese vier Punkte liegen außerhalb der BallBox an den vier Ecken.

jetzt dürft ihr die Bewegung nach oben nur dann zulassen,
wenn LO und RO frei sind, also die Hintergrundfarbe haben.
nach links nur, wenn LO und LU frei sind,
nach rechts nur, wenn RO und RU frei sind,
nach unten nur, wenn LU und RU frei sind.

.... und ich merke grad, währens ich das schreibe,
dass sich die BallBox dann seitwärts über die Wände bewegen könnte,
weil die BallBox breiter als die Wände ist.

umgekehrt wäre das sicher, also macht die Wände besser 24 dick und die Box nur 16x16 groß, dann funktioniert dieser Ansatz.

Verfasst: 27.03.2009 22:25
von TeamBaba
ok langsam wird es mir klar, aber noch eine Frage hoffentlich die letzte-
Also ich definiere die Points -> ist soweit klar
Aber was für eine If schleife währe dann am besten(Beispiel) und wo soll ich alles in den quellcode da oben einfügen? -> habe gerade echt kP

Verfasst: 27.03.2009 22:40
von Kaeru Gaman
If ist keine Schleife, sondern eine Bedingung. :mrgreen:

erstmal, definiert euch mal lesbar die Hintergrundfarbe.

statt 0+256*0+256*256*0 kann man auch schlich und einfach $000000 schreiben, das ist ebenso ausführlich und besser lesbar.
manche würden jetzt sagen, warum nicht einfach 0,
aber ich schreibe Farben grundsätzlich als sechsstellige Hexadezimals.

übrigens müsst ihr euch auf nem screen nicht an die 216 webfarben halten, ihr könnt alle möglichen 16Mio hinschreiben.

definiert euch am anfang ein paar konstanten:

Code: Alles auswählen

#Farbe_Hintergrund = $0C0603
#Farbe_BallBox     = $FFCC33
#Farbe_Waende      = $663300
#Farbe_Aussen      = $009900
dann könnt ihr auch ganz einfach die Farben mal ändern.

freimachen mit ClearScreen(#Farbe_Hintergrund), und die Farbe der BallBox auch direkt beim darstellen dort angeben,
spart euch das FrontColor wenn ihrs eh nur 1mal benutzen würdet.
Box (Ballx, Bally, 16, 16, #Farbe_BallBox)

den außenrand auch rechts und unten hinmachen....

so jetzt endlich mal zu der Bewegung und Nichtbewegung.
ihr habt bisher

Code: Alles auswählen

If KeyboardPushed (#PB_Key_Down)
  Bally+2
EndIf 
in's selbe If kann auch der check ob's geht:

Code: Alles auswählen

If KeyboardPushed (#PB_Key_Down)
  If PunktLU = #Farbe_Hintergrund And PunktRU = #Farbe_Hintergrund
    Bally+2
  EndIf
EndIf
also, wenn die taste gedrückt wird, checkt ihr, ob die beiden Punkte in Hintergrundfarbe sind,
dann ist da keine Wand, dann kann die BallBox bewegt werden.

PS:

und btw.... du "definierst" die Points nicht,
du fragst die FarbWerte in der Grafik ab und speicherst sie in den Variablen.
diese vier Abfragen müssen immer und immer wieder gemacht werden,
direkt nach dem darstellen der Wände, im selben Start/Stop-Drawing.

Verfasst: 28.03.2009 03:40
von TeamBaba
Das mit den Points klappt momentan nur mit der Break-Bedingung. Dann bricht er immer ab wenn man Berührt. Gibt es da auch irgendwas das er dann wieder von vorne beginnt.

PROBLEME:
1. Bei Berühren der Wände zurück zum Anfang
2. Sprites lassen sich nicht einfügen (weiß nur wie man Bilder in ein Window einfügt aber nicht bei einem Screen)
(3. Wenn man am Ziel ist soll es zu einem Neuen Level weiterleiten)
(4. Menü erstellen also mit Start und Exit erstmal )

Also der 1. und 2. Punkt sind mir momentan sehr wichtig .

Verfasst: 28.03.2009 10:24
von ZeHa
1. Die einfachste Lösung bei eurem Code wäre eine zweite Repeat-Schleife, die sich um die erste legt (am besten mal mit Einrückungen arbeiten, dann siehst Du besser, was abgeht). Wenn aus der inneren rausgebreakt wird (was ja bei euch scheinbar schon funktioniert), dann fängt er automatisch wieder von vorn an.

2. LoadSprite() und dann DisplaySprite() (oder DisplayTransparentSprite()), einfach mal in der Hilfe schauen. Soweit ich es jetzt grad im Kopf hab müssen Sprite-Befehle immer außerhalb von StartDrawing() und StopDrawing() liegen.

3. Das kannst Du dann wie bei 1) machen, nur daß Du am besten vor jedem Break noch eine Art "Status-Code" speicherst. Zum Beispiel beim Berühren einer Wand den Code 1 (dafür am besten eine Konstante definieren) und beim Berühren des Exit den Code 2. Nun kannst Du in der äußeren Repeat-Schleife einfach schauen, welchen Wert der Code hat, und wenn der Code = 2 ist, wechselst Du einfach ins nächste Level, und ansonsten geht's wieder von vorne los.