Vom Spaceshooter zum Autorennspiel - Problem^^

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Nichts95

BeitragSo, Mai 20, 2007 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, jetzt klappts^^ Problem dabei ist eben nur dass das Auto - egal in welcher Richtung gedreht - immer nach rechts fährt. Das ist ja natürlich wie vrohergesehen, bloß habe ich keine Ahnung wie man das jetzt so machen könnte dass das Auto in die gesteuerte Richtung fahren kann. Kennt jemand irgendein gutes Tutorial? Das Spac-Tut von Schattendieb hilft mir eben nicht weiter weil das irgendwie zu kompliziert ist da es einfach zu viel beinhaltet, was für mich überflüssig ist... (Zum Beispiel das mit mit den Entfernungen der Sterne)

D2006

Administrator

BeitragSo, Mai 20, 2007 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau mal hier:
https://www.blitzforum.de/scen...rch=winkel

Hab extra mein Tut wieder online gestellt...
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Nichts95

BeitragSo, Mai 20, 2007 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich diese Tuts richtig verstehe werden die mir wohl nicht helfen, denn bei mir bewegt sich der Hintergrund, da die Fläche sehr groß sein soll und bei den Tuts wird eben kein Scrolling benutzt... Das einzige was mir helfen könnte war im Tutorial "Winkel" am Anfang, allerdings war das nur für 8 Richtungen und ich bräuchte sowas eben für 360 und mit bewegendem Hintergrund Sad

D2006

Administrator

BeitragSo, Mai 20, 2007 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Tutorial zeigt dir, wie man ein Objekt (Spieler) bewegen kann. Das Problem, was du nun anscheinend hast, hat damit nicht viel am Hut.

Scrolling passiert unabhängig von den Bewegungen der Spieler. Das heißt, du veränderst die Variablen genauso. Nur bei der Ausgabe, also dem Zeichnen auf dem Bildschirm, kommt das Scrolling hinzu.

Dafür empfehle ich die Einführung zwei neuer Variablen. Zum Beispiel cam_x# und cam_y#. Diese speichern die linke obere Ecke der "Kamera". Wenn also beide 0 sind, ist es ganz normal, wie ohne Scrolling.

Jegliche Ausgabe (Bilder zeichnen) wird dann mit den beiden Variablen verrechnet:

Code: [AUSKLAPPEN]
DrawImage bild,camx#+x#,camy#+y#


Wenn die "Kamera" immer den Spieler in der Mitte haben soll, kann man das so lösen:

Code: [AUSKLAPPEN]
camx# = (4*camx# + (-x#+400)) / 5.0
camy# = (4*camy# + (-y#+300)) / 5.0


(x und y sind die Korrdinaten des gewünschten Objekts, also zB des Spielers)
Hier wird die vierfache alte Kameraposition mit der "neue" verrechnet und dann durch 5 geteilt. Das sorgt dafür, dass die Kamera "sanft" dem Objekt folgt und nicht ruckartig draufklebt. Die Parameter dafür können natürlich nach Belieben angepasst werden. Wichtig sind noch die 400 und die 300. Das ist Auflösungsabhängig. Ich nutzte in dem Fall eine Auflösung von 800x600 Pixel. Man muss halt jeweils die Hälfte dazu addieren. Würde man dies nicht tun, so wäre das Objekt dann links oben zu sehen.

Vorsicht: an anderen Stellen musst du auch auf das Scrolling aufpassen! Zum Beispiel, bei der Berechnung, ob ein Objekt zu sehen ist.

Wenn mir mal arg langweilig ist, schreib ich dazu auch mal ein Tutorial...
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Nichts95

BeitragMo, Mai 21, 2007 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, bisher funktioniert alles ohne Fehlermeldung^^
Für mich ein Grund zum Feiern^^
Jetzt ist nur die Frage wie ich es je nach Richtung schaffe den Hintergrund zu bewegen! Denn ich kann ja nicht einfach:
Code: [AUSKLAPPEN]

If Keydown (XXX) Then
xposition+4

schreiben. Dann würde der Winkelgrad egal sein, das Auto würde immer in die "X-Richtung" fahren...

Progger93

BeitragMo, Mai 21, 2007 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiers mal so:
Code: [AUSKLAPPEN]

if keydown(203) then winkel=winkel-1
if keydown(205) then winkel=winkel+1
if keydown(200) then geschwindigkeit=geschwindigkeit+1
if keydown(208) then geschwindigkeit=geschwindigkeit-1
if winkel>360 then winkel=0
if winkel<0 then winkel=360
x=x+cos(Winkel)*geschwindigkeit
y=y+sin(Winkel)*geschwindigkeit


ist noch etwas zu schnelle Beschleunigung Very Happy

EDIT:
So besser
  • Zuletzt bearbeitet von Progger93 am Mo, Mai 21, 2007 16:27, insgesamt einmal bearbeitet

Tankbuster

BeitragMo, Mai 21, 2007 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
if winkel<>360 then winkel=0

Musst du in
Zitat:
if winkel>360 then winkel=0

ändern Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragMo, Mai 21, 2007 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, irgendwie kann ich mich - wie vorher - nur drehen... Hier mein gesamter Code:
Code: [AUSKLAPPEN]

Graphics 800,600,16,1 ;Grafische Dinge^^
SetBuffer BackBuffer()
TFormFilter 1
AutoMidHandle 1
SeedRnd MilliSecs()
Global camx# ;Kamera X-Position
Global camy# ;Kamera Y-Position
Dim sp_grafik(360)
Global hintergrund1 = LoadImage("grafiken\boden.bmp") ;"Boden" wird geladen - nichts anderes als der Hintergrund^^
For gr=0 To 359
 sp_grafik(gr)=LoadImage("grafiken\auto.bmp") ;Grafik der Autos wird geladen
 RotateImage sp_grafik(gr),gr ;Auto wird gedreht
 Cls
 DrawBlock sp_grafik(gr),400,300 ;Auto wird positioniert
 Flip
Next

Type player
 Field x#,y#,grad# ;Variablen fürs Auto...
 Field spx#,spy#,maxspeed#,wendigkeit#,beschleunigung#
End Type

Global spieler.player=New player

spieler\maxspeed#=5
spieler\beschleunigung#=0.05
spieler\wendigkeit#=2

Origin 400,300

While Not KeyHit(1) ;Hauptschleife
 hintergrund1()
 steuerung()
 spieler_versetzten()
 spieler_malen()
 kamera()

 Flip
Wend
End
 
 Function steuerung() ;Berechnungen vom Space-Tut von Schattendieb die iich abgeguckt habe^^
If KeyDown(203)Then spieler\grad#=spieler\grad-spieler\wendigkeit#
If KeyDown(205)Then spieler\grad#=spieler\grad+spieler\wendigkeit#
If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360
If spieler\grad#<0 Then spieler\grad#=360+spieler\grad#


If spieler\spx#<Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#+Abs(Cos(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spx#>Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#-Abs(Cos(spieler\grad#)*spieler\beschleunigung#)

  If spieler\spy#<Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#+Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spy#>Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#-Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
 
End Function


Function spieler_versetzten()
 spieler\x#=spieler\x#+spieler\spx#
 spieler\y#=spieler\y#+spieler\spy#

End Function
Function spieler_malen()
 DrawImage sp_grafik(Int(spieler\grad#)),0,0

End Function
Global winkel
Global geschwindigkeit
Global yh#
Global xh#
Function hintergrund1() ;Und hier ist eben das was ihr mir gesagt habt^^
TileBlock hintergrund1, camx#+x#, camy#+y#
If KeyDown(203) Then winkel=winkel-1
If KeyDown(205) Then winkel=winkel+1
If KeyDown(200) Then geschwindigkeit=geschwindigkeit+1
If KeyDown(208) Then geschwindigkeit=geschwindigkeit-1
If winkel>360 Then winkel=0
If winkel<0 Then winkel=360
x=x+Cos(Winkel)*geschwindigkeit
y=y+Sin(Winkel)*geschwindigkeit


End Function

Function kamera()
camx# = (4*camx# + (-x#+400)) / 5.0
camy# = (4*camy# + (-y#+300)) / 5.0 ;Und hier noch das mit dem Hintergrund damit das Auto immer;in dem Mitte bleibt
End Function


Edititiert:Hab es jetzt edietiert mit Kommentaren!
  • Zuletzt bearbeitet von Nichts95 am Mo, Mai 21, 2007 17:55, insgesamt 2-mal bearbeitet

Progger93

BeitragMo, Mai 21, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab eine bitte. könntest du deinen code mal mit ; auskommentieren
er ist ziemlich unübersichtlich

Progger93

BeitragMo, Mai 21, 2007 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch 2 Dinge
1.) Es hilft nichts fremde Proggrammcodes einfach nur Abzuscreiben denn man lernt nichts dabei
2.)Dein code ergibt keinen sinn da mein Beispiel eben nur ein Beispiel ist und (noch) nicht in deinen Code hineinpasst.

BladeRunner

Moderator

BeitragMo, Mai 21, 2007 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wäre es mit Nutzen des EDIT-Buttons ?
Danke.
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
 

Matthias

BeitragDi, Mai 22, 2007 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Ich habe dir mal ein Beispiel gemacht. Autos auf einem TilesMap. Mit einem kleinen TilesEditor. Einfach "s" für Speichern drücken und beim nästen mal den SchnellEditor deaktivieren. Dann wird das Map automatich geladen.
Die Gegner AutoKI ist nur andeutungsweise vorhanden.
(Will dir ja nicht den ganzen Spass nehmen)

Die Datein habe ich im Archiv hochgeladen.
Link:
https://www.blitzforum.de/upload/file.php?id=1538

Code: [AUSKLAPPEN]

Global ScreenX=800,ScreenY=600
Graphics ScreenX,ScreenY,32,2
Global PlayerXPos#,PlayerYPos#

Dim RoadTiles(20),RoadMiniT(20)
Dim RoadMap(1000,1000)
Dim AutosImg(3,360)

TFormFilter 0

LoadAutos()
LoadRoadTiles()


SetBuffer BackBuffer()
SchnellEditor()










LoadMap()


Type Autos
Field XPos#
Field YPos#
Field Wink#
Field IstSpeed#
Field MaxSpeed
Field Besch#
Field Typ
Field Player$
Field DrehSpeed#
End Type

NeuesAuto(300,300,0,10,.1,2,0,"Player")
NeuesAuto(340,300,0,10,.1,20,1,"AutoKI")


 





Repeat:

Select MilliSecs()>Timer+10:Case 1
Timer=MilliSecs()
AufbTilesMap()
UpdatePlayer()
Flip
End Select

Until KeyDown(1)=1
End




Function NeuesAuto(X,Y,Wink#,MSp,Be#,DSp#,Typ,Spie$)
A.Autos=New Autos
A\XPos=X:A\YPos=Y:A\Wink=Wink
A\MaxSpeed=MSp
A\Besch=Be
A\Typ=Typ
A\Player=Spie$
A\DrehSpeed=DSp
End Function



Function UpdatePlayer()
ScrX=ScreenX/2:ScrY=ScreenY/2
For A.Autos=Each Autos
Select A\Player:Case "Player":PlayerStrg(A.Autos)
PlayerXPos=A\XPos:PlayerYPos=A\YPos
Default:AutoKI(A.Autos)

Select A\IstSpeed<0:Case 1:A\IstSpeed=0:End Select
:End Select




A\Wink=A\Wink Mod 359:If A\Wink<0 A\Wink=359+A\Wink
Select A\IstSpeed>A\MaxSpeed:Case 1:A\IstSpeed=A\MaxSpeed:End Select

A\XPos=A\XPos-Sin(A\Wink)*A\IstSpeed
A\YPos=A\YPos+Cos(A\Wink)*A\IstSpeed
W=Floor((A\Wink)/5)

Select A\Player:Case "Player":
DrawImage AutosImg(A\Typ,W*5),ScrX,ScrY
Default
PX#=A\XPos-PlayerXPos
PY#=A\YPos-PlayerYPos
DrawImage AutosImg(A\Typ,W*5),ScrX+PX,ScrY+PY
End Select
Next
End Function



Function PlayerStrg(A.Autos)
D#=A\DrehSpeed*(A\IstSpeed/Float(A\MaxSpeed))
Select KeyDown(203):Case 1:A\Wink=A\Wink-D:End Select
Select KeyDown(205):Case 1:A\Wink=A\Wink+D:End Select
Select KeyDown(200):Case 1:A\IstSpeed=A\IstSpeed+A\Besch:End Select
Select KeyDown(208):Case 1:A\IstSpeed=A\IstSpeed-A\Besch:End Select
;AppTitle A\IstSpeed+"  "+A\Wink
End Function

Function AutoKI(A.Autos)

SoWink=ATan2(PlayerXPos-A\XPos,PlayerYPos-A\Ypos)*-1
Select A\Wink+A\DrehSpeed<SoWink:Case 1:A\Wink=A\Wink+A\DrehSpeed
A\IstSpeed=A\IstSpeed-A\Besch:Return:End Select

Select A\Wink-A\DrehSpeed>SoWink:Case 1:A\Wink=A\Wink-A\DrehSpeed
A\IstSpeed=A\IstSpeed-A\Besch:Return:End Select
A\IstSpeed=A\IstSpeed+A\Besch
End Function


Function AufbTilesMap()
TW=ImageWidth(RoadTiles(0)):TAnX=(ScreenX/TW)+1
TAnY=(ScreenY/TW)+1


SX=PlayerXPos-ScreenX/2
SY=PlayerYPos-ScreenY/2
MX=SX/TW:MY=SY/TW
QX=SX-MX*TW:QY=SY-MY*TW

For IX=-1 To TAnX:For IY=-1 To TAnY:
NX=IX+MX
NY=IY+MY
Select NX>-1 And NY>-1:Case 1
DrawBlock RoadTiles(RoadMap(NX,NY)),IX*TW-QX,IY*TW-QY
Default
DrawBlock RoadTiles(0),IX*TW-QX,IY*TW-QY


End Select
Next:Next



End Function








Function LoadRoadTiles():For I=0 To 6:RoadTiles(I)=LoadImage("Road"+I+".jpg")
RoadMiniT(I)=CopyImage(RoadTiles(I)):ResizeImage RoadMiniT(I),32,32
;ResizeImage RoadTiles(I),128,128

:Next
End Function






Function SchnellEditor()
TW=ImageWidth(RoadMiniT(0)):TAnX=ScreenX/TW:TAnY=ScreenY/TW

Repeat
;-------Map Aufbau-------------
For IX=0 To TAnX:For IY=0 To TAnY
DrawBlock RoadMiniT(RoadMap(IX+MapX,IY+MapY)),IX*TW,IY*TW
Next:Next

;--------Map Rollen-----

Select KeyDown(200) And MapY>0:Case 1:MapY=MapY-1:Warte=150:End Select
Select KeyDown(208) And MapY<900:Case 1:MapY=MapY+1:Warte=150:End Select
Select KeyDown(203) And MapX>0:Case 1:MapX=MapX-1:Warte=150:End Select
Select KeyDown(205) And MapX<900:Case 1:MapX=MapX+1:Warte=150:End Select

;--------------Map--Laden/Speichern--------
Select KeyHit(31):Case 1:File=WriteFile("Map.Dat"):For IX=0 To 999
For IY=0 To 999:WriteByte(File,RoadMap(IX,IY)):Next:Next:CloseFile File
End Select:Select KeyHit(38):Case 1:LoadMap():End Select

;"-----Road Tiles Auswählen/Setzen--------"
Select MouseX()>ScreenX-TW:Case 1:Select MouseDown(1):Case 1
RoadMack=(MouseY()/TW)+RoadLisAnf:End Select

Default:MX=MouseX()/TW:MY=MouseY()/TW
Select MouseDown(1):Case 1:RoadMap(MX+MapX,MY+MapY)=RoadMack:End Select
Select MouseDown(2):Case 1:RoadMap(MX+MapX,MY+MapY)=0:End Select

MX=MX*TW:MY=MY*TW:Rect MX-1,MY+TW-9,10,10:
Rect MX+TW-9,MY-1,10,10:Rect MX+TW-9,MY+TW-9,10,10
Rect MX-1,MY-1,10,10:DrawBlock RoadMiniT(RoadMack),MX,MY
End Select


;----AuswahlListe Auf/Ab Rollen (Bild Auf/Ab Taste)
Select KeyHit(201)=1 And RoadLisAnf>0:Case 1
RoadLisAnf=RoadLisAnf-1:End Select
Select KeyHit(209):Case 1
RoadLisAnf=RoadLisAnf+1:End Select


;"Tiles AuswahlListe-Anzeigen---------
I=RoadLisAnf:Y=0:X=ScreenX-TW
While RoadMiniT(I)<>0:DrawBlock RoadMiniT(I),X,Y
Select RoadMack:Case I:Rect X,Y,TW-1,TW-1,0:End Select
Y=Y+TW:I=I+1:Wend

;--Grauer Balken
Color 192,192,192:Rect ScreenX-TW-10,0,10,ScreenY:Color 255,255,255
Text 10,10,"XPos: "+MapX:Text 10,25,"YPos: "+MapY
Flip:Delay Warte:Warte=0


Until KeyDown(1)=1
End
End Function



Function LoadAutos()
For I=0 To 1:Image=LoadImage("Auto"+I+".png"):MidHandle Image

For C=0 To 359 Step 5
AutosImg(I,C)=CopyImage(Image)
RotateImage AutosImg(I,C),C:Next

Next


End Function





Function LoadMap():File=ReadFile("Map.Dat"):For IX=0 To 999
For IY=0 To 999:RoadMap(IX,IY)=ReadByte(File):Next:Next
CloseFile File:End Function


Mfg Matthias
Und noch viel Erfolg bei diesem Projeckt

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group