3D-Schuss mit Probs (Koordinaten...)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

DATIS

Betreff: 3D-Schuss mit Probs (Koordinaten...)

BeitragDi, Okt 30, 2007 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitzer.

Code: [AUSKLAPPEN]
Graphics3D 800,600,16,2
SetBuffer BackBuffer()

cam=CreateCamera()
Type shot ;erstellt den Type "shot"
Field shot_x ;x Koordinate
Field shot_y ;y Koordinate
Field shot_z ;z Koordinate
End Type
Global boby=CreateCylinder(60)
Global shot_counter=0
TurnEntity boby,90,0,0
ScaleEntity boby,0.05,1,0.05
brush=CreateBrush(0,255,0)
PaintMesh boby,brush
EntityFX boby,1
PositionEntity cam,2,0,-1.5
TurnEntity cam,0,35,0

While Not KeyHit(1)
;Hauptschleife
UpdateWorld
RenderWorld
createlaser()

Flip
Wend

End

Function createlaser()

   If KeyDown(57) Then
      shot_counter = shot_counter +1
   End If

   If shot_counter = 5 Then
      info.shot = New shot ;hier wird der schuss erstellt
      info\shot_x = 0 ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
      info\shot_y = 0 ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
      info\shot_z = 0

      shot_counter = 0 ;den Zähler auf 0 damit es wieder von vorne losgehen kann
   End If


   ;so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

   For info.shot = Each shot ;so wird jeder einzelne Schuss angesprochen
      info\shot_z = info\shot_z +1
      PositionEntity boby,info\shot_x,info\shot_y,info\shot_z
   Next

End Function


Das ist mein Code und das ist mein Problem:

[problem]Wenn man Leertaste drückt, wird der Zylinder in die Weite verschossen. Wenn man die Leertaste ein zweites Mal drückt, ist sie sofort wieder vorne und fliegt nach hinten.[/problem]

Folgende Ursache:

[reason]PositionEntity boby,... versetzt den Zyllinder ja nur. Das ist mir klar.[/reason]

Aber folgende Frage:

[question]Wie kann ich den Zyllinder mehrere Male in die Ferne schießen? Was passiert, wenn der Zyllinder immer weiterfliegt, wird dann die Rechengeschwindigkeit verlangsamt?[/question]

Danke im Vorraus für die Hilfe
Frauen und Technik?
Männer und BHs?

Beides möglich.
  • Zuletzt bearbeitet von DATIS am Do, Nov 01, 2007 20:29, insgesamt einmal bearbeitet

The_Nici

BeitragDi, Okt 30, 2007 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin. Ich weiss nicht genau, aber ich würde die Schüsse in einem Array speichern. Also:

Code: [AUSKLAPPEN]

Graphics3D 800,600,0,1
SetBuffer(BackBuffer)

Type shot ;Type
   Field x
   Field y
   Field z
   Field mesh
End Type

Dim shnr.shot(99) ;Array mit dem Schusstype

;Alle Arrays mit leeren Shot-Einträgen fülllen.
For i=0 To 99 ; von null zu 99 (100)
   shot(i)=New shot
   shot(i)\mesh=CreateCylinder(3)
   HideEntity shot(i)\mesh
Next

sid=0
While Not KeyHit(1)
   If KeyHit(57) ;Schuss erstellen
      shot(sid)=New shot
      shot(sid)\x=EntityX(player)
      shot(sid)\y=EntityY(player)
      shot(sid)\z=EntityZ(player)
      shot(sid)\mesh=CreateCylinder(3) ; 3 Segments genügen, alles andere ist tödlich
      RotateEntity shot(sid), EntityPitch(player), EntityYaw(player), EntityRoll(player)
      sid=sid+1   
   EndIf
   
   For i=0 To 99 ;Schuss updaten
      MoveEntity shot(i)\mesh, 0,0,5
   Next
   ;etc.
   RenderWorld
   Flip
   Cls
Wend


MfG

DATIS

BeitragDi, Okt 30, 2007 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ha... 60 segmente... sorry, den habe ich einfach aus einem anderen quelltext von mir kopiert (mit brush etc.). habe ich wohl übersehen.
*tod*

danke für die schnelle hilfe

[edit] hm, ja, im nachhinein habe ich irgendwie probleme mit dem code. bei mir funktioniert er nicht. [/edit]
Frauen und Technik?
Männer und BHs?

Beides möglich.

The_Nici

BeitragMi, Okt 31, 2007 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hab nie gesagt dass man den einfach pasten kann. -_-

Dazu hab ich nen Fehler, es müsste "sid=(sid+1) MOD 99" heissen.

DATIS

BeitragDo, Nov 01, 2007 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry, aber ich komme mit der hilfestellung nicht klar. wie muss ich dass den jetzt verändern?

[edit] hm, okay, jetzt habe ich das problem doch noch gelöst:
Code: [AUSKLAPPEN]
Type shot ;erstellt den Type "shot"
Field shot_x ;x Koordinate
Field shot_y ;y Koordinate
Field shot_z ;z Koordinate
Field mesh ;Mesh "Pfeil" zeichnen
End Type

Global boby=CreateCylinder(3)
Global shot_counter=0
TurnEntity boby,90,0,0
ScaleEntity boby,0.05,1,0.05
brush=CreateBrush(0,255,0)
PaintMesh boby,brush
EntityFX boby,1
HideEntity boby

Das ist das Feld und hier die umgeschriebene Funktion:
Code: [AUSKLAPPEN]
Function createlaser()

   If KeyDown(57) Then
      shot_counter = shot_counter +1
   End If
   If shot_counter = 12 Then
     boby2=CopyEntity(boby)
      info.shot = New shot ;hier wird der schuss erstellt
      info\shot_x = 0 ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
      info\shot_y = 0 ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
      info\shot_z = 0
     info\mesh = boby2

      shot_counter = 0 ;den Zähler auf 0 damit es wieder von vorne losgehen kann
   End If


   ;so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

   For info.shot = Each shot ;so wird jeder einzelne Schuss angesprochen
      info\shot_z = info\shot_z +1
     PositionEntity info\mesh,info\shot_x,info\shot_y,info\shot_z
      ;PositionEntity boby,info\shot_x,info\shot_y,info\shot_z
   Next


Danke für deine Hilfe, The_Nici.

-------------------------------------------------------------
2. edit

Jaja, da steckt bei mir der Wurm drin. Jetzt habe ich den Code in mein "Spiel" eingebaut und er läuft falsch. Der Laser"pfeil" wird nur an der Z-Achse verschossen. Und er dreht sich...?!? We kann ich den einfach nur geradeaus schießen lassen?

Code: [AUSKLAPPEN]
;3D-Shoot -> ein mini(!)shooter
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;--Maus verstecken, falls Fenstermodus--
HidePointer

;--Zufallszahlen als MilliSecs() zerstreuen--
SeedRnd MilliSecs()

;--Variablen (Bilder laden, Zahlen,... etc.)--
Global player$=Input$("Spielername: ")            ; Spielername eingeben
Global munition=20                            ; Munition der Waffe
Global camera=CreateCamera()                   ; Kamera erstellen
Global light=CreateLight(2)                     ; Licht erstellen
Global dna=LoadMesh("dna.3ds")                  ; DNA laden
Global timer=CreateTimer(60)                  ; Timer mit 60-Fequenz erstellen
Global x#                                  ; x-Koordinate (Float)
Global y#                                  ; y-Koordinate (Float)
Global hotpoint=LoadImage("hotpoint.bmp")         ; Zielpunkt
Global balken1=LoadSprite("leiste.png",2,camera)   ; Leiste (Spielername & Munition)
Global kreuz=LoadSprite("fadenkreuz.png",2,camera)   ; Fadenkreuz laden (als Sprite, wegen AA & Transparenz)
Global zeit=MilliSecs()                        ; Zeitpunkt, wird für fadenkreuzdrehung benutzt
Global p%                                 ; Drehung des Fadenkreuzes (Integer)
Global record=Int(Rnd#(1000,10000))               ; Zufallszeitspanne
Global level=LoadMesh("tube.b3d")               ; Level laden und zeichnen
Global angle                              ; Winkel der Kreuzrotation
Global wert                                 ; Wert für Kreuzrotation
Global boby=CreateCylinder(3)                  ; Laser-"Pfeil" erstellen
Global shot_counter=0                        ; Schusszähler auf 0
Global brush=CreateBrush(0,255,0)               ; Brush für boby erstellen


;--Einstellungen für Objekte etc.--
CameraFogMode camera,1                         ; KameraNebel einstellen
NameEntity dna,"DNA"                        ; dna "DNA" benennen
EntityPickMode dna,2                        ; Polygon
PositionEntity dna,0,0,2                     ; DNA verschieben
EntityFX dna,1                              ; zum Leuchten bringen
MidHandle hotpoint                           ; hotpoint zentrieren
PositionEntity balken1,-2.9,-2.7,4               ; balken positionieren
EntityOrder balken1,-1                        ; Anordnung negativ
;--AUSNAHME--
Global balken2=CopyEntity(balken1,camera)   ; 2. Leiste laden
;--GLOBAL--
PositionEntity balken2,-2.9,-2.35,4               ; 2. Leiste positionieren
PositionEntity kreuz,0,0,10                     ; Kreuz positionieren
EntityOrder kreuz,-1                        ; negative Anordnung
MoveMouse 1024/2,768/2                        ; Maus zum Mittelpunkt verschieben
ScaleEntity level,2,2,2                        ; Level dimensionieren
PositionEntity level,0,2,1                     ; Level positionieren
TurnEntity boby,90,0,0                        ; boby drehen
ScaleEntity boby,0.05,1,0.05                  ; boby skalieren
PaintMesh boby,brush                        ; boby anmalen
EntityFX boby,1                              ; boby leuchten lassen
HideEntity boby                              ; boby verstecken


;--Feld für Schüsse erstellen--
Type shot       ;erstellt den Type "shot"
Field shot_x    ;x Koordinate
Field shot_y    ;y Koordinate
Field shot_z    ;z Koordinate
Field mesh       ;Mesh "Pfeil" zeichnen
Field pitch      ;Pitch des Spielers
Field yaw      ;Yaw des Spielers
End Type



;//Shootercode
While Not KeyHit(1)
   
   UpdateWorld
   RenderWorld

   TurnEntity dna,0,1,0
   
   move()
   
   ;//2D- und Rechenkommandos
   rotate()
   
   If MouseHit(1) Then shot()
   
   visier=CameraPick(camera,1024/2,768/2)
   ;//info-objekte & ziele
   If visier<>0 Then
      info(Lower$(EntityName$(visier)))
   EndIf
   
   If MouseHit(1) Then shot()
   
   Color 0,0,0
   Text 20,723,player$
   
   shoot_aktu()
   
   DrawImage hotpoint,1024/2,768/2
   
   MoveMouse 1024/2,768/2
   
   Flip 0
   WaitTimer timer
   
Wend
End

;--Funktionen laden--
Include "Functions.bb"


Und die Functions.bb:
Code: [AUSKLAPPEN]
;--Schussfunktion--
Function shot()
   If munition>0 Then
      munition=munition-1
      boby2=CopyEntity(boby)
      info.shot = New shot
      info\shot_x = EntityX(camera)
      info\shot_y = EntityY(camera)
      info\shot_z = EntityZ(camera)
      info\mesh = boby2
      info\pitch = EntityPitch(camera)
      info\yaw = EntityYaw(camera)
   End If
End Function


;--Schussaktualisierung--
Function shoot_aktu()
For info.shot = Each shot
   info\shot_z = info\shot_z +1
   TurnEntity info\mesh,info\pitch,info\yaw,0
   PositionEntity info\mesh,info\shot_x,info\shot_y,info\shot_z
Next
End Function


;--Informationsfunktion--
Function info(thing$)
   Select thing
      Case "dna"
      Text 10,120,"DNA-Spule"
      Default
      Text 10,120,"Unbekanntes Objekt"
   End Select
End Function


;--Fadenkreuzrotierungsfunktion--
Function rotate()
   If MilliSecs()-zeit>record Then
      zeit=MilliSecs()
      Select p
         Case 0
         wert=Floor#(Rnd#(0,3))
         If wert=3 Then wert=2
         If wert=2 Then p=-1
         If wert=1 Then p=1
         Case 1
         wert=Floor#(Rnd#(0,3))
         If wert=3 Then wert=2
         If wert=2 Then p=-1
         If wert=1 Then p=0
         Case -1
         wert=Floor#(Rnd#(0,3))
         If wert=3 Then wert=2
         If wert=2 Then p=0
         If wert=1 Then p=1
      End Select
      If p=1 Or p=-1 Then record=Int(Rnd#(1000,3000))
      If p=0 Then record=Int(Rnd#(4000,10000))
   EndIf
   angle=(angle+p) Mod 360
   RotateSprite kreuz,angle
End Function


;--Bewegungsfunktion--
Function move()
   xspeed=MouseXSpeed()
   yspeed=MouseYSpeed()   
   If EntityPitch(camera)<-80 And yspeed<0 Then yspeed=0
   If EntityPitch(camera)>80 And yspeed>0 Then yspeed=0
   If xspeed>0 Then x=x-(0.1*xspeed)
   If xspeed<0 Then x=x-(0.1*xspeed)
   If yspeed>0 Then y=y+(0.1*yspeed)
   If yspeed<0 Then y=y+(0.1*yspeed)
   If KeyDown(200) Then MoveEntity camera,0,0,0.1
   If KeyDown(208) Then MoveEntity camera,0,0,-0.1
   If KeyDown(203) Then x=x+2
   If KeyDown(205) Then x=x-2
   RotateEntity camera,y,x,0
End Function


Danke für die Hilfe im Vorraus. Das ist halt wie gesagt nur noch das Problem, dass die Pfeile falsch verschossen werden.

Mfg, Datis

The_Nici

BeitragDo, Nov 01, 2007 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo erstellst du das Array?
Du hast nichts aus meiner Hilfestellung gelernt, ehrlich gesagt. Lies es nochmals in Ruhe durch.

Wenn du es dann NICHT begreiffst, fragst du nochmals.

EDIT: Dazu kannst du nicht sagen dass Info\mesh=boby2 ist, weil du dann sagst es soll der Rückgabewert von dem werden.
Schau dir mal Copyentity an.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Nov 01, 2007 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht sehe ich auch den Sinn nicht, aber wozu sollte man für eine so einfache Sache Types mit Arrays mischen? Es genügt doch jedem Typeschuss ein Alter mitzugeben, welches immer weiter verjüngt wird. Ist das Alter 0 erreicht oder landet der Schuss einen Treffer, wird der Schuss gelöscht. Somit liessen sich auch unterschiedlich schnelle Schüsse in ihrem Erreignisradius beeinflussen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

DATIS

BeitragFr, Nov 02, 2007 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hey, nici.
boby2 ist der copyentity von boby.

das mit dem alter klingt plausibel. das baue ich gleich ein.
ABER meine frage war, warum die nicht geradeaus fliegen.

mfg
Frauen und Technik?
Männer und BHs?

Beides möglich.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Nov 03, 2007 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil du TurnEntity cam,0,35,0 gemacht hast, aber den Schuss nicht auf den Kamerawinkel angepasst hast.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group