Suchrakete in 2D von Markus
Kleines Beispiel einer Suchrakete (2D) die von einem
Schiff abgeschossen werden kann und ein anderes Schiff
hinterher fliegt bis sie trifft oder der Treibstoff alle geht .

Wer Probleme mit Types hat kann da auch mal reingucken ;-)

[code:1:8e7ed9d103]

;Rakete Ziel Blitz2D Example von Markus Rauch

;Tasten Links/Rechts steuert Schiff 1
;Maus Left schieß immer auf Schiff 2
;Maus Rechts schieß auf das Schiff wo cursor drüber ist

;MR 12.05.2003

Graphics 640,480,16,0
SetBuffer BackBuffer()

Type RaketeType
Field px#
Field py#
Field dx#
Field dy#
Field speed#
Field speedmax#
Field w#
Field range#
Field TargetSchiff.SchiffType
Field Staerke#
End Type

Type SchiffType
Field Name$
Field px#
Field py#
Field dx#
Field dy#
Field speed#
Field speedmax#
Field w#
Field FarbeR
Field FarbeG
Field FarbeB
Field Staerke#
Field Sinkt
End Type

Type BumType
Field x#,y#
Field TargetSchiff.SchiffType
Field TimeOut
End Type

Global Schiff.SchiffType
Global Rakete.RaketeType
Global Bum.BumType

SchiffNeu "1",320,300,260,1,200,0,255,0 ;Von hier wird geballert
SchiffNeu "2",320,100,200,2,200,255,0,0 ;Ziel
SchiffNeu "3",220,100,100,2,200,0,0,255 ;Ziel

;-------------------------------------------------------------------
MainLoop
End
;-------------------------------------------------------------------

Function MainLoop()

Local PlayerSchiff1.SchiffType=SchiffFind("1")
Local PlayerSchiff2.SchiffType=SchiffFind("2")

Local mx,my

While Not KeyHit(1)

mx=MouseX()
my=MouseY()

Cls

;--------------------------------------------- Schiff 1 lenken

If KeyDown(203) Then
If PlayerSchiff1<>Null Then
If PlayerSchiff1Sinkt=False Then
PlayerSchiff1w=PlayerSchiff1w+2
If PlayerSchiff1w>360 Then PlayerSchiff1w=PlayerSchiff1w-360
PlayerSchiff1dx=Sin(PlayerSchiff1w)
PlayerSchiff1dy=Cos(PlayerSchiff1w)
EndIf
EndIf
EndIf
If KeyDown(205) Then
If PlayerSchiff1<>Null Then
If PlayerSchiff1Sinkt=False Then
PlayerSchiff1w=PlayerSchiff1w-2
If PlayerSchiff1w<0 Then PlayerSchiff1w=PlayerSchiff1w+360
PlayerSchiff1dx=Sin(PlayerSchiff1w)
PlayerSchiff1dy=Cos(PlayerSchiff1w)
EndIf
EndIf
EndIf

;---------------------------------------------

SchiffeUpdate
SchiffeZeigen
BumUpdate
BumZeigen
RaketenUpdate
RaketenZeigen

;---------------------------------------------

;Immer auf Schiff 2
If MouseHit(1) Then
RaketeNeu SchiffFind("1"),SchiffFind("2"),50
EndIf
;Auf Schiff wo Maus ist
If MouseHit(2) Then
RaketeNeu SchiffFind("1"),SchiffFindXY(mx,my,40),50
EndIf

;---------------------------------------------

Color 255,255,255
Oval mx-5,my-5,10,10,False

;---------------------------------------------

Delay 20

Flip
Wend

Delete Each SchiffType
Delete Each RaketeType
Delete Each BumType

End Function

Function SchiffNeu(Name$,px#,py#,winkel#,speed#,staerke#,r,g,b)

;Neues Schiff bauen

Schiff.SchiffType=New SchiffType

SchiffName$=Name$
Schiffpx=px
Schiffpy=py
Schiffdx=Sin(winkel)
Schiffdy=Cos(winkel)
Schiffw=winkel
Schiffspeed=speed
Schiffstaerke=staerke
SchiffFarbeR=R
SchiffFarbeG=G
SchiffFarbeB=B
SchiffSinkt=False

End Function

Function SchiffeUpdate()

;Schiffe bewegen

For Schiff.SchiffType =Each SchiffType
If SchiffSinkt=False Then
If SchiffSpeed<SchiffSpeedMax Then SchiffSpeed=SchiffSpeed+0.1
Schiffpx=Schiffpx+Schiffdx*Schiffspeed
Schiffpy=Schiffpy+Schiffdy*Schiffspeed
If Schiffpx<0 Then Schiffpx=Schiffpx+GraphicsWidth()
If Schiffpy<0 Then Schiffpy=Schiffpy+GraphicsHeight()
If Schiffpx>GraphicsWidth() -1 Then Schiffpx=Schiffpx-GraphicsWidth()
If Schiffpy>GraphicsHeight()-1 Then Schiffpy=Schiffpy-GraphicsHeight()
EndIf
Next

End Function

Function SchiffFind.SchiffType(Name$)

;Schiffnamen suchen und SchiffType zurück geben

For Schiff.SchiffType =Each SchiffType
If SchiffName$=Name$ Then Return Schiff
Next

Return Null

End Function

Function SchiffFindXY.SchiffType(px#,py#,ra#)

;Schiffnamen suchen und SchiffType zurück geben

For Schiff.SchiffType =Each SchiffType
If Entf(px,py,Schiffpx,Schiffpy)<=ra Then Return Schiff
Next

Return Null

End Function

Function RaketeNeu(SS.SchiffType,SZ.SchiffType,staerke#)

;Neue Rakete starten , erstmal mit Winkel wie Schiff :-)

If ss=Null Or sz=Null Then Return 0
If ss=sz Then Return 0 ;auf sich selber schießen wäre doof ;-)

Rakete.RaketeType=New RaketeType

Raketepx=sspx
Raketepy=sspy
Raketew=ssw
Raketedx=ssdx
Raketedy=ssdy
Raketespeed=0
Raketespeedmax=10
Rakete
ange=200
Raketestaerke=staerke
RaketeTargetSchiff=sz

Return True

End Function

Function RaketenUpdate()

;Beschleunig die Rakete und bewegt sie bis der Treibstoff alle ist
;Dann wird sie langsamer und verschwindet

Local Weg

For Rakete.RaketeType =Each RaketeType
Weg=0
RaketeZielUpdate Rakete
If RaketeSpeed<RaketeSpeedMax Then RaketeSpeed=RaketeSpeed+0.1:If RaketeSpeed>RaketeSpeedMax Then RaketeSpeed=RaketeSpeedMax
Raketepx=Raketepx+Raketedx*Raketespeed
Raketepy=Raketepy+Raketedy*Raketespeed
If RaketeTargetSchiff<>Null Then
If Entf(Raketepx,Raketepy,RaketeTargetSchiffpx,RaketeTargetSchiffpy)<10 Then
BumNew Raketepx,Raketepy,RaketeTargetSchiff,RaketeStaerke
Weg=True
EndIf
EndIf
If Rakete
ange>0 Then Rakete
ange=Rakete
ange-RaketeSpeed ;Flugdauer begrenzen
If Rakete
ange<=0 Then
If RaketeSpeed>0 Then RaketeSpeed=RaketeSpeed-0.25 ;kein Treibstoff mehr
If RaketeSpeed<=0 Then Weg=True ;Hokus Pokus
EndIf
If Weg=True Then RaketeFree Rakete
Next

End Function

Function RaketeFree(R.RaketeType)

;Rakete freigeben

Delete R

End Function

Function RaketeZielUpdate(R.RaketeType)

If rTargetSchiff=Null Then Return ;Schiff gibt es nicht mehr dann einfach weiter fliegen lassen mit letztem Kurs

;neuen Kurs für die Rakete ausrechnen

Local dx#,dy#

dx=rTargetSchiffpx-rpx
dy=rTargetSchiffpy-rpy

Local wneu#
Local walt#
Local wd#

walt=RW
wneu=ATan2(dx,dy)

Local inc#=(rspeedmax/rspeed)*2.0+5.0

RW=curveangle#( wneu,walt,inc)

rdx=Sin(RW)
rdy=Cos(RW)

;Richtung zum Ziel
;Local l=300
;Color 128,128,128
;Line rpx,rpy,rpx+(l*rdx) , rpy+(l*rdy)

End Function

Function RaketenZeigen()

;Alle Raketen zeigen

For Rakete.RaketeType =Each RaketeType
RaketeZeigen Rakete
Next

End Function

Function RaketeZeigen(R.RaketeType)

Local l#=10 ;Länge Rakete

Color 255,255,0
;Schweif in die entgegengesetzte Richtung !
Line rpx, rpy , rpx-(l*rdx) , rpy-(l*rdy)

;Punkt alt Raketenkopf :-)
Color 255,0,0
Plot rpx,rpy

End Function

Function SchiffeZeigen()

;Zeigt alle Schiffe

For Schiff.SchiffType =Each SchiffType
SchiffZeigen Schiff
Next

End Function

Function SchiffZeigen(S.SchiffType)

;zeichnet das Schiff

Local l=20 ;Schiff länge

If SSinkt=False Then
Color sFarbeR,sFarbeG,sFarbeB
Else
Color 128,128,128
EndIf
Line spx,spy,spx-sdx*l,spy-sdy*l

;Kopf des Schiffes
Color 255,255,255
Plot spx,spy

End Function

Function BumNew(x,y,S.SchiffType,Staerke#)

;Neuen Treffer zeigen und Ziel an Staerke abziehen , wenn Ziel kaputt dann wird SchiffSinkt=True

Bum.BumType=New BumType

BumTimeOut=100
Bumx=x
Bumy=y
BumTargetSchiff=s
If BumTargetSchiffStaerke>0 Then
BumTargetSchiffStaerke=BumTargetSchiffStaerke-Staerke
If BumTargetSchiffStaerke<=0 Then BumTargetSchiffStaerke=0:BumTargetSchiffSinkt=True
EndIf

End Function

Function BumUpdate()

;Treffer sollen nicht ewig sichtbar sein

For Bum.BumType=Each BumType
If BumTimeOut>0 Then
BumTimeOut=BumTimeOut-1
Else
Delete Bum
EndIf
Next

End Function

Function BumZeigen()

;Treffer zeigen

Local x#,y#

For Bum.BumType=Each BumType

Color 255,255,0

x=Bumx
y=Bumy

Oval x-4,y-4,8,8

Next

End Function

Function curveangle#(newangle#,oldangle#,increments#)

;Elegante Lösung um die Winkel differenz heraus zu bekommen
;Mit increments kann man die gesamt Winkeldifferenz teilen das kleine Schritte möglich sind

If (oldangle+360)-newangle<NEWANGLE-OLDANGLE Then OLDANGLE=360+OLDANGLE
If (newangle+360)-oldangle<OLDANGLE-NEWANGLE Then NEWANGLE=360+NEWANGLE
oldangle=oldangle-(oldangle-newangle)/increments
Return oldangle

End Function

Function Entf#(x1#,y1#,x2#,y2#)

;Entfernung zwischen Punkt 1 und 2

Local dx#,dy#

dx=x2-x1
dy=y2-y1

Return Sqr(dx*dx+dy*dy)

End Function
[/code:1:8e7ed9d103]



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: