Draw3D Scrolling auf einer Map?
Übersicht

![]() |
M0rgensternBetreff: Draw3D Scrolling auf einer Map? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Ich hab schon mit der Boardsuche gesucht und hab auch was gefunden. Da hat Hectic eine Lösung gezeigt. Aber da konnte man die Figur nur hoch rechts links und runter bewegen. Ich hab aber eine "GTA-Steuerung" drin. Also sieht das ganze bei mir wieder anders aus. Meine "Karte" Scrollt ganz einfach hiermit: Code: [AUSKLAPPEN] DrawRect3D(GrasTile,0,0,Spieler\Px#,-Spieler\Py#,1024,768)
Aber meine Gegner, Schüsse etc haben eine absolute Variable. Das heißt, dass wenn ich mich mit dem Spieler bewege, die auf dem BILDSCHIRM an der gleichen Stelle bleiben und nicht auf der KARTE. Ich weiß, dass ich das irgendwie über ein paar Variablen verrechnen muss. Aber ich weiß ehrlich gesagt nicht wie bzw wo ich anfangen soll. Könnte mir da vielleicht jemand helfen, bitte? Was auch noch nicht ganz funktioniert, ist, dass der Spieler immer in der Mitte der Kamera bleibt. Aber das wäre momentan noch reine Nebensache. Der ganze Code sieht jetzt so aus, wenn den jemand benötigt (Jaaahaa... Ich hab ein Partikelsystem für Blut und Gedärme eingebaut^^) Code: [AUSKLAPPEN] AppTitle "Draw3D V.3.2 - LoadFont3D"
Graphics3D 1024,768,0,1 SetBuffer BackBuffer() SeedRnd MilliSecs() Local Timer=CreateTimer(60) Local Camera=CreateCamera() CameraClsColor Camera,5,5,5 Include "Includes\Draw3D.bb" DrawInit3D(Camera) Origin3D(1024,768) ;_______________________________________________ Global GrasTile = loadimage3d("gfx\BodenTile.png", 1, 2, 1) Global BlutLache = loadimage3d("gfx\BlutLache.png", 2, 2, 1) Global GegnerTestI = loadimage3d("gfx\block3.bmp", 1, 2, 0) Global PistSchuss = loadimage3d("gfx\PistolenSchuss.png", 2, 2, 0) Global PlayerImage=LoadImage3D("gfx\spaceship3.png", 4, 2, 0) Global MouseImage = loadimage3d("gfx\target.png", 2, 2, 0) ;++++++++++++++ Global GegnerTimer = MilliSecs() ;++++++++++++++ Global Schriftart = loadfont3d("Fonts\Cosmic1.png", 2, 2, 0) Global Scroll_X Global Scroll_Y ;++++++++++++++ Type TWaffe Field WName$ Field WMunition%, WMagazine% Field WSchussProMagazin%, WKadenz%, WDamage%, WSpeed% End Type Global PW_Pistole.TWaffe = WaffeErstellen("Pistole", 10, 9999, 10, 400, 17, 15) Global PW_MP.TWaffe = WaffeErstellen("MP", 25, 10, 25, 200, 13, 19) Global PW_Schrot.TWaffe = WaffeErstellen("Shotgun", 8, 10, 8, 550, 33, 12) Global PW_MG.TWaffe = WaffeErstellen("MG", 50, 10, 50, 100, 24, 25) Global PW_Laser.TWaffe = WaffeErstellen("Laser", 500, 1, 500, 1, 22, 7) Global PW_Magnum.TWaffe = WaffeErstellen(".45er Magnum", 7, 10, 7, 530, 26, 11) Type TGegnerTest Field GTx#, GTy#, GTWinkel, GTGeschw#, GTImage, GTRotatGe#, Dead, GTRotatRich End Type Type TPartikel Field PTx#, PTy#, PTWinkel#, PTSpeed#, PTLebensdauer#, PTStartzeit#, PTtot, PTImage, PTIWinkel, PTGroesse End Type Type TPlayerSchuss Field PSx#, PSy#, PSWinkel, PSGeschw#, PSImage, PSDead End Type Type TPlayer Field Px#, Py#, PWinkel, PEnergie, PAltx#, PAlty#, PGeschw#, Image, Dead Field PGewWaffe.TWaffe, PSchuTimer, PWafKadenz End Type Global Spieler.TPlayer = New TPlayer Spieler\Px# = (20) Spieler\Py# = (20) Spieler\PWinkel = 0 Spieler\Image = PlayerImage Spieler\PEnergie = 100 Spieler\PGeschw# = 5 Spieler\Dead = 0 Spieler\PGewWaffe = PW_Pistole Spieler\PSchuTimer = MilliSecs() ;_________________________________________________ Repeat SpielerSteuerung() SpielerSchuss() SSchussBewegen() GegnerErstellenTest() GegnerBewegenTest() PSchussKollision() BlutPartikelUpdate() AllesMalen() ;Zeichen() WaitTimer(Timer) RenderWorld Clear3D() Flip 0 Until KeyHit(1) End ;___________________________________________________ Function SpielerSteuerung() Spieler\PAltx# = Spieler\Px# Spieler\PAlty# = Spieler\Py# Spieler\PWinkel#=ATan2(Spieler\Px#-MouseX3D,Spieler\Py#-MouseY3D) ;Blickrichtung ;Geradeaus If KeyDown(17) Then Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel)*Spieler\PGeschw# Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel)*Spieler\PGeschw# EndIf ;Links If KeyDown(30) Then Spieler\Px#=Spieler\Px#-Sin(Spieler\PWinkel+90)*Spieler\PGeschw# Spieler\Py#=Spieler\Py#-Cos(Spieler\PWinkel+90)*Spieler\PGeschw# EndIf ;Rechts If KeyDown(32) Then Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel+90)*Spieler\PGeschw# Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel+90)*Spieler\PGeschw# EndIf ;Nach hinten If KeyDown(31) Then Spieler\Px#=Spieler\Px#+Sin(Spieler\PWinkel)*Spieler\PGeschw# Spieler\Py#=Spieler\Py#+Cos(Spieler\PWinkel)*Spieler\PGeschw# EndIf ;Waffenauswahl If KeyDown(2) Then Spieler\PGewWaffe = PW_Pistole EndIf If KeyDown(3) Then Spieler\PGewWaffe = PW_MP EndIf If KeyDown(4) Then Spieler\PGewWaffe = PW_Schrot EndIf If KeyDown(5) Then Spieler\PGewWaffe = PW_MG EndIf If KeyDown(6) Then Spieler\PGewWaffe = PW_Laser EndIf If KeyDown(7) Then Spieler\PGewWaffe = PW_Magnum EndIf If Spieler\Px# >= 490 Then Spieler\Px# = Spieler\PAltx# If Spieler\Px# <= -490 Then Spieler\Px# = Spieler\PAltx# If SPieler\Py# >= 350 Then Spieler\Py# = Spieler\PAlty# If Spieler\Py# <= -350 Then Spieler\Py# = Spieler\PAlty# End Function ;++++++++++++++ Function GegnerErstellenTest() If (GegnerTimer + Rand(2000,4000)) < MilliSecs() Then For i = 1 To Rand(1,3) Gegner.TGegnerTest = New TGegnerTest Gegner\GTx# = Rand(-490, 490) Gegner\GTy# = 355 Gegner\GTGeschw# = Rand(1,8) Gegner\GTWinkel = Rand(0,360) Gegner\GtRotatGe = Rand(0,20) Gegner\GTImage = GegnerTestI Gegner\GTRotatRich = Rand(1,2) Gegner\Dead = 0 Next GegnerTimer = MilliSecs() EndIf End Function ;++++++++++++++ Function GegnerBewegenTest() For Gegner.TGegnerTest = Each TGegnerTest Gegner\GTy# = Gegner\GTy# - Gegner\GTGeschw# If Gegner\GTRotatRich = 1 Then ;Im Uhrzeigersinn Gegner\GTWinkel = Gegner\GTWinkel + Gegner\GTRotatGe ElseIf Gegner\GTRotatRich = 2 Then Gegner\GTWinkel = Gegner\GTWinkel - Gegner\GTRotatGe EndIf If Gegner\GTy# > 384 Then Gegner\Dead = 1 If Gegner\Dead = 1 Then Delete Gegner.TGegnerTest Next End Function ;++++++++++++++ Function SpielerSchuss() If ((Spieler\PSchuTimer + Spieler\PGewWaffe\WKadenz) < MilliSecs()) And Spieler\Dead <> 1 Then If MouseDown(1) Then If Spieler\PGewWaffe\WMunition <= 0 Then ;Überprüfen ob überhaupt noch eine Kugel im Lauf ist Spieler\PGewWaffe\WMunition = 0 ;Damit auf jeden Fall von 0 an gerechnet wird If Spieler\PGewWaffe\WMagazine > 0 Then Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition + Spieler\PGewWaffe\WSchussProMagazin ;Waffe nachladen, wenn das Magazin leer war Spieler\PGewWaffe\WMagazine = Spieler\PGewWaffe\WMagazine - 1 ;Ein Magazin weniger EndIf ElseIf Spieler\PGewWaffe\WMunition > 0 Then If Spieler\PGewWaffe = PW_Schrot For i = 1 To 5 ;Schrotflinte... Damit es ne schöne Streuung gibt Schuss.TPlayerSchuss = New TPlayerSchuss Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw Schuss\PSWinkel = Spieler\PWinkel+Rand(-23,23) Schuss\PSImage = PistSchuss SChuss\PSDead = 0 Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed Next Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1 If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 Else Schuss.TPlayerSchuss = New TPlayerSchuss ;Ansonsten schießen Schuss\PSy# = Spieler\Py#-Cos(Spieler\PWinkel)*Schuss\PSGeschw Schuss\PSx# = Spieler\Px#-Sin(Spieler\PWinkel)*Schuss\PSGeschw Schuss\PSWinkel = Spieler\PWinkel Schuss\PSImage = PistSchuss Schuss\PSDead = 0 Schuss\PSGeschw = Spieler\PGewWaffe\WSpeed Spieler\PGewWaffe\WMunition = Spieler\PGewWaffe\WMunition - 1 If Spieler\PGewWaffe\WMunition < 0 Then Spieler\PGewWaffe\WMunition = 0 ;Nochmal extra überprüfen dass nichts unter 0 geht EndIf EndIf Spieler\PSchuTimer = MilliSecs() EndIf EndIf End Function ;++++++++++++++ Function SSchussBewegen() For Schuss.TPlayerSchuss = Each TPlayerSchuss Schuss\PSx#=Schuss\PSx#-Sin(Schuss\PSWinkel)*Schuss\PSGeschw# Schuss\PSy#=Schuss\PSy#-Cos(Schuss\PSWinkel)*Schuss\PSGeschw# If SChuss\Psx# >= 512 Then Schuss\PSDead = 1 If Schuss\Psx# <= -512 Then Schuss\PSDead = 1 If Schuss\Psy# >= 384 Then Schuss\PSDead = 1 If Schuss\Psy# <= -384 Then Schuss\PSDead = 1 If Schuss\PSDead = 1 Then Delete Schuss.TPlayerSchuss Next End Function ;++++++++++++++ Function AllesMalen() For Gegner.TGegnerTest = Each TGegnerTest Drawimage3D(Gegner\GTImage, Gegner\GTx#, Gegner\Gty#, 0, Gegner\GTWinkel, 1) Next For SChuss.TPlayerSchuss = Each TPlayerSchuss Drawimage3D(Schuss\PSImage, Schuss\PSx#, SChuss\PSy#, 0, SChuss\PSWinkel, 1.5) Next For BlutPartikel.TPartikel = Each TPartikel Drawimage3d(BlutPartikel\PTIMage, BlutPartikel\PTx, BlutPartikel\PTy, 0, BlutPartikel\PTIWinkel, BlutPartikel\PTGroesse) Next DrawImage3D(PlayerImage, Spieler\Px#, Spieler\Py#, 0, Spieler\PWinkel#, 1) Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1) ColorT3D(255, 10, 10, 1) DrawRect3D(GrasTile,0,0,Spieler\Px#,-Spieler\Py#,1024,768) Text3D(Schriftart, (-400), 300, "Waffe: " + Spieler\PGewWaffe\Wname) Text3D(Schriftart, (-400), 280, "Munition: " + Spieler\PGewWaffe\WMunition + "/" + Spieler\PGewWaffe\WMagazine, 0, 0, 0) End Function ;++++++++++++++ Function WaffeErstellen.TWaffe(name$, Munition, Magazine, SchussProMagazin, Kadenz, Damage, Speed) Local W.TWaffe = New TWaffe W\WName = name$ W\WMunition = Munition W\WMagazine = Magazine W\WSchussProMagazin = SchussProMagazin W\WKadenz = Kadenz W\WDamage = Damage W\WSpeed = Speed Return W End Function ;++++++++++++++ Function PSchussKollision() For Schuss.TPlayerSChuss = Each TPlayerSchuss For Gegner.TGegnerTest = Each TGegnerTest If ImagesOverlap3D(Schuss\PSImage, Schuss\PSx#, Schuss\PSy#, SChuss\PSWinkel, 1.5 ,Gegner\GTImage, Gegner\GTx#, Gegner\GTy#, Gegner\GTWinkel, 1) Then If Gegner\Dead = 0 Then BlutInnereienPartikelCreate(Gegner\GTx#, Gegner\GTy#) Gegner\Dead = 1 Schuss\PSDead = 1 EndIf EndIf Next Next End Function ;++++++++++++++ Function BlutInnereienPartikelCreate(EnemyX, EnemyY) For i = 0 To 5 BlutPartikel.TPartikel = New TPartikel BlutPartikel\PTx# = EnemyX BlutPartikel\PTy# = EnemyY BlutPartikel\PTIWinkel = Rand(0,360) BlutPartikel\PTWinkel# = ATan2(EnemyX*(-1.0),EnemyY*(-1.0)) + Rand(-45,45) BlutPartikel\PTSpeed# = Rnd(5, 10) BlutPartikel\PTStartzeit# = MilliSecs() BlutPartikel\PTLebensdauer# = Rand(1000, 3000) BlutPartikel\PTtot = 0 BlutPartikel\PTGroesse = Rand(1, 1.5) BlutPartikel\PTIMage = BlutLache Next End Function ;++++++++++++++ Function BlutPartikelUpdate() For BlutPartikel.TPartikel = Each TPartikel BlutPartikel\PTx#=BlutPartikel\PTx#-Sin(BlutPartikel\PTWinkel#)*BlutPartikel\PTSpeed# BlutPartikel\PTy#=BlutPartikel\PTy#-Cos(BlutPartikel\PTWinkel#)*BlutPartikel\PTSpeed# If BlutPartikel\PTSpeed# > 0 Then BlutPartikel\PTSpeed# = BlutPartikel\PTSpeed - Rand(0.7,1.3) ElseIf BlutPartikel\PTSpeed# < 0 Then BlutPartikel\PTSpeed# = 0 EndIf If BlutPartikel\PTStartzeit# + BlutPartikel\PTLebensdauer# < MilliSecs() Then BlutPartikel\PTtot = 1 EndIf If BlutPartikel\PTtot = 1 Then Delete BlutPartikel.TPartikel Next End Function ;++++++++++++++ Function ImagesOverlap3D(FDrawHandleA%,FDrawXA#,FDrawYA#,FDrawAngleA#,FDrawScaleA#,FDrawHandleB%,FDrawXB#,FDrawYB#,FDrawAngleB#,FDrawScaleB#) ;FACEBANK(AUS)WEISUNGEN Local LDrawXRanA#=PeekFloat(GDrawBank,FDrawHandleA+DRAWBANKXSIZE)*FDrawScaleA Local LDrawYRanA#=PeekFloat(GDrawBank,FDrawHandleA+DRAWBANKYSIZE)*FDrawScaleA ;VARIABLENDEKLARATIONEN Local IDrawXA#[3] Local IDrawYA#[3] ;EXTRA/WINKELBERECHNUNG If FDrawAngleA<>0 Then ;SCHNELLE/UMRECHNUNG/VON: 'aMul' Local IDrawTCosA#=Cos(FDrawAngleA) Local IDrawTSinA#=Sin(FDrawAngleA) Local IDrawXPos1A#=LDrawXRanA*IDrawTCosA-LDrawYRanA*IDrawTSinA Local IDrawYPos1A#=LDrawYRanA*IDrawTCosA+LDrawXRanA*IDrawTSinA Local IDrawXPos2A#=LDrawXRanA*IDrawTCosA+LDrawYRanA*IDrawTSinA Local IDrawYPos2A#=LDrawYRanA*IDrawTCosA-LDrawXRanA*IDrawTSinA Else ;DIREKTE/DARSTELLUNG IDrawXPos1A=LDrawXRanA IDrawYPos1A=LDrawYRanA IDrawXPos2A=LDrawXRanA IDrawYPos2A=LDrawYRanA End If ;ECKENPOS/ZWISCHENSPEICHER IDrawXA[0]=FDrawXA-IDrawXPos1A IDrawYA[0]=FDrawYA+IDrawYPos1A IDrawXA[1]=FDrawXA+IDrawXPos2A IDrawYA[1]=FDrawYA+IDrawYPos2A IDrawXA[2]=FDrawXA+IDrawXPos1A IDrawYA[2]=FDrawYA-IDrawYPos1A IDrawXA[3]=FDrawXA-IDrawXPos2A IDrawYA[3]=FDrawYA-IDrawYPos2A ;FACEBANK(AUS)WEISUNGEN Local LDrawXRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKXSIZE)*FDrawScaleB Local LDrawYRanB#=PeekFloat(GDrawBank,FDrawHandleB+DRAWBANKYSIZE)*FDrawScaleB ;ENTFERUNGUNGSRECHUNG VON: 'faeX' SA# = Sqr(LDrawXRanA*LDrawXRanA + LDrawYRanA*LDrawYRanA) SB# = Sqr(LDrawXRanB*LDrawXRanB + LDrawYRanB*LDrawYRanB) XDist# = FDrawXA-FDrawXB YDist# = FDrawYA-FDrawYB Dist# = Sqr(XDist*XDist + YDist*YDist) If Dist > (SA+SB) Then Return False ;VARIABLENDEKLARATIONEN Local IDrawXB#[3] Local IDrawYB#[3] ;EXTRA/WINKELBERECHNUNG If FDrawAngleB<>0 Then ;SCHNELLE/UMRECHNUNG/VON: 'aMul' Local IDrawTCosB#=Cos(FDrawAngleB) Local IDrawTSinB#=Sin(FDrawAngleB) Local IDrawXPos1B#=LDrawXRanB*IDrawTCosB-LDrawYRanB*IDrawTSinB Local IDrawYPos1B#=LDrawYRanB*IDrawTCosB+LDrawXRanB*IDrawTSinB Local IDrawXPos2B#=LDrawXRanB*IDrawTCosB+LDrawYRanB*IDrawTSinB Local IDrawYPos2B#=LDrawYRanB*IDrawTCosB-LDrawXRanB*IDrawTSinB Else ;DIREKTE/DARSTELLUNG IDrawXPos1B=LDrawXRanB IDrawYPos1B=LDrawYRanB IDrawXPos2B=LDrawXRanB IDrawYPos2B=LDrawYRanB End If ;ECKENPOS/ZWISCHENSPEICHER IDrawXB[0]=FDrawXB-IDrawXPos1B IDrawYB[0]=FDrawYB+IDrawYPos1B IDrawXB[1]=FDrawXB+IDrawXPos2B IDrawYB[1]=FDrawYB+IDrawYPos2B IDrawXB[2]=FDrawXB+IDrawXPos1B IDrawYB[2]=FDrawYB-IDrawYPos1B IDrawXB[3]=FDrawXB-IDrawXPos2B IDrawYB[3]=FDrawYB-IDrawYPos2B ;VARIABLENDEKLARATIONEN Local IDrawXCenter# Local IDrawYCenter# ;QUADKOLLISION[A>B]/VORBEREITEN IDrawXCenter=(IDrawXA[0]+IDrawXA[1]+IDrawXA[2]+IDrawXA[3])*0.25 IDrawYCenter=(IDrawYA[0]+IDrawYA[1]+IDrawYA[2]+IDrawYA[3])*0.25 ;QUADKOLLISION/BERECHNEN+ANWENDEN If (IDrawYB[1]-IDrawYB[0])*(IDrawXCenter-IDrawXB[1])-(IDrawXB[1]-IDrawXB[0])*(IDrawYCenter-IDrawYB[1])>0 Then If (IDrawYB[2]-IDrawYB[1])*(IDrawXCenter-IDrawXB[2])-(IDrawXB[2]-IDrawXB[1])*(IDrawYCenter-IDrawYB[2])>0 Then If (IDrawYB[3]-IDrawYB[2])*(IDrawXCenter-IDrawXB[3])-(IDrawXB[3]-IDrawXB[2])*(IDrawYCenter-IDrawYB[3])>0 Then If (IDrawYB[0]-IDrawYB[3])*(IDrawXCenter-IDrawXB[0])-(IDrawXB[0]-IDrawXB[3])*(IDrawYCenter-IDrawYB[0])>0 Then Return True End If End If End If End If ;QUADKOLLISION[B>A]/VORBEREITEN IDrawXCenter=(IDrawXB[0]+IDrawXB[1]+IDrawXB[2]+IDrawXB[3])*0.25 IDrawYCenter=(IDrawYB[0]+IDrawYB[1]+IDrawYB[2]+IDrawYB[3])*0.25 ;QUADKOLLISION/BERECHNEN+ANWENDEN If (IDrawYA[1]-IDrawYA[0])*(IDrawXCenter-IDrawXA[1])-(IDrawXA[1]-IDrawXA[0])*(IDrawYCenter-IDrawYA[1])>0 Then If (IDrawYA[2]-IDrawYA[1])*(IDrawXCenter-IDrawXA[2])-(IDrawXA[2]-IDrawXA[1])*(IDrawYCenter-IDrawYA[2])>0 Then If (IDrawYA[3]-IDrawYA[2])*(IDrawXCenter-IDrawXA[3])-(IDrawXA[3]-IDrawXA[2])*(IDrawYCenter-IDrawYA[3])>0 Then If (IDrawYA[0]-IDrawYA[3])*(IDrawXCenter-IDrawXA[0])-(IDrawXA[0]-IDrawXA[3])*(IDrawYCenter-IDrawYA[0])>0 Then Return True End If End If End If End If ;VARIABLENDEKLARATIONEN Local IDrawACount% Local IDrawBCount% Local IDrawADrive% Local IDrawBDrive% Local IDrawLIA# Local IDrawLI1# Local IDrawLI2# ;ALLE[B]PRODUKTE For IDrawBCount=0 To 3 IDrawBDrive=(IDrawBCount+1) Mod 4 ;ALLE[A]PRODUKTE For IDrawACount=0 To 3 IDrawADrive=(IDrawACount+1) Mod 4 ;LINES/INTERSECTS/DURCHFÜHREN IDrawLIA=(IDrawXA[IDrawADrive]-IDrawXA[IDrawACount])*(IDrawYB[IDrawBDrive]-IDrawYB[IDrawBCount])-(IDrawXB[IDrawBDrive]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawADrive]-IDrawYA[IDrawACount]) IDrawLI1=((IDrawXB[IDrawBDrive]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawACount]-IDrawYB[IDrawBCount])-(IDrawXA[IDrawACount]-IDrawXB[IDrawBCount])*(IDrawYB[IDrawBDrive]-IDrawYB[IDrawBCount]))/IDrawLIA IDrawLI2=((IDrawXA[IDrawADrive]-IDrawXA[IDrawACount])*(IDrawYA[IDrawACount]-IDrawYB[IDrawBCount])-(IDrawXA[IDrawACount]-IDrawXB[IDrawBCount])*(IDrawYA[IDrawADrive]-IDrawYA[IDrawACount]))/IDrawLIA If IDrawLI1=>0 And IDrawLI1=<1 And IDrawLI2=>0 And IDrawLI2=<1 Then Return True Next Next End Function Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast eine Playerposition Spieler\Px, Spieler\Py welches auch gleich das negative OFFSET für deine Schüsse sein muß. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
??? Und OFFSET bedeutet was?
Sorry |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ein Schuss auf X-Position=200 erstellt wird, und der Player/die Map sich auf X=250 befindet, dann muß der Schuss auf X=-50 eingezeichnet werden. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm... und das gleiche dann wohl auch mit der y-achse?
Also im Prinzip muss man alles relativ zur spielerposition verschieben? Lg, M0rgenstern |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo du subthrahierst alle Positionen auf der Karte mit der ScrollX/Y Variable .
Beispiel : Code: [AUSKLAPPEN] ScrollX = -200
ScrollY = -300 Rect 20-ScrollX,30-ScrollY,30,30,0 Das soll ein Rechteck an der Absoluten Position 20/30 zeichnen (also die RICHTIGE Position auf der Karte). Damit das rechteck aber mit gescrollt wird muss man nur noch den X wert - ScrollX und den Y wert - ScrollY rechnen. Dann wird das rechteck an der festgelegen Position gezeichnet ob wohl es sich mit der Karte bewegt. Das musst du mit ALLEN Koordinaten machen (Schüssen/Player/Gegener etc.) die auf der Karte eine ABSOLUTE Position haben sollen. DInge wie HUD oder so können natürlich so bleiben X) mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm.. und woher weiß ich wie groß die SCrollx/y Variablen sein sollen?
Ich versteh das Prinzip zwar, aber irgendwie fällt mir die Umsetzung schwer. Momentan sieht das so aus: Code: [AUSKLAPPEN] Global Scroll_X = -200
Global Scroll_Y = -100 Code: [AUSKLAPPEN] Function AllesMalen()
For Gegner.TGegnerTest = Each TGegnerTest Drawimage3D(Gegner\GTImage, Gegner\GTx#-Scroll_X, Gegner\Gty#-Scroll_Y, 0, Gegner\GTWinkel, 1) Next For SChuss.TPlayerSchuss = Each TPlayerSchuss Drawimage3D(Schuss\PSImage, Schuss\PSx#-Scroll_X, SChuss\PSy#-SCroll_Y, 0, SChuss\PSWinkel, 1.5) Next For BlutPartikel.TPartikel = Each TPartikel Drawimage3d(BlutPartikel\PTIMage, BlutPartikel\PTx-SCroll_X, BlutPartikel\PTy-SCroll_Y, 0, BlutPartikel\PTIWinkel, BlutPartikel\PTGroesse) Next DrawImage3D(PlayerImage, Spieler\Px#-Scroll_x, Spieler\Py#-SCroll_y, 0, Spieler\PWinkel#, 1) Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1) ColorT3D(255, 10, 10, 1) DrawRect3D(GrasTile,0,0,Spieler\Px-SCroll_x,Spieler\Py-Scxroll_y,1024,768) Text3D(Schriftart, (-400), 300, "Waffe: " + Spieler\PGewWaffe\Wname) Text3D(Schriftart, (-400), 280, "Munition: " + Spieler\PGewWaffe\WMunition + "/" + Spieler\PGewWaffe\WMagazine, 0, 0, 0) Text3D(Schriftart, (260), 300, "Kills: " + Spieler\PKills, 0, 0, 0) End Function Aber es sieht nicht wirklich nach Scrollen aus. Lg, M0rgenstern |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn du eine playerposition hast die auf der map liegt dann sagst du einfach
Code: [AUSKLAPPEN] ScrollX = PlayerX
ScrollY = PlayerY Wenn dein Player aber immer in der Mitte des Bildschirmes gezeichnet wird und nur die map sich drunter her bewegen soll, dann musst du ScrollX und ScrollY statt der Player Position verändern. Nimm aber die Obene genannte variante, da musst du hinterher nicht mehr so viel umrechnen, da du ja die Positionen auf der Map kennst... mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
So...
Sorry. Aber ich bekomm das nicht in meinen SChädel. Also. Ich hab die SpielerVariable Spieler\Px und Spieler\Py Mein Spieler soll immer in der Mitte des Bildschirms bleiben. Also muss ich ihn auf 0/0 erstellen lassen und das dann auf die SCrollX SCrollY Variable übertragen. Und überall wo normalerweise Spieler\Px bzw Spieler\Py steht muss ich ScrollX bzw SCrollY einsetzen alleinschon für die Bewegung. Und beim Zeichnen muss ich die SCrollX und ScrollY Variablen auch noch mal von den X und Y Koordinaten der anderen Objetkte abziehen? Wenn ich das mache, dann sieht das irgendwie komisch aus und die Steuerung ist dann irgendwie auch fürn Arsch.... Ich versteh das irgendwie net so ganz. Wäre echt toll, wenn mir das bitte jemand erklären würde. Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um das mal etwas einfacher erklären zu können, nehme ich eine imaginäre Kamera ins Spiel.
Dafür gibt es natürlich viele verschiedene Scrollmöglichkeiten. So eine, dass erst dann die Map mit scrollt, wenn der Spieler schon eine Weile in eine Richtung gelaufen ist. Hat den Vorteil, dass die Map nicht immer rumscrollt, was in bestimmten Spielen hinderlich sein kann. In diesem Fall benutzt du zusätzlich zur Spielerposition nich eine Scrollposition. Diese gibt im grunde nichts anderes als die Kameraposition an. Kannst sie auch MapX / MapY nennen. Da nach deinen Angaben aber der Spieler immmer an Position 0/0 des Draw3D-Koordinatensystems sich befindet und kein Pixel weit sich davon entfernt, scrollt also die Map unter seinen Füssen durch. Das entspricht also eine negative 1:1 Bewegung der Spielerposition. In so einem Fall kannst du auf eine zusätzliche Scrollposition oder Mapposition, je nachdem wie du sie nennen magst verzichten. Du nimmst also direkt Spielerposition negativ auf die Scrollposition deiner Map. Das heisst: Befindet sich der Spieler auf X=+100, Y=+50, dann zeichnest du diesen ja trotzdem auf Bildschirmkoordinate 0/0, aber die Map muß ja nach X=-100, Y=-50 versetzt gezeichnet werden. Und natürlich auch alle Objekte die sich auf der Map befinden bewegen sich mit dem Boden mit. So Sachen wie Häuser, Bäume, Steine, Fahrzeuge, Kanonen und andere Gegner die sich von ihrem Standpunkt aus ja nicht unbeding bewegen müssen. Die Spielerposition beeinflusst also nicht unbedingt tatsächlich gezeichnete Spielerposition auf dem Bildschirm, jedoch schon die Scrollposition der Map, was im übrigen die Kameraposition entspricht. Und wenn nun ein Gegner rumballert, dann müssen natürlich seine Schüsse von da losfliegen, wo der jeweilige Gegner steht. Und diese wird auf dein Bildschirm auch abhängig der Spielerposition gezeichnet. Eine Kollisionsprüfung zeischen Spieler und Schüsse geht dann ganz ohne Zwischenwerte, da sich der Player schon auf X1/Y1 befindet und die Schüsse an X2/Y2. Kommt es zu einer Überlappungt, wurde getroffen. Die Scrollposition ist nur für das zeichnen da, nicht für weitere Berechnungen. Außer natürlich um den sichtbaren Bildschirmbereich so einzugrenzen, dass auch nur dieser gezeichnet wird. Komm nicht auf die Idee die ganze Map zu zeichnen wo man nur 1% von sieht. Wird kein Rechner gerne mit machen. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, danke. Vom Prinzip her hab ichs jetzt wirklich verstanden.
Habs auch versucht so umzusetzen, aber es sieht einfach scheiße aus. Je nachdem, wie ich mich bewege sieht es einfach so aus, als würden sich die anderen Sachen langsamer bewegen. Und der Spieler richtet sich auch nicht mehr richtig nach der Maus aus. Der Code sieht momentan so aus: Code: [AUSKLAPPEN] Function AllesMalen()
For Gegner.TGegnerTest = Each TGegnerTest Drawimage3D(Gegner\GTImage, Gegner\GTx#-Spieler\Px#, Gegner\Gty#-Spieler\Py#, 0, Gegner\GTWinkel, 1) Next For SChuss.TPlayerSchuss = Each TPlayerSchuss Drawimage3D(Schuss\PSImage, Schuss\PSx#-Spieler\Px#, SChuss\PSy#-Spieler\Py#, 0, SChuss\PSWinkel, 1.5) Next For BlutPartikel.TPartikel = Each TPartikel Drawimage3d(BlutPartikel\PTIMage, BlutPartikel\PTx-Spieler\Px#, BlutPartikel\PTy-Spieler\Py#, 0, BlutPartikel\PTIWinkel, BlutPartikel\PTGroesse) Next DrawImage3D(PlayerImage, 0, 0, 0, Spieler\PWinkel#, 1) Drawimage3d(MouseImage, MouseX3D, MouseY3D, 0, 0, 1) ColorT3D(255, 10, 10, 1) DrawRect3D(GrasTile,0,0,Spieler\Px#,Spieler\Py#,1024,768) Text3D(Schriftart, (-400), 300, "Waffe: " + Spieler\PGewWaffe\Wname) Text3D(Schriftart, (-400), 280, "Munition: " + Spieler\PGewWaffe\WMunition + "/" + Spieler\PGewWaffe\WMagazine, 0, 0, 0) Text3D(Schriftart, (260), 300, "Kills: " + Spieler\PKills, 0, 0, 0) End Function Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Je nachdem, wie ich mich bewege sieht es einfach so aus, als würden sich die anderen Sachen langsamer bewegen.
Da sehe ich aber nix falsches bei. Wenn die Schüsse sich nur wenig langsamer bewegen als der Spieler sich bewegen kann, was in vielen Spielen üblich aber total unrealistisch ist, kann eben so ein Effekt auftretten. Da hilft nur, die Schüsse schneller machen oder so zu lassen. Zitat: Und der Spieler richtet sich auch nicht mehr richtig nach der Maus aus.
Und das heisst nun genau? Richtet sich der Spieler nur ungefähr zur Maus hin, oder total falsch? Hängt es vielleicht mit der Spielerposition zusammen? Wenn ja, dann lass den Spieler per Atan2 ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, wegen den ganzen Objekten:
Die Gegner werden mitten im Spielfeld erzeugt. Da muss ich dann wohl ne komplett andere Position berechnen lassen. Und wenn ich mich bewege, dann wirkt das ganze so gepresst, und die Blutlachen die fest aufm Boden sind sehen auch aus, als ob sie sich bewegen würden. Also, es sieht sehr komisch aus. Ist aber blöd zu beschrieben. Ich versuch mal irgendwie ein ScreenVid zu machen später. Wegen der Maus: Am Anfang stimmts noch. Dann aber wird sie wenn ich die Maus etwas schneller bewege und den Spieler bewege, immer ungenauer, steht also irgendwann etwa 20° neben dem SPieler. Oder wenn ich Vor dem Spieler bin mit der Maus, die Maus auf den SPieler zubewege und dann hinter den Spieler bewege, dreht sich der Spieler nicht mehr in diese Richtung mit. So mein ich das. Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du die Map zeichnest, dann die Spielerposition änderst und dann noch im selben Loop die Gegner und dynmische Flecken zeichnest, wirst du bewegende Flecken auf den Boden haben, da im selben gezeichnetem Frame unterschiedliche Zeit dargestellt wird. Im grunde einmal die Vergangenheit und einmal die Gegenwart. Aus diesem Grund sollten erst alle Usereingeben abgefragt und verarbeitet werden, dann erst das ganze zeichnen.
Zu der Maus hab ich nun zwei Theorien von Fehlern die du machst: 1: Wenn die Maus gezeichnet wird, entspricht dessen Koordinatenposition der Mitte der Maus. Wenn du nun ein Bild grabbst wo der Zeiger (also die Spitze der Maus) nicht in der Mitte des Bildes ist, wird ein Versatz drin sein. Du musst also dieses OFFSET mit in Atan2 einbeziehen, oder du grabbst gleich die Maus größer mit transparenten Teil nebenan um zu gewehrleisten, dass die Mausspitze auch in der Mitte des Bildes liegt, oder du erstellst gleich ein Maussymbol wo der Zeiger auch in der Mitte des Bildes sitzt. Also ein Kreuz oder so. 2: Deine von dir gemachte Mapposition wird von der Draw3D ja logischer Weise nicht berüksichtigt. Soll heissen, wenn die Map/der Spieler auf X=100/Y=50 steht, dann haben die Koordinaten MouseX3D/MouseY3D ja nicht automatisch X+100/Y+50 zu den sonstigen Werten. Das heisst, es gilt die tatsächlich eingezeichnete Bildschirmkoordinaten mit einzubeziehen. In deinem Fall wird dann SpielerWinkel=Atan2(MouseX3D,MouseY3D) das richtige sein. Eventuell noch -90°, +90° oder +180°, was aber von deinem Bildern abhängt. Wenn es das nicht ist, dann kann ich dir aufgrund der spärlichen Problembeschreibung auch nicht weiter helfen. Dazu benötige ich dann den Code mit Mediadaten um es lauffähig auf mein System zu haben. Wie per PN schon leicht angedeutet rate ich dir generell aber erst ein einfacheres Spiel zu programmieren. Wenn du schon mit den wirklich einfachsten Offsets, Dreisatz und Winkelberechnungen so ein Problem mit hast, solltest du erstmal was anderes machen. Ist nur ein gut gemeinter Rat von mir. Sonst frustet das ganze zu sehr. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich hab jetzt mal alles hochgeladen.
https://www.blitzforum.de/upload/file.php?id=6996 Ich zeichne das ganze im selben Loop. Aber erst wird alles verarbeitet und dann alles gezeichnet. Wegen der Maus, ich glaube, da liegts dran, dass ich eigentlich die SpielerPosition nicht mehr mit einberechnen dürfte. Kannst die ja das agnze mal angucken, eventuell noch oben auf Vollbild umstellen, so hab ichs auch die ganze Zeit. Lg, M0rgenstern |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil du anscheinend nicht eines der zuletzt genannten Punkte von uns behoben oder angerührt hast, gebe ich dir nun nur die Codezeilen zu die du ändern musst damit alles 100%ig richtig funktioniert. Denn wenn ich dir jetzt den fertigen Code zuteile, wirst du nichts davon gelernt haben.
Codezeile : 124 ändern Codezeile : 342 ändern Codezeilen : 135 und 141 tauschen Wenn du dann alles richtig gemacht hast, funktioniert sowohl die Spielerdrehung, das Mapscrolling als auch die Tastaturnavigation richtig. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey.
Erstmal: Danke wegen den Zeilen 135 und 141... Das ist mir gar nicht aufgefallen (und nem Kumpel ders schon "gespielt" hat auch nicht^^). Wegen den anderen Sachen: Das mit der Maus funktioniert jetzt. Ich musste noch die Begrenzungen für die SChüsse und den Spieler größer stellen, da das Feld in dem sich beides bewegen konnte (logischerweise) nur halb so groß war wie der Bildschirm, da ja alles noch auf die Hälfte (also ohne Scrolling) eingestellt war. Die Zeile 342 hab ich jetzt so geändert: Code: [AUSKLAPPEN] DrawRect3D(GrasTile,0,0,(-Spieler\Px#),(-Spieler\Py#),1024,768)
Ich geh mal davon aus, dass das stimmt. Wobei ich mir nicht ganz sicher bin. Das ganze gescrolle (vor allem was die Blutflecken angeht) sieht immernoch sehr seltsam aus. Es sieht so aus, als würde der Boden sich unter den Flecken schneller bewegen als die Flecken selbst. Oder liegt das vielleicht an der Tile? Denn wenn ich die Zeile 342 auskommentiere, dann sieht das ganze (auf schwarzem Untergrund) so aus, wie es aussehen soll. Vielen Dank für deine Hilfe. Find ich besser, dass man mir sagt, wo meine Fehler liegen, anstatt dass man mir ausgebesserten Code vor die Nase wirft. Dann seh ichs wenigstens nochmal. Lg, M0rgenstern |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich geb dir einen Tipp : Speicher die ScrollX/Y Koordinaten seperat ab. Also nicht direkt die Positionen des Spielers auf die Scroll Koordinaten beziehen. Was ist wenn der Spieler bzw. Tot ist ? Dann will man sichja weiter auf der Map bewegen können (rum gucken). Damit man dazu aber nicht den Player bewegen muss, speichert man die ScrollX/Y werte zwischen, und zwar sO :
Code: [AUSKLAPPEN] ;In der Schleife
ScrollX = player\Px#-GraphicsWidth/2.0 ScrollY = player\Py#+GraphicsHeight/2.0 Dann hast du den Player immer in der Mitte und kannst,wenn der Spieler toto ist, die Map zum beispiel anhand der MausXSpeed/YSpeed bewegen : Code: [AUSKLAPPEN] ;Wenn der spieler tot ist
ScrollX = ScrollX + MouseXSpeed() ScrollY = ScrollY + MouseYSpeed() MoveMouse GraphcisWidth/2.0,GraphcisHeight/2.0 Dann musst du nur noch beim malen des Grasstiles folgendes machen :Code: [AUSKLAPPEN] DrawRect3D(GrasTile,0,0,(-ScrollX),(-ScrollY),1024,768)
Auch kannst du damit ein nachziehen der "kamera" simulieren, aber ich denke das brauchst du alles nicht. Nur als tipp, mach es so wie ichs beschreieben habe, dann hast du hinterher keine Probleme mehr , wenn du etwas einbauen möchtest, was so nicht klappen kann.. mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte es wie folgt geändert:
124 Code: [AUSKLAPPEN] Spieler\PWinkel#=ATan2(-MouseX3D,-MouseY3D) ;Blickrichtung
342 Code: [AUSKLAPPEN] DrawRect3D(GrasTile,0,0,Spieler\Px#,-Spieler\Py#,1024,768,0,0,1)
|
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ hectic. Bin jetzt bei nem Kumpel, hab das ganze Zeugs aber dabei, kanns also gleich mal ausprobieren. Dann kann ich dir bescheid sagen. Dankeschön.
@ Toeb. Also, dass die Kamera nachzieht will ich nicht. Und dass man die Kamera bewegen kann, wenn man tot ist, will ich auch nicht. Man soll sich nicht die Karte angucken können. Dann geht doch der Überraschungseffekt verloren. Außerdem hab ich mir schon was lustiges überlegt, was passiert, wenn der Spieler tot ist. Dann wird man eh nichts mehr sehen^^ Lg, M0rgenstern Edit1: So... mehr Stress mit dem blöden PC vom Kumpel gehabt als gedacht. Bin jetzt erst wieder da und kann das ändern. Dieses eine Minuszeichen vor dem Spieler\Px... Dieses eine Zeichen hat das ausgemacht... Vielen Dank Hectic. Und auch Danke an die anderen^^ Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group