Schönen Abend liebe AutoIt gemeinde,
nach längerem c++ exkurs bin ich wider zu meinem heißgeliebten AutoIt zurückgekommen und habe bei meinen alten Scripts noch ein kleines halbfertiges Spiel gefunden welches ich natürlich niemand vorenthalten will.
ich würde mich natürlich über kommentare und anregungen dazu sehr freuen
getestet und geschrieben wurde unter AutoIt V 3.3.12.0
€: neue Version
AutoIt
#include <GUIConstantsEx.au3>
#include <Gdiplus.au3>
#include <Misc.au3>
#include <Array.au3>
#include <Timers.au3>
Global $breite = 600 ;fenstergröße, mindestens:400
Global $hoehe = $breite;fenstergröße
Global $groese = 10; höhe/(breite) des feldes
Global $difficulti = 2;0=Profi 1=Schwer 2=Normal 3=Leicht
Global $movespace = Floor($groese / 2)
Global $scale = $breite / 16 / ($groese + $movespace);größe der objekte
Global $shipspeed = $scale * 4, $shippos_x = 0, $shippos_y = $hoehe - 24 * $scale - 30
Global $firespeed = $scale * 6;6
Global $firedelay = 333;3 Geschosse pro sek.
Global $lifes=3
Global $wave = 0, $score = 0, $speed = 400, $posx = 0, $posy = 0, $counter, $killcounter = 0, $dir = 1;startposition
Global $enemy[5][11] = [[384, 2016, 16380, 32766, 32766, 29646, 16380, 1632, 3504, 6168, 12300],[4104, 2064, 8184, 15324, 32766, 24570, 20490, 20082, 0, 0, 0],[384, 960, 2016, 3504, 8184, 8184, 576, 1440, 2640, 0, 0],[960, 4080, 8184, 16380, 28086, 65535, 14748, 4104, 0, 0, 0],[448, 8188, 16382, 15518, 16382, 864, 1712, 6156, 0, 0, 0]];gegnerform 16x11 pixel
Global $hide[11] = [65535, 65535, 65535, 65535, 63519, 61455, 57351, 57351, 57351, 57351, 0]
Global $ship[11] = [384, 384, 960, 960, 8184, 16380, 16380, 16380, 0, 0, 0]
Global $life[11]= [30750,64575,65151,65535,32766,16380,8184,4080,2016,960,384]
Global $Field[$groese][Ceiling($groese/$difficulti)];gegnerflotte
Global $EnemyPaths[5], $HidePath[Floor($groese / 4) + 1], $bullets[2][3] = [[1, 0, 0]];[x][Y]=X=laufende NR Y=0=Xpos Y=1=Ypos Y=2=Dir/Speed
For $ie = 0 To $groese - 1
For $ie2 = 0 To Ceiling($groese/$difficulti) - 1
$killcounter += 1
$Field[$ie][$ie2] = Random(0, 4, 1)
Next
Next
_GDIPlus_Startup()
$Form1 = GUICreate("Invader", $breite, $hoehe)
GUISetState(@SW_SHOW)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($Form1)
_GDIPlus_GraphicsClear($hGraphics, 0xFF000000)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($breite, $hoehe, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$brush_grau = _GDIPlus_BrushCreateSolid(0xFF888888)
$brush_blau = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$brush_gruen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
$brush_rot = _GDIPlus_BrushCreateSolid(0xFFFF0000)
$brush_white = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$pen_white = _GDIPlus_PenCreate(0xFFFFFFFF, $scale, 2)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
$hFont_big = _GDIPlus_FontCreate($hFamily, $hoehe/8, 2)
$tWaverect = _GDIPlus_RectFCreate(10, $hoehe - 20, 100, 20)
$tScorerect = _GDIPlus_RectFCreate(110, $hoehe - 20, 150, 20)
$tSpeedrect = _GDIPlus_RectFCreate(260, $hoehe - 20, 160, 20)
$tWin_loose_rect = _GDIPlus_RectFCreate($breite / 4, $hoehe /4, $breite / 2, $hoehe/2)
For $i0 = 0 To 4
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if BitAND(BitShift(1, $i2 * -1), $enemy[$i0][$i1]) Then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale, $scale, $scale)
Next
Next
$EnemyPaths[$i0] = _GDIPlus_RegionCreateFromPath($__Temp);kostengünstig ein Gegner erstellt
Next
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if (BitAND(BitShift(1, $i2 * -1), $ship[$i1])) then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale + $shippos_y, $scale, $scale)
Next
Next
$shipPath = _GDIPlus_RegionCreateFromPath($__Temp)
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if (BitAND(BitShift(1, $i2 * -1), $hide[$i1])) then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale + $hoehe - 40 * $scale - 30, $scale, $scale)
Next
Next
For $i1 = 0 To Floor($groese / 4)
$HidePath[$i1] = _GDIPlus_RegionCreateFromPath($__Temp)
_GDIPlus_RegionTranslate($HidePath[$i1], $i1 * ($breite / ($groese / 4)), 0)
Next
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if (BitAND(BitShift(1, $i2 * -1), $life[$i1])) then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale+(11*$scale) + $shippos_y, $scale, $scale)
Next
Next
$lifePath = _GDIPlus_RegionCreateFromPath($__Temp)
$movetimer = _Timer_Init()
$shoottimer = _Timer_Init()
$firetimer = _Timer_SetTimer($Form1, 50,"movebullets")
$firetimer_enemy = _Timer_SetTimer($Form1,1000,"enemyfire")
$Drawtimer = _Timer_SetTimer($Form1,33,"_draw");30 Fps
While 1
If $killcounter = 0 Then _win()
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If _IsPressed("27") And $shippos_x < $breite - 16 * $scale Then
$shippos_x += $shipspeed
_GDIPlus_RegionTranslate($shipPath, +$shipspeed, 0)
EndIf
If _IsPressed("25") And $shippos_x > 0 Then
$shippos_x -= $shipspeed
_GDIPlus_RegionTranslate($shipPath, -$shipspeed, 0)
EndIf
If _IsPressed("20") And _Timer_Diff($shoottimer) > $firedelay Then _fire(-1)
If _Timer_Diff($movetimer) > $speed Then move()
WEnd
Func _draw($hWnd, $iMsg, $iIDTimer, $iTime)
For $i1 = 0 To $groese - 1
For $i2 = 0 To Ceiling($groese/$difficulti) - 1;feld enthällt immer den index des zu zeichnenden objekts
Switch $Field[$i1][$i2];object wird in position translatet und gezeichnet danch wider zurück
Case 0
_GDIPlus_RegionTranslate($EnemyPaths[0], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[0], $brush_grau)
_GDIPlus_RegionTranslate($EnemyPaths[0], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 1
_GDIPlus_RegionTranslate($EnemyPaths[1], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[1], $brush_blau)
_GDIPlus_RegionTranslate($EnemyPaths[1], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 2
_GDIPlus_RegionTranslate($EnemyPaths[2], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[2], $brush_gruen)
_GDIPlus_RegionTranslate($EnemyPaths[2], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 3
_GDIPlus_RegionTranslate($EnemyPaths[3], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[3], $brush_rot)
_GDIPlus_RegionTranslate($EnemyPaths[3], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 4
_GDIPlus_RegionTranslate($EnemyPaths[4], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[4], $brush_white)
_GDIPlus_RegionTranslate($EnemyPaths[4], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
EndSwitch
Next
Next
For $i1 = 0 To Floor($groese / 4);erstellen der Deckung
_GDIPlus_GraphicsFillRegion($hBuffer, $HidePath[$i1], $brush_gruen)
Next
For $i1 = 1 To $bullets[0][0];geschosse einzeichnen
_GDIPlus_GraphicsDrawLine($hBuffer, $bullets[$i1][0], $bullets[$i1][1], $bullets[$i1][0], $bullets[$i1][1] - $scale * 2, $pen_white)
Next
For $1=0 to $lifes-1;leben zeichnen
_GDIPlus_RegionTranslate($lifePath ,20*$scale*$1 ,0)
_GDIPlus_GraphicsFillRegion($hBuffer, $lifePath,$brush_rot)
_GDIPlus_RegionTranslate($lifePath ,-20*$scale*$1 ,0)
Next
_GDIPlus_GraphicsFillRegion($hBuffer, $shipPath, $brush_white);schiff zeichnen region wird translatet um die pos zu erreichen
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Speed: " & Round(400 / $speed, 3), $hFont, $tSpeedrect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Wave: " & $wave, $hFont, $tWaverect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Score: " & $score, $hFont, $tScorerect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0);Buffer zeichnen
_GDIPlus_GraphicsFillRect($hBuffer, 0, 0, $breite, $hoehe);buffer leeren
EndFunc
Func movebullets($hWnd, $iMsg, $iIDTimer, $iTime);bewegt/zerstört geschosse, hit detection, Score
For $i1 = 1 To $bullets[0][0]
$bullets[$i1][1] += $bullets[$i1][2]
If $bullets[$i1][1] < 0 Or $bullets[$i1][1] > $hoehe Then
_ArrayDelete($bullets, $i1)
$bullets[0][0] -= 1
movebullets(0,0,0,0);rekursiver aufruf da sonst for to nicht mehr stimmt
Return;ruft sich solange selber auf bis alle kugeln weg sind die außerhalb des feldes liegen
EndIf
Next
For $i1 = 1 To $bullets[0][0];hit detection
If $bullets[$i1][1] > $shippos_y Then;;wenn das schiff getroffen wird
If $bullets[$i1][0] >$shippos_x and $bullets[$i1][0]<$shippos_x+$scale*16 Then
_loose()
_ArrayDelete($bullets, $i1);kugel löschen
$bullets[0][0] -= 1;anzahl der kugeln anpassen
movebullets(0,0,0,0)
Return
EndIf
EndIf
$__Temp01 = ($bullets[$i1][0] - $posx) / ($scale * 16);kugel pos X im feld
$__Temp02 = ($bullets[$i1][1] - $posy) / ($scale * 16);kugel pos Y im feld
If $__Temp01 < $groese And $__Temp01 > 0 Then;X pos im gegnerfeld
If $__Temp02 < Ceiling($groese/$difficulti) And $__Temp02 > 0 Then;Y pos im gegnerfeld
If $Field[Floor($__Temp01)][Floor($__Temp02)] <> -1 Then;und gegner vorhanden
Switch $Field[Floor($__Temp01)][Floor($__Temp02)];score je nach gegner erhöhen
Case 0
$score += 10
Case 1
$score += 20
Case 2
$score += 25
Case 3
$score += 35
Case 4
$score += 50
EndSwitch
$Field[Floor($__Temp01)][Floor($__Temp02)] = -1;gegner löschen
_ArrayDelete($bullets, $i1);kugel löschen
$killcounter -= 1
$bullets[0][0] -= 1;anzahl der kugeln anpassen
movebullets(0,0,0,0);rekursiver aufruf da sonst for to nicht mehr stimmt wenn ein array element gelöscht wird (do until alternative)
Return;ruft sich solange selber auf bis alle kugeln weg sind die außerhalb des feldes liegen
EndIf
EndIf
EndIf
Next
EndFunc ;==>movebullets
Func _fire($obj);-1=ship 0-$groese=gegner ,erstellt Geschosse
ReDim $bullets[$bullets[0][0] + 2][3]
$bullets[0][0] += 1
If $obj = -1 Then
$shoottimer = _Timer_Init()
$bullets[$bullets[0][0]][0] = $shippos_x + $scale * 8;schiffposition X
$bullets[$bullets[0][0]][1] = $shippos_y;schiffposition Y
$bullets[$bullets[0][0]][2] = -$firespeed; Geschwindigkeit der Geschosse in Pixel pro 50ms
Else
For $1=Ceiling($groese/$difficulti)-1 to 0 step -1;der vorderste gegner muss schießen
If $Field[$obj][$1]<>-1 Then
$shoottimer = _Timer_Init()
$bullets[$bullets[0][0]][1] = $posy+5 + ($1+1) * $scale * 16
$bullets[$bullets[0][0]][0] = $posx + ($obj-.5+Random(0,1))* $scale * 16 + $scale * 8;random.. sorgt für dezent abweichende schusspfade so das keine sichere stellen entstehen
$bullets[$bullets[0][0]][2] = +$firespeed
ExitLoop
EndIf
Next
EndIf
EndFunc ;==>_fire
Func move();bewegt Schiffflotte
$counter += 1
If $counter = $movespace + 1 Then
If $dir = 1 Then
$dir = 0
Else
$dir = 1
$posy += $scale * 12
$speed -= $scale * 6
EndIf
$counter = 1
EndIf
If $dir = 1 Then
$posx += $scale * 16
Else
$posx -= $scale * 16
EndIf
$movetimer = _Timer_Init();timer zurücksetzen
EndFunc ;==>move
Func _win()
_GDIPlus_GraphicsDrawStringEx($hBuffer, "WIN", $hFont_big, $tWin_loose_rect, $hFormat, $brush_gruen)
_draw(0,0,0,0)
For $ie = 0 To $groese - 1;;neues level erstellen
For $ie2 = 0 To Ceiling($groese/$difficulti) - 1
$killcounter += 1
$Field[$ie][$ie2] = Random(0, 4, 1)
Next
Next
$posx=0;;pos zurücksetzen
$posy=0;;dito
$lifes+=1;;leben um 1 erhöhen pro level
$bullets[0][0]=0; schüsse löschen
$speed=400-(($speed-400)/100);erhöt die geschwindigkeit um 1% der geschwindigkeitsdifferez zwischen start und ende der runde
EndFunc ;==>_win
Func _loose()
$lifes-=1
If $lifes >0 Then
Else
_GDIPlus_GraphicsDrawStringEx($hBuffer, "RIP", $hFont_big, $tWin_loose_rect, $hFormat, $brush_gruen)
_Timer_KillAllTimers ( $Form1);killt die mit _Timer_SetTimer erstellten timer
_Timer_KillTimer ( $Form1, $movetimer );killt den rest
_Timer_KillTimer ( $Form1, $shoottimer )
_draw(0,0,0,0)
EndIf
EndFunc ;==>_win
Func enemyfire($hWnd, $iMsg, $iIDTimer, $iTime)
For $1=0 to 9;die reihe die über einem ist sollte feuern
If $shippos_x> $posx+($1-.6)*$scale*16+$scale*8 And $shippos_x< $posx+($1+.6)*$scale*16+$scale*8 Then;der gegner der am nähsten ist feuert
_fire($1)
EndIf
Next
EndFunc
Alles anzeigen
Spoiler anzeigen
Ältere Versionen hier
AutoIt
#include <GUIConstantsEx.au3>
#include <Gdiplus.au3>
#include <Misc.au3>
#include <Array.au3>
Global $breite = 400 ;fenstergröße, mindestens:400
Global $hoehe = $breite;fenstergröße
Global $groese = 10; höhe/(breite) des feldes
Global $difficulti = 2;0=Profi 1=Schwer 2=Normal 3=Leicht
Global $movespace = Floor($groese / 2)
Global $scale = $breite / 16 / ($groese + $movespace);größe der objekte
Global $shipspeed = $scale * 8, $shippos_x = 0, $shippos_y = $hoehe - 24 * $scale - 30
Global $firespeed = $scale * 6;6
Global $firedelay = 333;3 Geschosse pro sek.
Global $wave = 0, $score = 0, $speed = 400, $posx = 0, $posy = 0, $counter, $killcounter = 0, $dir = 1;startposition
Global $enemy[5][11] = [[384, 2016, 16380, 32766, 32766, 29646, 16380, 1632, 3504, 6168, 12300],[4104, 2064, 8184, 15324, 32766, 24570, 20490, 20082, 0, 0, 0],[384, 960, 2016, 3504, 8184, 8184, 576, 1440, 2640, 0, 0],[960, 4080, 8184, 16380, 28086, 65535, 14748, 4104, 0, 0, 0],[448, 8188, 16382, 15518, 16382, 864, 1712, 6156, 0, 0, 0]];gegnerform 16x11 pixel
Global $hide[11] = [65535, 65535, 65535, 65535, 63519, 61455, 57351, 57351, 57351, 57351, 0]
Global $ship[11] = [384, 384, 960, 960, 8184, 16380, 16380, 16380, 0, 0, 0]
Global $Field[$groese][Ceiling($groese/$difficulti)];gegnerflotte
Global $EnemyPaths[5], $HidePath[Floor($groese / 4) + 1], $bullets[2][3] = [[1, 0, 0]];[x][Y]=X=laufende NR Y=0=Xpos Y=1=Ypos Y=2=Dir/Speed
For $ie = 0 To $groese - 1
For $ie2 = 0 To Ceiling($groese/$difficulti) - 1
$killcounter += 1
$Field[$ie][$ie2] = Random(0, 4, 1)
Next
Next
_GDIPlus_Startup()
$Form1 = GUICreate("Invader", $breite, $hoehe)
GUISetState(@SW_SHOW)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($Form1)
_GDIPlus_GraphicsClear($hGraphics, 0xFF000000)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($breite, $hoehe, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$brush_grau = _GDIPlus_BrushCreateSolid(0xFF888888)
$brush_blau = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$brush_gruen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
$brush_rot = _GDIPlus_BrushCreateSolid(0xFFFF0000)
$brush_white = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$pen_white = _GDIPlus_PenCreate(0xFFFFFFFF, $scale, 2)
$hFormat = _GDIPlus_StringFormatCreate()
$hFamily = _GDIPlus_FontFamilyCreate("Arial")
$hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
$hFont_big = _GDIPlus_FontCreate($hFamily, $hoehe/8, 2)
$tWaverect = _GDIPlus_RectFCreate(10, $hoehe - 20, 100, 20)
$tScorerect = _GDIPlus_RectFCreate(110, $hoehe - 20, 150, 20)
$tSpeedrect = _GDIPlus_RectFCreate(260, $hoehe - 20, 160, 20)
$tWin_loose_rect = _GDIPlus_RectFCreate($breite / 4, $hoehe /4, $breite / 2, $hoehe/2)
For $i0 = 0 To 4
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if BitAND(BitShift(1, $i2 * -1), $enemy[$i0][$i1]) Then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale, $scale, $scale)
Next
Next
$EnemyPaths[$i0] = _GDIPlus_RegionCreateFromPath($__Temp);kostengünstig ein Gegner erstellt
Next
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if (BitAND(BitShift(1, $i2 * -1), $ship[$i1])) then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale + $shippos_y, $scale, $scale)
Next
Next
$shipPath = _GDIPlus_RegionCreateFromPath($__Temp)
$__Temp = _GDIPlus_PathCreate()
For $i1 = 0 To 10
For $i2 = 0 To 15
if (BitAND(BitShift(1, $i2 * -1), $hide[$i1])) then _GDIPlus_PathAddRectangle($__Temp, $i2 * $scale, $i1 * $scale + $hoehe - 40 * $scale - 30, $scale, $scale)
Next
Next
For $i1 = 0 To Floor($groese / 4)
$HidePath[$i1] = _GDIPlus_RegionCreateFromPath($__Temp)
_GDIPlus_RegionTranslate($HidePath[$i1], $i1 * ($breite / ($groese / 4)), 0)
Next
$movetimer = TimerInit()
$firetimer = TimerInit()
$shoottimer = TimerInit()
While 1
If $killcounter = 0 Then _win()
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If _IsPressed("27") And $shippos_x < $breite - 16 * $scale Then
$shippos_x += $shipspeed
_GDIPlus_RegionTranslate($shipPath, +$shipspeed, 0)
EndIf
If _IsPressed("25") And $shippos_x > 0 Then
$shippos_x -= $shipspeed
_GDIPlus_RegionTranslate($shipPath, -$shipspeed, 0)
EndIf
If _IsPressed("20") And TimerDiff($shoottimer) > $firedelay Then _fire(-1)
If TimerDiff($movetimer) > $speed Then move()
If TimerDiff($firetimer) > 50 Then movebullets()
For $i1 = 0 To $groese - 1
For $i2 = 0 To Ceiling($groese/$difficulti) - 1;feld enthällt immer den index des zu zeichnenden objekts
Switch $Field[$i1][$i2];object wird in position translatet und gezeichnet danch wider zurück
Case 0
_GDIPlus_RegionTranslate($EnemyPaths[0], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[0], $brush_grau)
_GDIPlus_RegionTranslate($EnemyPaths[0], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 1
_GDIPlus_RegionTranslate($EnemyPaths[1], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[1], $brush_blau)
_GDIPlus_RegionTranslate($EnemyPaths[1], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 2
_GDIPlus_RegionTranslate($EnemyPaths[2], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[2], $brush_gruen)
_GDIPlus_RegionTranslate($EnemyPaths[2], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 3
_GDIPlus_RegionTranslate($EnemyPaths[3], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[3], $brush_rot)
_GDIPlus_RegionTranslate($EnemyPaths[3], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
Case 4
_GDIPlus_RegionTranslate($EnemyPaths[4], ($i1 * 16 * $scale) + $posx, ($i2 * 16 * $scale) + $posy)
_GDIPlus_GraphicsFillRegion($hBuffer, $EnemyPaths[4], $brush_white)
_GDIPlus_RegionTranslate($EnemyPaths[4], -($i1 * 16 * $scale) - $posx, -($i2 * 16 * $scale) - $posy)
EndSwitch
Next
Next
For $i1 = 0 To Floor($groese / 4);erstellen der Deckung
_GDIPlus_GraphicsFillRegion($hBuffer, $HidePath[$i1], $brush_gruen)
Next
For $i1 = 1 To $bullets[0][0];geschosse einzeichnen
_GDIPlus_GraphicsDrawLine($hBuffer, $bullets[$i1][0], $bullets[$i1][1], $bullets[$i1][0], $bullets[$i1][1] - $scale * 2, $pen_white)
Next
_GDIPlus_GraphicsFillRegion($hBuffer, $shipPath, $brush_white);schiff zeichnen region wird translatet um die pos zu erreichen
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Speed: " & Round(400 / $speed, 3), $hFont, $tSpeedrect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Wave: " & $wave, $hFont, $tWaverect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawStringEx($hBuffer, "Score: " & $score, $hFont, $tScorerect, $hFormat, $brush_white)
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0);Buffer zeichnen
_GDIPlus_GraphicsFillRect($hBuffer, 0, 0, $breite, $hoehe);buffer leeren
WEnd
Func movebullets();bewegt/zerstört geschosse, hit detection, Score
For $i1 = 1 To $bullets[0][0]
$bullets[$i1][1] += $bullets[$i1][2]
If $bullets[$i1][1] < 0 Or $bullets[$i1][1] > $hoehe Then
_ArrayDelete($bullets, $i1)
$bullets[0][0] -= 1
movebullets();rekursiver aufruf da sonst for to nicht mehr stimmt
Return;ruft sich solange selber auf bis alle kugeln weg sind die außerhalb des feldes liegen
EndIf
Next
For $i1 = 1 To $bullets[0][0];hit detection
$__Temp01 = ($bullets[$i1][0] - $posx) / ($scale * 16);kugel pos X im feld
$__Temp02 = ($bullets[$i1][1] - $posy) / ($scale * 16);kugel pos Y im feld
If $__Temp01 < $groese And $__Temp01 > 0 Then;X pos im gegnerfeld
If $__Temp02 < Ceiling($groese/$difficulti) And $__Temp02 > 0 Then;Y pos im gegnerfeld
If $Field[Floor($__Temp01)][Floor($__Temp02)] <> -1 Then;und gegner vorhanden
Switch $Field[Floor($__Temp01)][Floor($__Temp02)];score je nach gegner erhöhen
Case 0
$score += 10
Case 1
$score += 20
Case 2
$score += 25
Case 3
$score += 35
Case 4
$score += 50
EndSwitch
$Field[Floor($__Temp01)][Floor($__Temp02)] = -1;gegner löschen
_ArrayDelete($bullets, $i1);kugel löschen
$killcounter -= 1
$bullets[0][0] -= 1;anzahl der kugeln anpassen
movebullets();rekursiver aufruf da sonst for to nicht mehr stimmt wenn ein array element gelöscht wird (do until alternative)
Return;ruft sich solange selber auf bis alle kugeln weg sind die außerhalb des feldes liegen
EndIf
EndIf
EndIf
Next
$firetimer = TimerInit();timer nullen
EndFunc ;==>movebullets
Func _fire($obj);-1=ship 0-$groese=gegner ,erstellt Geschosse
ReDim $bullets[$bullets[0][0] + 2][3]
$bullets[0][0] += 1
If $obj = -1 Then
$shoottimer = TimerInit()
$bullets[$bullets[0][0]][0] = $shippos_x + $scale * 8;schiffposition X
$bullets[$bullets[0][0]][1] = $shippos_y;schiffposition Y
$bullets[$bullets[0][0]][2] = -$firespeed; Geschwindigkeit der Geschosse in Pixel pro 50ms
Else
$bullets[$bullets[0][0]][0] = $posx + Mod($obj, $groese) * $scale * 16 + $scale * 8
$bullets[$bullets[0][0]][1] = $posy + Floor($obj / $groese) * $scale * 16
$bullets[$bullets[0][0]][2] = +$firespeed
EndIf
EndFunc ;==>_fire
Func move();bewegt Schiff
$counter += 1
If $counter = $movespace + 1 Then
If $dir = 1 Then
$dir = 0
Else
$dir = 1
$posy += $scale * 12
$speed -= $scale * 6
EndIf
$counter = 1
EndIf
If $dir = 1 Then
$posx += $scale * 16
Else
$posx -= $scale * 16
EndIf
$movetimer = TimerInit()
EndFunc ;==>move
Func _win()
_GDIPlus_GraphicsDrawStringEx($hBuffer, "WIN", $hFont_big, $tWin_loose_rect, $hFormat, $brush_gruen)
EndFunc ;==>_win
Alles anzeigen