erstes spiel - erste probleme
Übersicht

SerdonBetreff: erstes spiel - erste probleme |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi
Nach längerem "Training" habe ich gestern damit begonnen mein erstes richtiges "Spiel" zu schreiben. Im Klartext: Zwei Rechtecke, zwei Spieler, Ein kleines Spielfeld. Meine erste Idee dazu: Wer mit seinem Rechteck (ich hab kein Code: [AUSKLAPPEN] Cls hingeschrieben wodurch die Rechtecke bahnen ziehen) das des anderen oder seine Bahn oder die des anderen berührt, verliert.
Meine Fragen: 1. Warum erscheint das zweite Rechteck (das untere) nicht? 2. Wie mache ich, dass man z.B. nicht durch Bilder oder linien einfach hindurchfährt? (bitte seeeeeeeeehr ausführliche/anschauliche Beschreibung) 3. Wie kann ich feststellen ob sich die Rechtecke berühren? 4. Fehler in meinem Code? ich wette da gibts ne ganze menge... Danke schonmal im vorraus. (Sind zwar sehr viele Fragen, aber glaubt mir Leute: Bevor ich hier um hilfe gerufen habe, hab ich erst ein ganzes Buch über Basic geschmökert und versuch es selbst zu lösen) Code: [AUSKLAPPEN] AppTitle "Rect"
Graphics 640,480 SetBuffer BackBuffer() X = 320 Y = 240 Repeat ;Cls Line 0,50,640,50 bild = LoadImage("Unbenannt.bmp") DrawImage bild, 100,100 ClsColor 0,255,0 Oval X,Y,3,3 Flip If KeyDown(200) = 1 Then Y = Y - 1 If KeyDown(208) = 1 Then Y = Y + 1 If KeyDown(203) = 1 Then X = X - 1 If KeyDown(205) = 1 Then X = X + 1 If X < 0 Then X = 0 If X > 630 Then X = 630 If Y < 50 Then Y = 50 If Y > 470 Then Y = 470 ; For I=1 To 100 ; If Rect <> 0 Then ; For J=1 To 5 ; If ImagesOverlap(bild,Rect) Then ; DrawImage bild 200,200 ; EndIf ;Next ;EndIf ;Next Until KeyDown(1) = 1 Color 34,25,55 X = 200 Y = 220 Repeat Cls Color 25,55,45 Rect X,Y,3,3 Flip If KeyDown(200) = 1 Then Y = Y - 1 If KeyDown(208) = 1 Then Y = Y + 1 If KeyDown(203) = 1 Then X = X - 1 If KeyDown(205) = 1 Then X = X + 1 If X < 0 Then X = 0 If X > 630 Then X = 360 If Y < 50 Then Y = 50 If Y > 470 Then Y = 470 Until KeyDown(1) = 1 |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal: Ich finde es gut, dass du dir ein übersichtliches Ziel gewählt hast, und jedes Problem versucht hast, selbstständig zu lösen. Mach weiter so, und du wirst rasch besser werden, nicht zuletzt, weil dir eher geholfen werden wird.
1. Kann es sein, dass du zwei Mainloops hast? 2. Zitat: Code: [AUSKLAPPEN]
bild = LoadImage("Unbenannt.bmp") NIEMALS Dinge in der Haupschleife laden! Das Verschwendet nur Zeit (zum Laden) und Resourcen (da das Bild nicht aus dem Speicher gelöscht wird), und das nicht zu wenig. Zitat: 2. Wie mache ich, dass man z.B. nicht durch Bilder oder linien einfach hindurchfährt? (bitte seeeeeeeeehr ausführliche/anschauliche Beschreibung)
Bei der Kollsion von Rechteck / Bild gibt es die Funktion ImageRectCollide ![]() Die Kollision Recteck / Linie ist recht komplex. Es gibt hier verschiedene Möglichkeiten, entweder, man schaut, ob der Rand des Rechtecks (also 4 Linien) mit der Linie kollidieren, oder ob alle Eckpunkte des Rechtecks auf der gleichen Seite der Linie sind. Mathematisch läuft das wohl auf eine lineare Gleichung (oder Ungleichung) hinaus. Als "Schummel"-Alternative besteht die Möglichkeit, sämtliche Punkte der Linie durchzugehen (pixelweise) und die auf Kollision mit dem Rechteck überprüfen. Ein Punkt ist in einem Rechteck, wenn
(mir ist schon klar, dass das deinen Hoffnungen nicht gerecht wird, aber es ist ein Anstoß). Du sparst dir viel Ärger, wenn du Cls drinlässt und die Bahn jedes Mal neu reinmalst (z.B. mit Type ![]() Das ist erstmal das Gröbste. ZEVS |
||
![]() |
Propellator |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Du hast 2 Hauptschleifen. Du musst beide Rechtecke in einer zeichnen
2. und 3. gehören zusammen, siehe RectsOverlap ![]() 4. Du lädst das Bild in der Schleife. |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
Serdon |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gut. Das mit der Kollision bau ich gleich ein. Aber wenn ich jetzt beides in eine Schleife gepackt habe, wieso sehe ich dann das 2te Rect, aber ich kann es nicht bewegen?
Code: [AUSKLAPPEN] AppTitle "Rect"
Graphics 640,480 SetBuffer BackBuffer() X = 320 Y = 240 Repeat ClsColor 0,255,0 Rect X,Y,3,3 Flip If KeyDown(200) = 1 Then Y = Y - 1 If KeyDown(208) = 1 Then Y = Y + 1 If KeyDown(203) = 1 Then X = X - 1 If KeyDown(205) = 1 Then X = X + 1 If X < 0 Then X = 0 If X > 630 Then X = 630 If Y < 50 Then Y = 50 If Y > 470 Then Y = 470 ; For I=1 To 100 ; If Rect <> 0 Then ; For J=1 To 5 ; If ImagesOverlap(bild,Rect) Then ; DrawImage bild 200,200 ; EndIf ;Next ;EndIf ;Next A = 200 B = 220 ClsColor 23,25,27 Rect A,B,3,3 Flip If KeyDown(119) = 1 Then B = B - 1 If KeyDown(208) = 1 Then B = B + 1 If KeyDown(203) = 1 Then A = A - 1 If KeyDown(205) = 1 Then A = A + 1 If A < 0 Then A = 0 If A > 630 Then A = 360 If B < 50 Then B = 50 If B > 470 Then B = 470 Until KeyDown(1) = 1 |
||
![]() |
Propellator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du führst zwei mal Flip pro Schleifendurchlauf aus, das ist eines der Probleme. Ausserdem setzt du einfach nur ClsColor immer wieder neu, ohne Cls auszuführen
Das andere ist, dass KeyDown und KeyHit im prinzip nur ein mal aufrufen kannst, bevor der Tastaturpuffer aktualisiert wurde. Versuche also die Werte in Variablen zu speichern. |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erst alles zeichnen, dann Flip![]() ![]() Ich vermute, Du wendest ClsColor ![]() ![]() ![]() |
||
Starfare: Worklog, Website (download) |
Serdon |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für eure engaierte Hilfe!!!
Ich habe es mal wie in der Hilfefunktion beschrieben aufgebaut aber das zweite Rect bewegt sich immernochnicht!!! Code: [AUSKLAPPEN] AppTitle "Rect"
Graphics 640,480 SetBuffer BackBuffer() X = 320 Y = 240 A = 200 B = 220 ;bild = LoadImage(setup.bmp) ;DrawImage bild 100,100 ClsColor 255,255,255 Cls Repeat While KeyDown(1) = 0 Color 0,255,76 Rect X,Y,3,3 Flip If KeyDown(200) = 1 Then Y = Y - 1 If KeyDown(208) = 1 Then Y = Y + 1 If KeyDown(203) = 1 Then X = X - 1 If KeyDown(205) = 1 Then X = X + 1 If X < 0 Then X = 0 If X > 630 Then X = 630 If Y < 50 Then Y = 50 If Y > 470 Then Y = 470 ; For I=1 To 100 ; If Rect <> 0 Then ; For J=1 To 5 ; If ImagesOverlap(bild,Rect) Then ; DrawImage bild 200,200 ; EndIf ;Next ;EndIf ;Next A = 200 B = 220 Color 0,0,255 Rect A,B,3,3 Flip If KeyDown(119) = 1 Then B = B - 1 If KeyDown(208) = 1 Then B = B + 1 If KeyDown(203) = 1 Then A = A - 1 If KeyDown(205) = 1 Then A = A + 1 If A < 0 Then A = 0 If A > 630 Then A = 630 If B < 50 Then B = 50 If B > 470 Then B = 470 Wend Until KeyDown(1) = 1 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du benutzt immernoch 2 Mal Flip. Du zeichest was und versteckst es sofort... Eine Hauptschleife sollte so in der Art aussehen:
BlitzBasic: [AUSKLAPPEN] Local timer = CreateTimer(60) |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es bringt nichts, eine While-Schleife in eine Repeat-Schleife zu tun, wenn beide dieselbe Abbruchbedingung haben. Die Hinweise von Propellator und ZaP hast du dagegen vorbildlich ignoriert! Tu ein Flip![]() ![]() ZEVS |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du die beiden Rechtecke unterschiedlich bewegen willst, muss du auch unterschiedliche Tasten benutzen.
Wie oben für das Erste und zum Beispiel die Tasten WASD für das Zweite |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zunächst musst Du Dir darüber im Klaren sein, wer oder wie eigentlich das zweite Rechteck bewegt werden soll:
Soll ein zweiter Spieler das Rechteck steuern können, dann verwende für diesen Spieler andere Tasten (so wie es Skey-Z dir schon rät). Jede Taste auf dem Keyboard hat einen eigenen Scan-Code. Du verwendest in deinem Programm schon 200, 208, 205 und 203, das sind die Cursor-Tasten. Ein zweiter Spieler sollte natürlich andere Tasten benutzen können. Du findest Du alle Scan-Codes der weiteren Tasten in BlitzBasic mit <F1> und dann links auf Scancodes klicken: Soll der Computer die zweite Schlange von alleine steuern, so musst Du zu dem Werten A und B in jedem Durchlauf etwas dazuzählen oder abziehen und nicht von einem KeyDown() abhängig machen. Zusätzlich wären noch weitere Veränderungen notwendig. Bei Deinem Code reagieren momentan beide Schlangen auf die selben Cursor-Tasten. Der Grund warum die 2. Schlange sich dennoch nicht bewegt, liegt darin, dass Du innerhalb der Schleife den Wert für und A und B immer wieder zurücksetzt: BlitzBasic: [AUSKLAPPEN]
Enferne diese beiden Zeilen, und beide Schlangen folgen den Cursor-Tasten: BlitzBasic: [AUSKLAPPEN]
Dann wird Dir auffallen, dass die 2.Schlange nicht korrekt mitgeht. Dies liegt an dieser Zeile: BlitzBasic: [AUSKLAPPEN] If KeyDown(119) = 1 Then B = B - 1der Scan-Code 119 ist kein Scan-Code der Cursor-Tasten. Für X/Y hattest Du weiter oben 200 verwendet (Tippfehler?) Schreib uns doch mal, womit Du die 2.Schlange bewegen möchtest. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde dir dann noch zur deutschsprachigen Hilfe raten, welche Du hier im Portal in der Sektion Hilfe zum Download findest. Diese lässt sich wie die Originale mit F1 aufrufen, ist aber deutlich detaillierter. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group