erstes spiel - erste probleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Serdon

Betreff: erstes spiel - erste probleme

BeitragFr, Jan 20, 2012 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 20, 2012 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Da muss ich wohl nicht viel sagen.
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
  • Sein X-Wert größer als der des Rechtecks ist
  • Sein Y-Wert größer als der des Rechtecks ist
  • Sein X-Wert kleiner als der des Rechtecks plus die Rechteckbreite ist
  • Sein Y-Wert kleiner als der des Rechtecks plus die Rechteckhöhe ist

(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 Types; siehe hier).

Das ist erstmal das Gröbste.

ZEVS

Propellator

BeitragFr, Jan 20, 2012 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 20, 2012 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 20, 2012 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 20, 2012 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst alles zeichnen, dann Flippen Wink
Ich vermute, Du wendest ClsColor falsch an, so wie es da im Moment steht, ist kein Effekt dabei. Der Befehl ändert die Farbe, wenn Cls ausgeführt wird. Wenn Du Rechtecke, Linien, Kreise, etc. farbig zeichnen möchtest, musst Du Color benutzen.
Starfare: Worklog, Website (download)
 

Serdon

BeitragFr, Jan 20, 2012 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragFr, Jan 20, 2012 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
Repeat
Cls

;[Alles andere]

Flip(0)
WaitTimer(timer)
Forever
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ZEVS

BeitragFr, Jan 20, 2012 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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 raus, und wende KeyDown nur einmal in der Schleife an (Ergebnis in einer Variablen speichern).

ZEVS

skey-z

BeitragFr, Jan 20, 2012 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

Midimaster

BeitragSa, Jan 21, 2012 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
user posted image


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]

......
While KeyDown(1) = 0
Color 0,255,76
Rect X,Y,3,3
.....

.....
A = 200
B = 220
Color 0,0,255
Rect A,B,3,3
......


Enferne diese beiden Zeilen, und beide Schlangen folgen den Cursor-Tasten:
BlitzBasic: [AUSKLAPPEN]

......
While KeyDown(1) = 0
Color 0,255,76
Rect X,Y,3,3
.....

.....
;A = 200
;B = 220
Color 0,0,255
Rect A,B,3,3
......


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 - 1
der 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

BladeRunner

Moderator

BeitragSa, Jan 21, 2012 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group