Schüsse im 3D-Game

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Merier

Betreff: Schüsse im 3D-Game

BeitragDo, Okt 30, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bins mal wieda Very Happy

Ich habe schonmal ein kleines 3d Spiel programmiert worinn man auch schießen kann.Das klappt auch alles ganz gut.So nun habe ich die Frage:" Wie kann ich es machen das wenn ich schieße das mein Freund das bei sich sieht? und andersrum ?"

Ich hoffe ihr könnt helfen Laughing

Hier ist der jetzige Code:

Code: [AUSKLAPPEN]


;Copright (C) 2008 by Merier

Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Global LastPing, PingTime, Modus, Stream, ServerIP, MeineID

Global Counter = 0

Global ServerPort = 56000

Const NewPlayer  = 1
Const NewPlayer2 = 2
Const MovePlayer = 3
Const Msg        = 4
Const Ping       = 5
Const PingAnswer = 6
Const AskForID   = 7
Const IDAnswer   = 8

Type Player
   Field IP, Port
   Field Mesh
   Field Bull
   Field ID
   Field x#, y#, z#, yaw
End Type

Type Bull
Field Shot
End Type

Global s.Bull


While Not KeyHit(211)
main()
Wend

Function main()

n = CountHostIPs("")
MeineIP = HostIP(1)

Modus =  Input("0 = Server  |  1 = Client : ")

If Modus Then
   ;ServerIP=INT_IP(Input("IP des Anderen? "))
   ;If ServerIP < 10 Then ServerIP = INT_IP("127.0.0.1")
   ServerIP = INT_IP("127.0.0.1")
   Stream=CreateUDPStream()
   WriteByte Stream, NewPlayer2
   SendUDPMsg Stream, ServerIP, ServerPort
   AppTitle "Client"
DebugLog "Client"
Else
   Stream=CreateUDPStream(ServerPort)
   AppTitle "Server"
DebugLog "Server"
End If

Timer = CreateTimer(60)
LastPing = MilliSecs()

Local PlayerLocal.Player = New Player
PlayerLocal\x# = 0
PlayerLocal\x# = 1
PlayerLocal\z# = 10
PlayerLocal\mesh=CreateCube()
ScaleEntity PlayerLocal\mesh,3,3,3
PositionEntity PlayerLocal\mesh,1600,110,1200
EntityColor PlayerLocal\mesh,0,0,55
EntityRadius PlayerLocal\mesh,1.3
EntityType PlayerLocal\mesh,4

Lives = LoadImage("gfx\Lives.bmp")

;Cube = CreateCube()
;PositionEntity Cube,1600,110,1200
;EntityType Cube,3
;ScaleEntity Cube,3,3,3
;EntityRadius Cube,1.2

;Sky = CreateCube()
;ScaleEntity Sky,50000,10000,50000

;SkyT = LoadTexture("gfx\Sterne.jpg")
;EntityTexture Sky,SkyT

Terrain = LoadTerrain("gfx\hmap.bmp")
ScaleEntity Terrain,20,180,20
EntityType Terrain,2
TextTerr = LoadTexture("gfx\TerrT.jpg")
EntityTexture Terrain,TextTerr

Cam = CreateCamera(PlayerLocal\mesh)
PositionEntity Cam,0,30,-30
EntityType Cam,1
EntityRadius Cam,4
TurnEntity Cam,30,0,0
CameraClsColor Cam, 0, 0, 50
CameraFogColor Cam,120,200,210
CameraFogRange Cam,1,10

water=CreatePlane()

Mirror = CreateMirror()

watertext=LoadTexture ("gfx\Wasser.bmp",5)
EntityTexture water,watertext
ScaleTexture watertext,100,200
MoveEntity water,0,50,0
EntityAlpha water,0.6

While Not KeyHit(211)
Cls

   Zahl = Zahl + 1
   If Zahl = 5 Then Zahl = 1

DrawImage Lives,20,20

MoveEntity PlayerLocal\mesh,0,-0.5,0

;RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0

;MoveMouse 512,384

;MoveEntity Cam,0,0,2

Collisions 1,2,2,2
Collisions 3,2,2,2
Collisions 4,2,2,2
Collisions 5,2,2,2

;If KeyDown(208) Then MoveEntity Cube,0,0,-1
;If KeyDown(200) Then MoveEntity Cube,0,0,1
;If KeyDown(203) Then TurnEntity Cube,0,2,0
;If KeyDown(205) Then TurnEntity Cube,0,-2,0
;If KeyDown(17)  Then MoveEntity Cube,0,0,2
;If KeyDown(31)  Then MoveEntity Cube,0,0,-2
If KeyHit(1)    Then End

For s.Bull = Each Bull
MoveEntity s\Shot, 0, 0, 5
Next

If MouseHit(1)
s = New Bull
s\Shot = CreateCube()
PositionEntity s\Shot, EntityX(PlayerLocal\mesh),EntityY(PlayerLocal\mesh),EntityZ(PlayerLocal\mesh)
TurnEntity s\Shot,EntityPitch(PlayerLocal\mesh),EntityYaw(PlayerLocal\mesh),EntityRoll(PlayerLocal\mesh)
EntityType s\Shot,5
EntityRadius s\Shot,0.5
EndIf


UpdateWorld
RenderWorld

 If True Then
   
      Pos# = PlayerLocal\x# + PlayerLocal\z# + PlayerLocal\Yaw
         If KeyDown(200)=True Then MoveEntity PlayerLocal\mesh,0,0,1
         If KeyDown(208)=True Then MoveEntity PlayerLocal\mesh,0,0,-1
         If KeyDown(205)=True Then TurnEntity PlayerLocal\mesh,0,-3,0
         If KeyDown(203)=True Then TurnEntity PlayerLocal\mesh,0,3,0

         PlayerLocal\x#  = EntityX#(PlayerLocal\Mesh)
         PlayerLocal\y#  = EntityY#(PlayerLocal\Mesh)
           PlayerLocal\z# = EntityZ#(PlayerLocal\Mesh)
           PlayerLocal\Yaw = EntityYaw(PlayerLocal\Mesh)
      Pos2# = PlayerLocal\x# + PlayerLocal\z# + PlayerLocal\Yaw

Ping()
     
      recv=RecvUDPMsg(Stream)
      While(recv<>0)
      While(ReadAvail(Stream)>0)
            In = 0
            In = ReadByte(Stream)
            InIP = UDPMsgIP(Stream)
            InPort = UDPMsgPort(stream)
                     
            Select In
            Case NewPlayer ;#################################
               P.Player = New Player
               P\ID = ReadInt(Stream)
               P\IP = InIp
               P\Mesh = CreateCube()
            P\Bull = CreateCube()
               EntityColor P\Mesh, 255,0,0
            ScaleEntity P\Mesh,3 ,3 ,3
               
               Case NewPlayer2 ;#################################
               Counter = Counter + 1
                 
               P.Player = New Player
               P\ID = Counter ;ReadInt(Stream)
               P\IP = InIp
               P\Port = InPort
               P\Mesh = CreateCube()
            P\Bull = CreateCube()
               EntityColor P\Mesh, 255,0,0
            ScaleEntity P\Mesh, 3, 3, 3
                 
               WriteByte Stream, IDAnswer
               WriteInt Stream, Counter
               SendUDPMsg Stream, InIP, InPort

      For P.Player = Each Player
                  If p <> playerlocal And p\id <> counter
                     WriteByte Stream, NewPlayer
                     WriteInt Stream, Counter
                     SendUDPMsg Stream, P\Ip, P\Port
                  EndIf
               Next
                 
              ; Dem neuen Spieler alle bestehenden übergeben
               For P.Player = Each Player
                  If p\id <> counter
                     WriteByte Stream, NewPlayer
                     WriteInt Stream, P\ID
                     SendUDPMsg Stream, InIp, InPort
                  EndIf
               Next

Case MovePlayer ;#################################
               X# = ReadFloat(Stream)
               Y# = ReadFloat(Stream)
               Z# = ReadFloat(Stream)
               Turn = ReadInt(Stream)
               AktuelleID = ReadInt(Stream)
             
               If Modus = 0 Then
                  For P.Player = Each Player
                           If AktuelleID <> P\ID And p<>playerlocal Then
                        WriteByte Stream, MovePlayer
                        WriteFloat Stream, X#
                        WriteFloat Stream, Y#
                        WriteFloat Stream, Z#
                        WriteInt Stream, Turn
                        WriteInt Stream, AktuelleID
                        SendUDPMsg Stream, P\IP, P\Port
                     End If
                           
                     If AktuelleID = P\ID Then
                              P\x# = x#
                             P\y# = y#
                             P\z# = z#
                              P\yaw = turn
                        Exit
                           End If
                        Next
               Else
                  For P.Player = Each Player
                        If P\ID = AktuelleID Then
                           P\x# = x#
                           P\y# = y#
                           P\z# = z#
                           P\yaw = turn
                     Exit
                        End If
               Next
            End If
                 
            Case Msg ;#################################
               Text 0,20, "Incoming: "+ReadInt(Stream)
                 
            Case Ping ;#################################
               WriteByte Stream, PingAnswer
               SendUDPMsg Stream, InIP, InPort
                 
            Case PingAnswer ;#################################
               PingTime = MilliSecs() - PingTime
                 
               ;Case AskForID ;#################################
               ;   WriteByte stream, IDAnswer
               ;   WriteByte stream, GetID(InIP)
               ;   SendUDPMsg stream, InIP, 6001-modus   
               
            Case IDAnswer ;#################################
               MeineID = ReadInt(Stream)
                    playerlocal\id = meineID
                 
            End Select
         Wend
         recv=RecvUDPMsg(Stream)
      Wend

 If Pos# <> Pos2# Then
         If Modus = 1 Then
            WriteByte Stream, MovePlayer
           WriteFloat Stream, PlayerLocal\x#
           WriteFloat Stream, PlayerLocal\y#
           WriteFloat Stream, PlayerLocal\z#
           WriteInt Stream, PlayerLocal\yaw
         
         WriteInt Stream, MeineID
            SendUDPMsg Stream, ServerIP, ServerPort
         Else
            For P.Player = Each Player
               If p<>playerlocal
               WriteByte Stream, MovePlayer
                  WriteFloat Stream, PlayerLocal\x#
                  WriteFloat Stream, PlayerLocal\y#
                  WriteFloat Stream, PlayerLocal\z#
               WriteInt Stream, PlayerLocal\yaw
               WriteInt Stream, meineID
               SendUDPMsg Stream, P\IP, P\Port
            EndIf
            Next
         End If   
      End If
   EndIf

   Text 0,100, EntityX(PlayerLocal\mesh);   + "  " + PlayerLocal\x#
   Text 0,130, EntityZ(PlayerLocal\mesh);   + "  " + PlayerLocal\z#
   Text 0,160, EntityYaw(PlayerLocal\mesh);  + "  " + PlayerLocal\Yaw
   
   For p.player = Each Player
      PositionEntity P\Mesh, P\X#, P\Y#, P\Z#
      RotateEntity P\Mesh, 0, P\Yaw, 0
   Next
   
   If Modus = 0 Then Text 0,250, "Spieler: " + Counter
   If Modus Then Text 0,200, "Meine ID: " + MeineID
   If Modus Then Text 0,5, "Ping: " + PingTime
   
   WaitTimer Timer
   Flip 0
Wend

CloseUDPStream Stream

FreeEntity Terrain
FreeEntity PlayerLocal\mesh
FreeImage watertext
FreeImage TextTerr
FreeImage Lives
FreeImage Terrain
FreeEntity water
FreeEntity Mirror

End Function

Function GetID(IP)
   For p.Player = Each Player
      If P\IP = IP Then Return P\ID
   Next
End Function


Function Ping()
   If (LastPing - MilliSecs() ) > 30000 And Modus > 0 Then RuntimeError "Zeitüberschreitung!"
   If Modus And (MilliSecs() - LastPing > 999) Then
      WriteByte Stream, Ping
      SendUDPMsg(Stream,ServerIP,ServerPort)
      PingTime = MilliSecs()
      LastPing = PingTime
   End If
End Function


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function

Nicdel

BeitragDo, Okt 30, 2008 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code kommt mir irgentwie bekannt vor... Egal. Du hast einen Type für deine Schüsse. Jetzt muss bei jedem Schuss die Position, der Winkel und die Geschwindigkeit des Schusses zum Mitspieler übertragen werden.
 

Merier

BeitragDo, Okt 30, 2008 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Danke! könntest du oder jemand anders vllt diese Sachen mit einbauen in meinen Code?
Währe euch sehr dankbar weil ich es nicht hinbekomme Embarassed

peacemaker

BeitragDo, Okt 30, 2008 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann lass es und mach was anderes. Es wird dir kaum einer etwas in deinem Code schreiben, weil du, der Ersteller, es nicht hinkriegst.

mfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

The_Nici

BeitragDo, Okt 30, 2008 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Merier weisst du überhaupt was der Code macht?

MfG
 

Merier

BeitragDo, Okt 30, 2008 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja kla weiß ich das! Der Code verschickt die Coordinaten der Spieler an die anderen Clienten weiter und diese erstellen jeweils an diesen Coordinaten die Mesh etc..

ozzi789

BeitragDo, Okt 30, 2008 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso fragst du den das, is ja genau das gleiche mit den Schüssen Laughing
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Merier

BeitragDo, Okt 30, 2008 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon aber ich weiß net genau wie das geht weil man mehrere Coordinaten abschicken muss und dann müssen die Schüsse auch noch vor dem gegnerischen Spieler positioniert werden und dann auch noch ind die richtige Richtung gedreht und bewegt werden und ich weiß net genau wie das geht.

ozzi789

BeitragDo, Okt 30, 2008 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Beispiel aus der Hilfe, so kannst du die Schüsse "verwalten"
erstell einfach ne entity mit dem schuss und beweg die mit moveentity im richtigen winkel in die richtige Richtung in dem du X,Y,Z benützt

Den richtigen Winkel kann man mit den Trigeometrischen Befehel ausrechnen, also cos sin usw Razz

Must noch ein wenig umschreiben Wink
Code: [AUSKLAPPEN]
 Type crafts
   Field x
   Field y
   Field dead
   Field graphic
End Type

For t = 1 To 5
   alien.crafts = New crafts
   alien\x = Rnd (0,640)
   alien\y = Rnd (0,480)
   alien\dead = 0
   alien\graphic = 1
Next

For alien.crafts = Each crafts
   Print alien\x
   Print alien\y
   Print alien\dead
   Print alien\graphic
   Print "-----------"
Next

WaitKey
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Merier

BeitragDo, Okt 30, 2008 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das Beispiel ich werds mal ausprobieren^^ Very Happy Very Happy

ToeB

BeitragDo, Okt 30, 2008 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mach das immer so das ich eine Variable für jeden Spieler habe, shoot, die wie die eigenen Koordinaten immer an die anderen mit versendet werden. Wird jetzt geschossen (ein schuss erstellt) wird die eignen Variable auf 1 gesetzt, und beim nächsten senden versendet und wider auf 0 gesetzt. Wenn jetzt ein Spieler von einem anderen den Shoot wert 1 erhält, erstellt dieser einfach einen neuen Schuss-Type an der aktuellen Position / Winkel der Spielers... Fertig Very Happy

Also wenn du den code WIRKLICH verstehst (also nicht nur weißt was er macht sondern auch weiß wie er funktioniert) dann müsste das kein porblem sien Wink


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!

BladeRunner

Moderator

BeitragFr, Okt 31, 2008 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal im ernst, ich find es gerade zu dreist hier mit dem Code eines anderen anzukommen (siehe dazu https://www.blitzforum.de/foru...hp?t=28275 ), frechweg sein eigenes CopyRight drüber zu setzen und dann alle anderen zu bitten einen Code den man selbst nicht verstanden hat um das gewünschte zu ergänzen.

Daher kann ich nur allen hier empfehlen hier NICHT weiterzuhelfen, wer mit fremden Fürzen stinkt sollte ja auch die Zutaten des Menus davor blind beherrschen.

Ach ja, Merier, sollte ich Dich bei einem weiteren Verstoß dieser Richtung erwischen werde ich dir eine Verwarnung zukommen lassen.
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

Nicdel

BeitragFr, Okt 31, 2008 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Daher kam mir der Code so bekannt vor...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group