[B2D] Raumschiff-Steuerung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Spikespine

Betreff: [B2D] Raumschiff-Steuerung

BeitragSa, Jun 11, 2005 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
wegen eines Threads im Beginner-Forum habe ich mal eine Raumschiffsteuerung wie in "Asteroids" programmiert.
Natürlich nichts besonderes, aber ich habe keinen vergleichbaren Code hier gefunden...

Die Funktionsweise des Codes wird für Newbies weiter unten erklärt.

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

;KONSTANTEN
Const BESCHLEUNIGUNG# = 0.05 ;klar
Const BREMSSPEED# = 0.05;auch klar
Const LENKSPEED# = 2 ;auch klar


;BILDER ERSTELLEN:

TFormFilter 0 ;aa ausschalten (+speed)


Dim image(89) ;Bild-Array erstellen mit 89 einträgen


image(0) = CreateImage(30,30) ;das erste bild wird von Hand gezeichnet...
SetBuffer ImageBuffer(image(0))

Rect 10,0,10,30
Rect 0,20,30,10
MidHandle image(w)

For w = 1 To 89 ;...die anderen werden davon...
image(w) = CopyImage(image(0)) ;...kopiert...
MidHandle image(w) ;...ge-midhandled...
RotateImage image(w),w*4 ;...und gedreht
Next




SetBuffer BackBuffer() ;sollte klar sein

;startposition
x#=400
y#=300

Repeat

Cls

If KeyDown(200) Then
xspeed# = xspeed# + Sin(objektwinkel)*beschleunigung
yspeed# = yspeed# - Cos(objektwinkel)*beschleunigung
ElseIf KeyDown(208) Then
xspeed# = xspeed# - Sin(objektwinkel)*bremsspeed
yspeed# = yspeed# + Cos(objektwinkel)*bremsspeed
EndIf

If KeyDown(203) Then
objektwinkel = objektwinkel - lenkspeed
ElseIf KeyDown(205) Then
objektwinkel = objektwinkel + lenkspeed
EndIf

If Objektwinkel < 0 Then objektwinkel = 359
If objektwinkel > 359 Then objektwinkel = 0

x#=x+xspeed
y#=y+yspeed


;Falls das Schiff den Bildschirm verlässt....
If x<0 Then x=800
If x>800 Then x=0
If y<0 Then y=600
If y>600 Then y=0

;Das bild wird im Richtigen Winkel gezeichnet.
DrawImage image(Floor(objektwinkel/4)),x,y

;debug-Text
Text 0,0,\"OW: \"+objektwinkel
Text 0,15,\"XS: \"+xspeed
Text 0,30,\"YS: \"+yspeed



Flip
Until KeyHit(1)
End



Zur Erklärung:

Die Steuerung ist vergleichbar mit einer Top-Down Autosteuerung. Jedoch ist sie nicht identisch:
-Im Weltall gibt es weder Luftwiderstand, noch Reibung, die ein Auto abbremsen. Das Raumschiff bremst also nichtvon alleine ab.

-Weil das Schiff kein Fahrzeug ist, das auf der Straße fährt, ändert sich die Bewegungsrichtung nicht, wenn man es lenkt. Erst, wenn man Beschleunigt, passt sich die Bewegungsrichtung der Richtung des Raumschiffs an.

Ich benötige als Eigenschaften des Fliegers also Position (x#,y#), Richtung in die das Raumschiff zeigt ("Objektwinkel"), und die Bewegungsrichtung. Dabei komme ich um zwei Variablen wohl nicht herum: Die horizontale (xspeed#) und die vertikale (yspeed#) geschwindigkeit. Diese Variablen "wissen", wie schnell sich das Raumschiff auf der X-Achse und der Y-Achse tatsächlich bewegt.

Den Objektwinkel verändert man ganz einfach mit den Links-Rechts-Pfeiltasten. Wenn beschleunigt wird, vergrößert sich die Xspeed und die Yspeed um den sinus bzw. den Kosinus des Objektwinkels. So passt sich die Bewegungsrichtung der Objektrichtung an.


hmm Smile ich weiß nicht ob ich das verständlich beschrieben habe. Ich kann einfach nicht so gut erklären... aber Übung macht bekanntlich den Meister Wink


grüße,
Spike
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
  • Zuletzt bearbeitet von Spikespine am Di, Jun 14, 2005 16:15, insgesamt einmal bearbeitet
 

E. Urbach

ehemals "Basicprogger"

BeitragSa, Jun 11, 2005 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, dass es noch Leute gibt, die fehlende Sachen ergänzen und den Neueinsteigern auch erklären. Wink

Der Code ist ganz OK.

Sieht man nicht alle Tage!
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik
 

Leonb

BeitragSo, Jun 12, 2005 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
cool!

ich habe noch beim Zeichnen des Fliegers etwas geändert:

BlitzBasic: [AUSKLAPPEN]

image(0) = LoadImage(\"Grafik.png\") ;das erste bild wird von Hand gezeichnet...
MaskImage image(0) , 0,255,0

MidHandle image(w)

For w = 1 To 89 ;...die anderen werden davon...
image(w) = CopyImage(image(0)) ;...kopiert...
MidHandle image(w) ;...ge-midhandled...
RotateImage image(w),w*4 ;...und gedreht
MaskImage image(w) , 0,255,0
Next


so kann man ein Bild für den Flieger nehmen Wink

kannst du vllt. noch zu dem Beispiel rote Striche als Laserstrahlen dazu coden?
meine HP:
http://www.scz.de.ms

Spikespine

BeitragSo, Jun 12, 2005 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
OK.
Bitte kopiere nicht einfach nur den Code und nehme ihn für dein Spiel. Das hat keinen Sinn, du lernst nichts. Wichtig ist, dass du einen Code nur als "Anregung" und Beispiel verwendest, und dass du alles, was du daraus für dein Spiel verwendest, selber verstehst. Ansonsten wirst du dein Spiel 100% nicht fertigstellen!

Ich hab schnell mal eine Version mit Schüssen gemacht.
Falls du dich nicht mit Types auskennst, solltest du dieses Tutorial lesen: http://www.blitzbase.de/tutorials/shadow_1.htm

Wenn du die Tyes verstanden hast, ist das hier einfach zu verstehen:


BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2

;KONSTANTEN
Const BESCHLEUNIGUNG# = 0.05 ;klar
Const BREMSSPEED# = 0.05;auch klar
Const LENKSPEED# = 2 ;auch klar


;BILDER ERSTELLEN:




Dim image(89) ;Bild-Array erstellen mit 89 einträgen


image(0) = CreateImage(30,35) ;das erste bild wird von Hand gezeichnet...
SetBuffer ImageBuffer(image(0))

Rect 10,0,10,30
Rect 0,20,30,10
MidHandle image(w)

For w = 1 To 89 ;...die anderen werden davon...
image(w) = CopyImage(image(0)) ;...kopiert...
MidHandle image(w) ;...ge-midhandled...
RotateImage image(w),w*4 ;...und gedreht
Next




SetBuffer BackBuffer() ;sollte klar sein

;startposition
x#=400
y#=300

Type schuss
Field x#,y#,r#
End Type


Repeat

Cls


If KeyDown(200) Then
xspeed# = xspeed# + Sin(objektwinkel)*beschleunigung
yspeed# = yspeed# - Cos(objektwinkel)*beschleunigung
ElseIf KeyDown(208) Then
xspeed# = xspeed# - Sin(objektwinkel)*bremsspeed
yspeed# = yspeed# + Cos(objektwinkel)*bremsspeed
EndIf

If KeyDown(203) Then
objektwinkel = objektwinkel - lenkspeed
ElseIf KeyDown(205) Then
objektwinkel = objektwinkel + lenkspeed
EndIf

If Objektwinkel < 0 Then objektwinkel = 359
If objektwinkel > 359 Then objektwinkel = 0

x#=x+xspeed
y#=y+yspeed



;Falls das Schiff den Bildschirm verlässt....
If x<-15 Then x=815
If x>815 Then x=-15
If y<-15 Then y=615
If y>615 Then y=-15

;Das bild wird im Richtigen Winkel gezeichnet.
DrawImage image(Floor(objektwinkel/4)),x,y

;debug-Text
speed# = Sqr(xspeed^2+yspeed^2)
Text 0,0,\"OW: \"+objektwinkel
Text 0,15,\"XS: \"+xspeed
Text 0,30,\"YS: \"+yspeed
Text 150,0,\"Speed: \"+speed


ms=MilliSecs()

;Wenn Leertaste gedrückt wurde, und der letzte schuss mehr als 200 ms her war:
If KeyDown(57) And ms-letzt>200 Then

letzt=ms ;letzter Schuss
s.schuss=New schuss ;neuen Schus erstellen
;Startwerte zuteilen:
s\x=x
s\y=y
s\r=objektwinkel
EndIf
Color 255,0,0
For s.schuss = Each schuss
s\x=s\x+Sin(s\r)*10
s\y=s\y-Cos(s\r)*10

If s\x<0 Or s\x>800 Or s\y<0 Or s\y>600 Then
Delete s.schuss
Else
Line s\x,s\y,s\x+Sin(s\r)*10,s\y-Cos(s\r)*10
EndIf
Next

Color 255,255,255
Flip
Until KeyHit(1)
End
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

Leonb

BeitragSo, Jun 12, 2005 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
cool! Danke!

Ich habe ja noch gar nicht angefangen mit meinem Spiel ^^
Soll so ein Weltraumshooter werden, wo man 2 Bildschirme hat und sich dann gegenseitig abschießt. Also 2 Raumschiffe und ohne KI-Gegner. Wink

So ich lese mir noch ein zweites mal Types durch und dann sollte ich alles nötige für diese Idee coden können Very Happy

Thx für die Bsp!
meine HP:
http://www.scz.de.ms
 

Leonb

BeitragDi, Jun 14, 2005 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm mal ne doofe Frage, wie schreibt man die Kollisionsabfrage mit Types und ImagesCollide()?

Ich dachte für dieses Bsp:

BlitzBasic: [AUSKLAPPEN]
ImagesCollide(Gegner,x,y,0,[b]?[/b],s\x,s\y,0)

Wie fragt man da eine Kollision mit einem Gegner ab?
meine HP:
http://www.scz.de.ms
 

E. Urbach

ehemals "Basicprogger"

BeitragDi, Jun 14, 2005 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ALLGEMEIN:

Type tPlayer
Field x,y
End Type

a.tPlayer=New tPlayer
g.tPlayer=New tPlayer

;... Initialisierung

If ImagesCollide(a\x,a\y,a\width,a\height, g\x, g\y, g\width, g\height)

SpionAtom

Betreff: Re: [B2D] Raumschiff-Steuerung

BeitragMi, Jun 15, 2005 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Spikespine hat Folgendes geschrieben:

BlitzBasic: [AUSKLAPPEN]

Dim image(89) ;Bild-Array erstellen mit 89 einträgen



Kleine Korintenkackerei am Rande. Es muss heißen ein Bild-Array mit 90 Einträgen. Laughing

Spikespine

BeitragMi, Jun 15, 2005 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ach huch, hast recht Wink
hab ich doch gemeint!
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group