Hilfe beim Spiel

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
TeamBaba
Beiträge: 19
Registriert: 26.03.2009 09:46

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
TeamBaba
Beiträge: 19
Registriert: 26.03.2009 09:46

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
TeamBaba
Beiträge: 19
Registriert: 26.03.2009 09:46

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
TeamBaba
Beiträge: 19
Registriert: 26.03.2009 09:46

Beitrag 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 .
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten