Bewegung soll "flüssiger" Laufen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

robot91

Betreff: Bewegung soll "flüssiger" Laufen

BeitragMi, Apr 02, 2008 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
so, nachdem ich jetzt meine ersten programmierversuche gemacht habe, wollte ich mich mal an einen simplen weltraumshooter machen.
Hintergrundbewegung, Schiffsteuerung und Kanonen abschießen klappt alles sehr gut, nur die bewegung der Gegner sieht extrem kantig aus.
zur Info: Ich möchte, dass die gegner sich auf einem vorgegebenen Feld zufällig hin und her bewegen. Zum speichern der Daten nutze ich Types, weil ich damit wesentlich besser zurechtkomme als mit Dim-Feldern(auch wenn ich sie mitllerweile eigentlich kapiert habe Laughing )

So, hier mein Code zum bewegen der Gegner:

Code: [AUSKLAPPEN]
For I=1 To 5                                  ;Gegner bestimmen
If Alien(I)\Aktiv=0 Then
 Alien(I)\Aktiv=1
 Alien(I)\x3= Rand(100,1300)
 Alien(I)\y3= Rand(100, 200)
 EndIf
If Alien(I)\Aktiv=1 Then
 
For U=1 To 5                ;bewegung festlegen
ds=Rand(0,400)
If ds>300 And ds <=400 Then Alien(I)\x3=Alien(I)\x3-3
If ds<=300 And ds > 200 Then Alien(I)\x3=Alien(I)\x3+3
If ds<=200 And ds >100 Then Alien(I)\y3=Alien(I)\y3=-3
If ds<=100 And ds>=0 Then Alien(I)\y3=Alien(I)\y3=+3
Next

If Alien(I)\y3>600 Then Alien(I)\y3=600      ;Rand festlegen
If Alien(I)\y3<100 Then Alien(I)\y3=100
If Alien(I)\x3>1400 Then Alien(I)\x3=1400
If Alien(I)\x3<40 Then Alien(I)\x3=40

DrawImage Schiff , Alien(I)\x3, Alien(I)\y3

EndIf

Next


Vorher habe ich den type

Type Gegner
Field Aktiv
Field x3
Field y3
End Type

festgelegt und Alien als New Gegner bestimmt.

Aber egal was ich mache, die gegner bewegen sich immer ziemlich abgehackt und ich möchte, dass sie eben eher über den Bilschirm "schweben".
Würde mich über hilfe sehr freuen.

Der Eisvogel

BeitragDo, Apr 03, 2008 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre es möglich den ganzen Code rauszugeben?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

robot91

BeitragDo, Apr 03, 2008 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
natürlich Very Happy

nicht wundern, ich habe bis jetzt für raumschiff und raketen das gleiche bild benutzt, wird noch geändert^^

Code: [AUSKLAPPEN]

Graphics 1440,900
SetBuffer BackBuffer()

hinter=LoadImage("C:\Program Files\Blitz3D Demo\space.jpg")
schiff=LoadImage("C:\basic\spaceship2.bmp")
gegner=LoadImage("C:\basic\alien.bmp")
ScaleImage hinter, 1.5,1.3
ScaleImage schiff, 2,2

;Typen bestimmen
Type Schuss
 Field Aktiv
 Field x2
 Field y2
End Type


Type Gegner
 Field Aktiv
 Field x3
 Field y3
End Type


;Variablen usw. festlegen
SeedRnd MilliSecs()
Dim Alien.Gegner(5)
Dim Rakete.Schuss(100)
a=1
x=700y=850
For I=1 To 100
 Rakete(I)=New Schuss
Next 
For I=1 To 5
 Alien(I)= New Gegner
Next



;Haupschleife
Repeat

TileBlock hinter,0,h# ;Hintergrund bewegen
h#=h#+0.4



If KeyDown(203)Then x=x-1  ;Schiffsteuerung
If KeyDown(205)Then x=x+1
If KeyDown(200)Then y=y-1
If KeyDown(208)Then y=y+1

If x>1400Then x=1400
If x<40 Then x=40
If y>840 Then y=840
If y<40 Then y=4
DrawImage schiff, x,y




If KeyHit(57) Then ;Schüsse Abfeuern
a=a+1
If a=100 Then a=1
 Rakete(a)\Aktiv=1
 Rakete(a)\x2=x-10
 Rakete(a)\y2=y-10
EndIf 

For I= 1 To 100
 If Rakete(I)\Aktiv=1 Then
DrawImage Schiff, Rakete(I)\x2, Rakete(I)\y2
 Rakete(I)\y2=Rakete(I)\y2-5
EndIf
Next




For I=1 To 5                                  ;Gegner bestimmen
If Alien(I)\Aktiv=0 Then
 Alien(I)\Aktiv=1
 Alien(I)\x3= Rand(100,1300)
 Alien(I)\y3= Rand(100, 200)
 EndIf
If Alien(I)\Aktiv=1 Then
 
For U=1 To 5                ;bewegung festlegen
ds=Rand(0,400)
If ds>300 And ds <=400 Then Alien(I)\x3=Alien(I)\x3-3
If ds<=300 And ds > 200 Then Alien(I)\x3=Alien(I)\x3+3
If ds<=200 And ds >100 Then Alien(I)\y3=Alien(I)\y3=-3
If ds<=100 And ds>=0 Then Alien(I)\y3=Alien(I)\y3=-3

Next

If Alien(I)\y3>600 Then Alien(I)\y3=600      ;Rand festlegen
If Alien(I)\y3<100 Then Alien(I)\y3=100
If Alien(I)\x3>1400 Then Alien(I)\x3=1400
If Alien(I)\x3<40 Then Alien(I)\x3=40
DrawImage gegner , Alien(I)\x3, Alien(I)\y3
EndIf

Next




Repeat Until MilliSecs() Mod 33=0


Flip
Until KeyHit(1)

Der Eisvogel

BeitragDo, Apr 03, 2008 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
So, das Problem liegt daran, dass du immer einen Zufallswert genommen hast um zu entscheiden ob das Alien nach rechts oder links bewegt werden soll. Um das Problem zu beheben musst du die Bewegungsroutine überarbeiten und 3 Parameter zum Type hinzufügen:
Code: [AUSKLAPPEN]
For I=1 To 5 ;Gegner bestimmen -->Schleife ist unnnötig
If Alien(I)\Aktiv=0 Then
Alien(I)\Aktiv=1
Alien(I)\x3= Rand(100,1300)
Alien(I)\y3= Rand(100, 200)
Alien(I)\temp_x3= Alien(I)\x3
Alien(I)\temp_y3= Alien(I)\y3
EndIf
If Alien(I)\Aktiv=1 Then

;For U=1 To 5 ;bewegung festlegen
If Alien(I)\richtung=0 Then
Alien(I)\temp_x3=Alien(I)\temp_x3-3
EndIf
If Alien(I)\richtung=1 Then
Alien(I)\temp_x3=Alien(I)\temp_x3+3
EndIf
If Alien(I)\temp_x3<Alien(I)\x3-50 Then Alien(I)\richtung=1
If Alien(I)\temp_x3>Alien(I)\x3+50 Then Alien(I)\richtung=0
;Next

If Alien(I)\y3>600 Then Alien(I)\y3=600 ;Rand festlegen
If Alien(I)\y3<100 Then Alien(I)\y3=100
If Alien(I)\x3>1400 Then Alien(I)\x3=1400
If Alien(I)\x3<40 Then Alien(I)\x3=40
DrawImage gegner , Alien(I)\temp_x3, Alien(I)\y3
EndIf

Next


Nochwas: Wähle deine Höhe u. Breite des Fensters von den normalen Maßen aus.
320*240
640*480
800*600
1024*768
usw.

EDIT: Verwende auch bitte den DoubleBuffer.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group