Radios Type Zerstörung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Radios Type Zerstörung

BeitragMi, Aug 03, 2011 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,
ich wollte mal gerne Wissen wie ich es hinkriegen könnte Dinge(Types z.b Häuser) die in einem Bestimmten Radius sind zu Löschen ?.

Ich habe dazu mal ein kleines Test Spielchen Programmiert:
Code: [AUSKLAPPEN]
Type HausTyp
   Field X,Y
End Type
Global Haus.HausTyp

Graphics 800,600,32,2
SetBuffer BackBuffer ()
Global FPS_Timer = CreateTimer (60)

;Tesla
Global TeslaSTR = 25
Global TeslaX = 400-TeslaSTR
Global TeslaY = 300-TeslaSTR

Repeat
   Cls
   Steuerung ()
   Zeichnen ()
   Tesla ()
   
    Flip (1)
   WaitTimer (FPS_Timer)
Until KeyHit (1)

Function Steuerung ()
   If MouseHit (1)
      Haus.HausTyp = New HausTyp
      Haus\X = MouseX()-16
      Haus\Y = MouseY()-16
   End If
End Function

Function Zeichnen ()
   ;Tesla
   Color 255,0,0
   Oval TeslaX,TeslaY,TeslaSTR,TeslaSTR
   
   ;Häuser
   For Haus.HausTyp = Each HausTyp
      Color 120,50,0
      Rect Haus\X,Haus\Y,32,32,1
   Next
End Function

Function Tesla ()
   If KeyDown (57)
      TeslaSTR = TeslaSTR +6
      TeslaX = TeslaX -3
      TeslaY = TeslaY -3
   End If
End Function

Midimaster

BeitragMi, Aug 03, 2011 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
für alle Objekte innerhalb eines best. Radius um MitteX/MitteY gilt:

Code: [AUSKLAPPEN]
( MitteX -ObjektX )^2 + ( MitteY -ObjektY )^2 < Radius^2



bedeutet für dein Spiel:

BlitzBasic: [AUSKLAPPEN]
Function Zeichnen ()
;Tesla
Color 255,0,0
Oval TeslaX,TeslaY,TeslaSTR,TeslaSTR

;Häuser
MitteX=TeslaX+TeslaSTR/2
MitteY=TeslaY+TeslaSTR/2
Radius=TeslaSTR/2
For Haus.HausTyp = Each HausTyp
If ( Haus\X - MitteX)^2 + ( Haus\Y - MitteY)^2 < Radius^2 Then
Color 0,0,255
Else
Color 120,50,0
EndIf
Rect Haus\X,Haus\Y,32,32,1
Next
End Function

Raiden93

BeitragMi, Aug 03, 2011 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh danke super Smile habe jetzt noch die Mitte der Häuser richtig angepasst.

Code: [AUSKLAPPEN]
(Haus\X+16 - MitteX)^2 + ( Haus\Y+16 - MitteY)^2 < Radius^2 Then

darth

BeitragMi, Aug 03, 2011 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Midimasters Ansatz ist im Prinzip richtig, ich verstehe allerdings nicht, warum er die Typeinstanzen nicht einfach löscht? :/ Dazu benutzt man generell den Delete Befehl.

BlitzBasic: [AUSKLAPPEN]
...

For Haus.HausTyp = Each HausTyp
If (Haus\X - MitteX)^2 + (Haus\Y - MitteY)^2 < Radius^2 Then
Delete Haus.HausTyp
Else
Color 120,50,0
Rect Haus\X,Haus\Y,32,32,1
EndIf

;Hier sollte Haus nichtmehr verwendet werden, da es oben möglicherweise gelöscht wurde,
;weiteres Verwenden könnte zu Fehlern führen.
Next


Was Midimeister macht ist, ein "zerstörtes" Gebäude blau zu zeichnen. Ist beim nächsten Schleifendurchlauf MitteX/MitteY woanders, geht die Information verloren und das Haus wird wieder rötlich gezeichnet.

Allgemein:
Delete entfernt Typeinstanzen.

BlitzBasic: [AUSKLAPPEN]
Type A
End Type

b.A = New A ;Erstellen (~Constructor)
Delete A ;Zerstören (~Destructor)

For b.A = Each A
Print "Ich komm hier nie hin \o/"
Next


MfG,
Darth
Diese Signatur ist leer.

Midimaster

BeitragMi, Aug 03, 2011 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@darth

Rolling Eyes ich wollte halt, dass er "sieht", wann und wie die Radius-Formel greift. Löschen oder was immer auch kann dann doch selber!

und du siehst ja, dass noch "Hinschau-Bedarf" war. Raiden musste nämlich die Genauigkeit noch erhöhen. Dazu war es ja ganz gut, dass die Gebäude nicht DELETEd wurden.... Cool

@raiden93

ich denke mal, du hattest es schon verstanden, wie ich es meinte... Wink

FireballFlame

BeitragDo, Aug 04, 2011 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ^2 benutzen. Mach sowas mit *, das ist bedeutend schneller.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Raiden93

BeitragDo, Aug 04, 2011 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich es mit * mache Funktioniert es nicht so^^. Code: [AUSKLAPPEN]
 (Haus\X+16 - MitteX)*2 + ( Haus\Y+16 - MitteY)*2 < Radius*2)
 

CO2

ehemals "SirMO"

BeitragDo, Aug 04, 2011 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst auch um ein ^ zu ersetzen 2 mal das selbe multiplizieren, heißt:
Code: [AUSKLAPPEN]
(Haus\X+16 - MitteX)*(Haus\X+16 - MitteX) + ( Haus\Y+16 - MitteY)*( Haus\Y+16 - MitteY) < Radius*Radius)


Wink

mfg
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Midimaster

BeitragDo, Aug 04, 2011 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@fireballFlame
tja, so ist das wenn man den Unwissenden nur Brocken hinwirft....

@raiden93
dann nimm doch wieder

BlitzBasic: [AUSKLAPPEN]
(Haus\X+16 - MitteX)^2
 

PhillipK

BeitragDo, Aug 04, 2011 4:44
Antworten mit Zitat
Benutzer-Profile anzeigen
^ <- Steht für "hoch"

Hoch 2 zb bedeutet, das Zahl * Zahl gerechnet wird (^3 wäre dann Zahl*Zahl*Zahl) - Steht das ganze in einer klammer, müssten wir auch die Klammern hoch-2 rechnen zb.

Vielleicht hat dich die schreibweise verwirrt, lässt sich (zumindest im Matheheft ^^) auch mit x²+y²=z² schreiben Smile

Raiden93

BeitragDo, Aug 04, 2011 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ah ok Smile

EDIT:
Ich habe mal damit man auch sieht das ich lerne mein Versuch erhöht Wink

Code: [AUSKLAPPEN]
Type HausTyp
   Field X,Y
End Type
Global Haus.HausTyp

Type BombeTyp
   Field X,Y
   Field Durchmesser
   Field Count, TimerCache
End Type
Global Bombe.BombeTyp

AppTitle "Atombombs"
Graphics 800,600,32,2
SetBuffer BackBuffer ()
Global FPS_TIMER = CreateTimer (60)



Repeat
   Cls
   Steuerung ()
   Haus_Zeichnen ()
   Bombe_Zeichnen ()
   Bombe_Explodieren ()
   Bombe_Destroy ()
   
   Flip (0)
   WaitTimer (FPS_TIMER)
Until KeyHit (1)

Function Steuerung ()
   If MouseHit (1)
      Haus.HausTyp = New HausTyp
      Haus\X = MouseX ()-16
      Haus\Y = MouseY ()-16
   End If
   
   If MouseHit (2)
      Bombe.BombeTyp = New BombeTyp
      Bombe\X = MouseX ()-10
      Bombe\Y = MouseY ()-10
      Bombe\Durchmesser = 20
   End If
End Function

Function Haus_Zeichnen ()
   For Haus.HausTyp = Each HausTyp
      Color 150,50,0
      Rect Haus\X, Haus\Y, 32, 32, 1
   Next
End Function

Function Bombe_Zeichnen ()
   For Bombe.BombeTyp = Each BombeTyp
      Color 255,0,0
      Oval Bombe\X, Bombe\Y, Bombe\Durchmesser, Bombe\Durchmesser, 1
   Next
End Function

Function Bombe_Explodieren ()
   For Bombe.BombeTyp = Each BombeTyp
      If MilliSecs()>Bombe\TimerCache+1000
         Bombe\TimerCache = MilliSecs()
         Bombe\Count = Bombe\Count +1
      End If
      
      If Bombe\Count < 3
         Bombe\Durchmesser = Bombe\Durchmesser +2
         Bombe\X = Bombe\X -1
         Bombe\Y = Bombe\Y -1
      Else
         Delete Bombe
         Exit
      End If
   Next
End Function

Function Bombe_Destroy ()
   For Bombe.BombeTyp = Each BombeTyp
      Local BombeMitteX = Bombe\X + Bombe\Durchmesser/2
      Local BombeMitteY = Bombe\Y + Bombe\Durchmesser/2
      Local BombeRadius = Bombe\Durchmesser/2
      
      For Haus.HausTyp = Each HausTyp
         If (Haus\X+16 - BombeMitteX)^2 + (Haus\Y+16 - BombeMitteY)^2 < BombeRadius^2
            Delete Haus
            Exit
         End If
      Next
   Next
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group