Bewegung soll "flüssiger" Laufen
Übersicht

robot91Betreff: Bewegung soll "flüssiger" Laufen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
natürlich ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group