Castle zu zweit?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

AlexRath

Betreff: Castle zu zweit?

BeitragSa, Jul 14, 2007 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, Leute!
Versuche aus dem 3D Spiel "Castle" ein Multiplayerspiel zu machen. Dachte an eine Verbindung, wo immer die Daten (x,y,z) vom Spieler übertragen werden... Also im lokalem Netzwerk. Das einzige Problem: Wenn ich eine Taste drücke, bewegen sich beide Spieler... Crying or Very sad Das soll aber nicht sein. Mein momentaner Blitz3D-Code:

Code: [AUSKLAPPEN]

;The castle demo!
Const FPS=30
Const n_trees=100

Global info1$="Die Burg"
Global info2$="Kennen sie Frank? Nein?!"
Global info3$="Dann lernen sie ihn in diesem Spiel kennen."
Global info4$="A und Y zum Laufen, Leertaste zum Springen, Alt-Links zum Feuern"

Include "../start.bb"

Global shoot=Load3DSound( "sounds\shoot.wav" )
Global boom=Load3DSound( "sounds\boom.wav" )
SoundVolume boom,.5

Type Player
   Field entity,model
   Field anim_speed#,player_y#,roll#
End Type

Type ChaseCam
   Field entityn,entity,camera,target,heading,sky
End Type

Type Spark
   Field alpha#,sprite
End Type

Type Bullet
   Field rot#,sprite,time_out
End Type

Type Hole
   Field alpha#,sprite
End Type

Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3,TYPE_SCENERY=10,TYPE_TERRAIN=11

Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3
Collisions TYPE_PLAYER,TYPE_SCENERY,2,2
Collisions TYPE_BULLET,TYPE_TERRAIN,2,1
Collisions TYPE_BULLET,TYPE_SCENERY,2,1
Collisions TYPE_TARGET,TYPE_TERRAIN,2,2
Collisions TYPE_TARGET,TYPE_SCENERY,2,2

Global light,castle,land,ground,water,sky
Global spark_sprite,bull_sprite,player_model,hole_sprite,tree_sprite, player2model
Global water_level=-2,bull_x#=1.5

Setup()

ChangeDir "environ"
LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" )
ChangeDir "..\"

player1.Player=CreatePlayer( 0,10,0 )
player2.Player=CreatePlayer2( 10,10,0 )
camera1.ChaseCam=CreateChaseCam( player1\entity )

period=1000/FPS
time=MilliSecs()-period

listener=CreateListener( player1\entity,.1,1,.2 )

While Not KeyHit(1)
   If KeyHit(17)
      wire=Not wire
      Wireframe wire
   EndIf
   Repeat
      elapsed=MilliSecs()-time
   Until elapsed

   ;how many 'frames' have elapsed   
   ticks=elapsed/period
   
   ;fractional remainder
   tween#=Float(elapsed Mod period)/Float(period)
   
   For k=1 To ticks
      time=time+period
      If k=ticks Then CaptureWorld

      UpdateGame()
      UpdateWorld
      PositionEntity water,Sin(time*.01)*10,water_level+Sin(time*.05)*.5,Cos(time*.02)*10
      For c.ChaseCam=Each ChaseCam
         UpdateChaseCam( c )
         PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
      Next
   Next
   
   RenderWorld tween
   Flip
Wend
End

Function UpdateGame()
   For h.Hole=Each Hole
      UpdateHole( h )
   Next
   For b.Bullet=Each Bullet
      UpdateBullet( b )
   Next
   For s.Spark=Each Spark
      UpdateSpark( s )
   Next
   For p.Player=Each Player
      UpdatePlayer( p )
   Next
End Function

Function UpdateHole( h.Hole )
   h\alpha=h\alpha-.005
   If h\alpha>0
      EntityAlpha h\sprite,h\alpha
   Else
      FreeEntity h\sprite
      Delete h
   EndIf
End Function


Function Createplayer.Player( x#,y#,z# )
   p.player=New Player
   p\entity=CreatePivot()
   p\model=CopyEntity( player_model,p\entity )
   p\player_y=y
   PositionEntity p\entity,x,y,z
   EntityType p\entity,TYPE_PLAYER
   EntityRadius p\entity,1.5
   ResetEntity p\entity
   Return p
End Function

Function Createplayer2.Player( x#,y#,z# )
   n.player=New Player
   n\entity=CreatePivot()
   n\model=CopyEntity( player2model,n\entity )
   n\player_y=y
   PositionEntity n\entity,x,y,z
   EntityType n\entity,TYPE_PLAYER
   EntityRadius n\entity,1.5
   ResetEntity n\entity
   Return n
End Function

Function CreateBullet.Bullet( p.Player )
   bull_x=-bull_x
   b.Bullet=New Bullet
   b\time_out=150
   b\sprite=CopyEntity( bull_sprite,p\entity )
   TranslateEntity b\sprite,bull_x,1,.25
   EntityParent b\sprite,0
   EmitSound shoot,b\sprite
   Return b
End Function

Function UpdateBullet( b.Bullet )
   If CountCollisions( b\sprite )
      If EntityCollided( b\sprite,TYPE_TERRAIN )
         EmitSound boom,b\sprite
         ex#=EntityX(b\sprite)
         ey#=EntityY(b\sprite)
         ez#=EntityZ(b\sprite)
         TFormPoint( ex,ey,ez,0,land )
         hi#=TerrainHeight( land,TFormedX(),TFormedZ() )
         If hi>0
            hi=hi-.02:If hi<0 Then hi=0
            ModifyTerrain land,TFormedX(),TFormedZ(),hi,True
         EndIf
         CreateSpark( b )
         FreeEntity b\sprite
         Delete b
         Return
      EndIf
      If EntityCollided( b\sprite,TYPE_SCENERY )
         For k=1 To CountCollisions( b\sprite )
            If GetEntityType( CollisionEntity( b\sprite,k ) )=TYPE_SCENERY
               cx#=CollisionX( b\sprite,k )
               cy#=CollisionY( b\sprite,k )
               cz#=CollisionZ( b\sprite,k )
               nx#=CollisionNX( b\sprite,k )
               ny#=CollisionNY( b\sprite,k )
               nz#=CollisionNZ( b\sprite,k )
               th.Hole=New Hole
               th\alpha=1
               th\sprite=CopyEntity( hole_sprite )
               PositionEntity th\sprite,cx,cy,cz
               AlignToVector th\sprite,-nx,-ny,-nz,3
               MoveEntity th\sprite,0,0,-.1
               Exit
            EndIf
         Next
         EmitSound boom,b\sprite
         CreateSpark( b )
         FreeEntity b\sprite
         Delete b
         Return
      EndIf
   EndIf
   b\time_out=b\time_out-1
   If b\time_out=0
      FreeEntity b\sprite
      Delete b
      Return
   EndIf
   b\rot=b\rot+30
   RotateSprite b\sprite,b\rot
   MoveEntity b\sprite,0,0,2
End Function

Function CreateSpark.Spark( b.Bullet )
   s.Spark=New Spark
   s\alpha=-90
   s\sprite=CopyEntity( spark_sprite,b\sprite )
   EntityParent s\sprite,0
   Return s
End Function

Function UpdateSpark( s.Spark )
   If s\alpha<270
      sz#=Sin(s\alpha)*5+5
      ScaleSprite s\sprite,sz,sz
      RotateSprite s\sprite,Rnd(360)
      s\alpha=s\alpha+15
   Else
      FreeEntity s\sprite
      Delete s
   EndIf
End Function

Function UpdatePlayer( p.Player )
   If KeyHit(56)   ;fire?
      CreateBullet( p )
   EndIf
   If KeyDown(203)   ;left/right
      TurnEntity p\entity,0,6,0   ;turn player left/right
   Else If KeyDown(205)
      TurnEntity p\entity,0,-6,0
   EndIf
   If KeyDown(30)      ;forward
      If p\anim_speed<=0
         p\anim_speed=1.75
         Animate p\model,1,p\anim_speed
      EndIf
      MoveEntity p\entity,0,0,1
   Else If KeyDown(44)   ;back
      If p\anim_speed>=0
         p\anim_speed=-1.75
         Animate p\model,1,p\anim_speed
      EndIf
      MoveEntity p\entity,0,0,-1
   Else If p\anim_speed   ;stop animating
      p\anim_speed=0
      Animate p\model,0
   EndIf

   ty#=EntityY(p\entity)
   y_vel#=(ty-p\player_y)
   p\player_y=ty
   
   If KeyHit(57)   ;jump?
      y_vel=5   ;2.4
   Else
      y_vel=y_vel-.5   ;2
   EndIf
   TranslateEntity p\entity,0,y_vel,0
End Function

Function CreateChaseCam.ChaseCam( entity )
   c.ChaseCam=New ChaseCam
   c\entity=entity
   c\camera=CreateCamera()
   
   c\target=CreatePivot( entity )
   PositionEntity c\target,0,3,-10
   EntityType c\target,TYPE_TARGET
   
   c\heading=CreatePivot( entity )
   PositionEntity c\heading,0,0,20
   c\sky=CopyEntity( sky )
   Return c
End Function

Function UpdateChaseCam( c.ChaseCam )
   If KeyDown(200)
      TranslateEntity c\heading,0,-3,0
   Else If KeyDown(208)
      TranslateEntity c\heading,0,+3,0
   EndIf
   
   dx#=EntityX(c\target,True)-EntityX(c\camera,True)
   dy#=EntityY(c\target,True)-EntityY(c\camera,True)
   dz#=EntityZ(c\target,True)-EntityZ(c\camera,True)
   
   TranslateEntity c\camera,dx*.1,dy*.1,dz*.1
   
   PointEntity c\camera,c\heading
      
   PositionEntity c\target,0,0,0
   
   PositionEntity c\target,0,3,-10

   PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
End Function

Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ )
   light=CreateLight()
   TurnEntity light,45,45,0
   
   land_tex=LoadTexture( land_tex$,1 )
   ScaleTexture land_tex,10,10

   land=LoadTerrain( height_map$ )
   EntityTexture land,land_tex
   
   TerrainShading land,True
   PositionEntity land,-1000,-100,-1000
   ScaleEntity land,2000.0/256,100,2000.0/256
   EntityType land,TYPE_TERRAIN
   TerrainDetail land,750,True
   
   For k=1 To n_trees
      Repeat
         tx#=Rnd(-70,70)-150
         tz#=Rnd(-70,70)+400
         ty#=TerrainY( land,tx,0,tz )
      Until ty>water_level
      t=CopyEntity( tree_sprite )
      PositionEntity t,tx,ty,tz
      ScaleSprite t,Rand(2,3),Rand(4,6)
   Next
   
   ground=CreatePlane()
   EntityTexture ground,land_tex
   PositionEntity ground,0,-100,0
   EntityOrder ground,9
   
   water_tex=LoadTexture( water_tex$,3 )
   ScaleTexture water_tex,20,20
   
   water=CreatePlane()
   EntityTexture water,water_tex
   PositionEntity water,0,water_level,0
      
   sky=LoadSkyBox( sky_tex$ )
   EntityOrder sky,10
   HideEntity sky

End Function

Function LoadSkyBox( file$ )
   m=CreateMesh()
   ;front face
   b=LoadBrush( file$+"_FR.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
   AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3:
   FreeBrush b
   ;right face
   b=LoadBrush( file$+"_LF.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
   AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;back face
   b=LoadBrush( file$+"_BK.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
   AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;left face
   b=LoadBrush( file$+"_RT.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
   AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;top face
   b=LoadBrush( file$+"_UP.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
   AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;bottom face   
   b=LoadBrush( file$+"_DN.jpg",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
   AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ScaleMesh m,100,100,100
   FlipMesh m
   EntityFX m,1
   Return m
End Function

Function Setup()
   castle=LoadMesh( "castle\castle1.x" )
   ScaleEntity castle,.15,.15,.15
   EntityType castle,TYPE_SCENERY

   player_model=LoadAnimMesh( "markio\mariorun.x" )
   player2model=LoadAnimMesh( "markio\mariorun.x" )
   ScaleEntity player_model,.2,.2,.2
   TranslateEntity player_model,0,-1.25,0
   HideEntity player_model
    ScaleEntity player2model,.2,.2,.2
   TranslateEntity player2model,0,-1.25,0
   HideEntity player2model



   spark_sprite=LoadSprite( "sprites\bigspark.bmp" )
   HideEntity spark_sprite

   bull_sprite=LoadSprite( "sprites\bluspark.bmp" )
   ScaleSprite bull_sprite,3,3
   EntityRadius bull_sprite,1.5
   EntityType bull_sprite,TYPE_BULLET
   HideEntity bull_sprite
   
   hole_sprite=LoadSprite( "sprites\bullet_hole.bmp",1 )
   EntityBlend hole_sprite,2
   SpriteViewMode hole_sprite,2
   HideEntity hole_sprite
   
   tree_sprite=LoadSprite( "sprites\tree.bmp",7 )
   HandleSprite tree_sprite,0,-1
   ScaleSprite tree_sprite,2,4
   PositionEntity tree_sprite,0,0,-100
   SpriteViewMode tree_sprite,3
   EntityAutoFade tree_sprite,120,150
End Function

WAS MACH ICH FALSCH???
  • Zuletzt bearbeitet von AlexRath am Sa, Jul 14, 2007 12:33, insgesamt einmal bearbeitet

Puccini

BeitragSa, Jul 14, 2007 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
falsch hast du erstmal gemacht das du deinen code falsch gepostet hast!

das schaut sich keiner durch der halbwegs bei verstand ist!

strukturier den mal und poste dann in einem Code: [AUSKLAPPEN]
codefenster
deinen relevanten code!

das mit skybox und der ganze kram rundherrum braucht keiner!

poste nur das wo du

1. Daten schickst
2. Daten empfängst
3. Spieler positionierst

und die eine oder andere relevante funktion deiner seites noch!
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

AlexRath

BeitragSa, Jul 14, 2007 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir leid, aber ich bin Anfänger und kenn mich noch nicht so gut aus...
PS: Wer Rechtschreibfehler findet, darf sie behalten! Wink
 

ke^kx

BeitragSa, Jul 14, 2007 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Postest du trotzdem die geforderten Dinge? Confused

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

AlexRath

Betreff: ja...

BeitragSo, Jul 15, 2007 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß ja nicht WAS ich posten muss................
PS: Wer Rechtschreibfehler findet, darf sie behalten! Wink

Silver_Knee

BeitragMo, Jul 16, 2007 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Puccini hat Folgendes geschrieben:
poste nur das wo du

1. Daten schickst
2. Daten empfängst
3. Spieler positionierst


das musst du nochmal extra reinschreiben....
 

ke^kx

BeitragMi, Jul 18, 2007 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Und falls du jetzt meinst, du weißt nicht, wo das im Code zu finden ist, dann wird dir hier bestimmt keiner weiterhelfen sondern dich erstmal auf www.robsite.de verweisen, damit du dort mal robs tutorial machst...

Also wir machen dein spiel sicher nicht,
Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

MolchMitDolch

BeitragDo, Jul 19, 2007 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie beschleicht mich der Verdacht, das 2/3 der User hier Bots sind die jeden Beitrag mit "falsche Topic" / "falscher Post" oder "Anfängerfrage" quitieren und im besten Fall noch auf die Forensuche oder Robsite verweisen...

Zugegeben ist es schon heftig ein über 400 Zeilen-Code zu posten von dem der Großteil wirklich nicht relevant ist, aber wayne es war sein erster Tag/Post hier im Board da kann man ja mal ein Auge zudrücken Wink Laughing

Zitat:
das schaut sich keiner durch der halbwegs bei verstand ist!

Doch ich, hab grad nix bessres zu tun Very Happy

Aber die ultimative Lösung hab ich auch nicht, da mir die ganzen externen Dateien fehlen und ich so erstmal den halben Code umschreiben musste um ohne sie auszukommen, mir ist nur aufgefallen das in der
"UpdatePlayer()"-Funktion "p/entity" scheinbar für beide Spieler der Bezugspunkt ist, wiso weis ich nicht.

Lößungsvorschlag:

zeile 56, 57:
Code: [AUSKLAPPEN]

player1.Player=CreatePlayer( 0,10,0 )
player2.Player=CreatePlayer2( 10,10,0 )

-->Beide "global" machen

Zeile 247 und 253 ("UpdatePlayer()"-Funktion >> Tastenabftage für "A" und "Y")
Code: [AUSKLAPPEN]

247:  MoveEntity p\entity,0,0,1
253:  MoveEntity p\entity,0,0,-1

-->"p\entity" durch "player1.Player\entity" ersetzen.
Dann ist Player1 von Player2 entkoppelt, vielleicht muss man in der "UpdatePlayer()"-Funktion auch noch andere "p"s durch "player1.Player" ersetzen um z.B. Animationen zu entkoppeln, das konnte ich ohne Objekte nicht ausprobieren.

mfg MolchMitDolch

Mr. Green für freundlichere Umgangsformen Mr. Green

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group