Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Source] Bomberman multiplayer


wefhy

Rekomendowane odpowiedzi

Opublikowano

Przedstawiam wam grę bomberman, pierwsza gra, która powstała na niedawno przeze mnie utworzonym generatorze map w irrlight. W grę można grać w 2 osoby, w przyszłości będzie też możliwość gry w pojedynkę, ale na razie nie mam pomysłu na AI(jak ktoś ma to proszę o kontakt!). Możliwość grania przez lan też się pojawi, raczej szybciej niż AI. Na razie jest możliwość grania w 2 osoby na jednym komputerze. Jedna steruje WASD i spacją, a druga strzałkami i enterem. Każdy gracz ma 3 życia, podczas uruchamiania gry można wybrać wielkość planszy i czas spoczynku procesora(im mniejszy tym większy fps i szybkość gry). Na wolniejszych komputerach radzę ustawić 0 lub 1, bo najlepiej się gra przy 30fps. Jak ktoś ma w miarę dobry procesor to może ustawić większy czas spoczynku. Przykładowo dla mojego i3 najlepszy jest 20. W grze możemy niszczyć drewniane przeszkody przy pomocy bomb i zdobywać bonusy jak większa prędkość, większy zasięg bomb, dodatkowe życie lub więcej bomb do postawienia(na początku gracz może postawić tylko jedną bombę na raz).

Cały kod jest mojego autorstwa, oprócz include'ów nie znajdziecie tu nic napisanego przez inną osobę.

Irrlight nie działa po uruchomieniu jako aplikacja x64 więc jeśli uruchamiamy grę przez SciTE i mamy system x64, to czasami żeby działało musimy najpierw grę skompilować do x86(i tylko do x86!). Wtedy interpreter to zapamięta i przez normalne wciśnięcie F5 także będzie używał interpretera x86.

 

 

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;MsgBox(0, "", $CMDLINERAW)


#include "au3Irrlicht2.au3"
#include "misc.au3"
#include <Array.au3>
;#OnAutoItStartRegister "Setup"

$Opcje=GUICreate("Opcje", 400, 110)
GUICtrlCreateLabel("Szerokość:", 5, 5)
GUICtrlCreateLabel("Wycokość:", 5, 30)
GUICtrlCreateLabel("Czas spoczynku procesora na klatkę(ms):", 5, 55)
$input1=GUICtrlCreateInput(19, 200, 5, 195)
$input2=GUICtrlCreateInput(13, 200, 30, 195)
$input3=GUICtrlCreateInput(20, 200, 55, 195)
$start=GUICtrlCreateButton("Start!", 5, 80, 390)
GUISetState()
Do
Sleep(10)
Until GUIGetMsg()=$start

Opt("GUIOnEventMode", 1)
HotKeySet("{Esc}", "Exi")
Global $random=4, $sizex=GUICtrlRead($input1), $sizey=GUICtrlRead($input2), $bomb_frames_to_boom=100, $sleep=GUICtrlRead($input3)
Global $maps[2], $mapsize[2], $map, $PicPlayer1, $PicPlayer2, $time=0, $Bombs[2][2][2], $Booms[2][2][2], $Items[2][2], $immortal[2], $UsedBombs1[100][2], $UsedBombs2[100][2], $player1info[4]=[2, 1, 3, 4], $player2info[4]=[2, 1, 3, 4];0 - zasięg 1-ilośc bomb 2-ilosć żyć, 3-prędkość
Global $texturepack=IniRead("Properties.ini", "Settings", "texturepack", "Normal\scaled"), $Color=IniRead("Properties.ini", "Settings", "bkcolor", 0x010101), $maxmap[2]=[iniRead("Properties.ini", "Settings", "Maxmapx", 50), IniRead("Properties.ini", "Settings", "Maxmapy", 30)], $visual=IniRead("Properties.ini", "Settings", "pixels", 32)
Global $GameName="Wefhy's Bomberman", $Terrain[$maxmap[0]+1][$maxmap[1]+1], $tekstury[3]=["Texturepack\" & $texturepack & "\Trawa.bmp", "Texturepack\" & $texturepack & "\Skała.bmp", "Texturepack\" & $texturepack & "\Drewno.bmp"]
$hdll=DllOpen("user32.dll")
OnAutoItExitRegister("close")

GUIDelete($Opcje)
MapRandom($sizex,$sizey)
GUICreate("Gra", 140, 200, 0, 0)
GUISetBkColor(0xffffff)
GUISetState()
GUICtrlCreateLabel("Gracz czerwony życie:", 5, 5, 110)
GUICtrlCreateLabel("Gracz niebieski życie:", 5, 30, 110)
$labellives1=GUICtrlCreateLabel($player1info[2], 115, 5, 25)
$labellives2=GUICtrlCreateLabel($player2info[2], 115, 30, 25)

Global $Player1[2]=[($maps[0]-1)*$visual, ($maps[1]-1)*$visual];położenie gracza 1
Global $Player2[2]=[0, 0];położenie gracza 2
_IrrStart($IRR_EDT_DIRECT3D9, $visual*$sizex, $visual*$sizey) ;zainicjowanie silnika Irrlicht
_IrrSetWindowCaption( "Bomberman" )
$PicPlayer1=_irrgettexture("player1.bmp")
$PicPlayer2=_irrgettexture("player2.bmp")
$PicBomb=_irrgettexture("Bomb.bmp")
$PicBoom=_irrgettexture("Boom.bmp")
_IrrColorKeyTexture($PicPlayer1, 255,255,255 )
_IrrColorKeyTexture($PicPlayer2, 255,255,255 )
_IrrColorKeyTexture($PicBomb, 255,255,255 )
_IrrColorKeyTexture($PicBoom, 255,255,255 )
Global $PicItem[5]=[0, _irrgettexture("Item1.bmp"), _irrgettexture("Item2.bmp"), _irrgettexture("Item3.bmp"), _irrgettexture("Item4.bmp")]
Global $grafika[3]=[_irrgettexture($tekstury[0]), _irrgettexture($tekstury[1]), _irrgettexture($tekstury[2])]



_IrrBeginScene( 0,0,0)
For $temp1=1 to $maps[0]
For $temp2=1 to $maps[1]
_IrrDraw2DImageElement( $grafika[$Terrain[$temp1][$temp2]], $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_IGNORE_ALPHA )
Next
Next

_IrrDraw2DImageElement( $PicPlayer1, $Player1[0] ,$Player1[1], 0,0,$visual,$visual, $IRR_use_ALPHA )
_IrrDraw2DImageElement( $PicPlayer2, $Player2[0] ,$Player2[1], 0,0,$visual,$visual, $IRR_use_ALPHA )
_Irrendscene()
Global $Round1[4], $Round2[4], $klatka, $ispressed1[4], $ispressed2[4]
AdlibRegister("FPS", 1000)
HotKeySet("{enter}", "Bomb1")
HotKeySet("{space}", "Bomb2")

While _IrrRunning()
$ispressed1[0]=_IsPressed("27", $hdll)
$ispressed1[1]=_IsPressed("25", $hdll)
$ispressed1[2]=_IsPressed("28", $hdll)
$ispressed1[3]=_IsPressed("26", $hdll)
$ispressed2[0]=_IsPressed("44", $hdll)
$ispressed2[1]=_IsPressed("41", $hdll)
$ispressed2[2]=_IsPressed("53", $hdll)
$ispressed2[3]=_IsPressed("57", $hdll)
$klatka+=1
$time+=1
Sleep($sleep)
$Round1[0]=Round($Player1[0]/$visual)+1
$Round1[1]=Round($Player1[1]/$visual)+1
$Round2[0]=Round($Player2[0]/$visual)+1
$Round2[1]=Round($Player2[1]/$visual)+1

#Region ### Sterowanie graczem 1
if $ispressed1[0] Then
$Round1[2]=Round(($Player1[0]+$player1info[3])/$visual)+1
$Round1[3]=Round($Player1[1]/$visual)+1
If Not $Terrain[$Round1[2]][$Round1[3]] Then
$Player1[0]+=$player1info[3]
ElseIf $ispressed1[2] Or $ispressed1[3] Then

ElseIf $Terrain[$Round1[0]][$Round1[1]+1]=0 And $Terrain[$Round1[0]+1][$Round1[1]+1]=0 And $Terrain[$Round1[0]][$Round1[1]-1]=0 And $Terrain[$Round1[0]+1][$Round1[1]-1]=0 Then
If $Player1[1]/$visual+1>$Round1[1] Then
$Player1[1]+=$player1info[3]
Else
$Player1[1]-=$player1info[3]
EndIf
ElseIf $Terrain[$Round1[0]][$Round1[1]+1]=0 And $Terrain[$Round1[0]+1][$Round1[1]+1]=0 Then
$Player1[1]+=$player1info[3]
ElseIf $Terrain[$Round1[0]][$Round1[1]-1]=0 And $Terrain[$Round1[0]+1][$Round1[1]-1]=0 Then
$Player1[1]-=$player1info[3]
EndIf
EndIf

if $ispressed1[1] Then
$Round1[2]=Round(($Player1[0]-$player1info[3])/$visual)+1
$Round1[3]=Round($Player1[1]/$visual)+1
If Not $Terrain[$Round1[2]][$Round1[3]] Then
$Player1[0]-=$player1info[3]
ElseIf $ispressed1[2] Or $ispressed1[3] Then

ElseIf $Terrain[$Round1[0]][$Round1[1]+1]=0 And $Terrain[$Round1[0]-1][$Round1[1]+1]=0 And $Terrain[$Round1[0]][$Round1[1]-1]=0 And $Terrain[$Round1[0]-1][$Round1[1]-1]=0 Then
If $Player1[1]/$visual+1>$Round1[1] Then
$Player1[1]+=$player1info[3]
Else
$Player1[1]-=$player1info[3]
EndIf
ElseIf $Terrain[$Round1[0]][$Round1[1]+1]=0 And $Terrain[$Round1[0]-1][$Round1[1]+1]=0 Then
$Player1[1]+=$player1info[3]
ElseIf $Terrain[$Round1[0]][$Round1[1]-1]=0 And $Terrain[$Round1[0]-1][$Round1[1]-1]=0 Then
$Player1[1]-=$player1info[3]
EndIf
EndIf

if $ispressed1[2] Then
$Round1[2]=Round($Player1[0]/$visual)+1
$Round1[3]=Round(($Player1[1]+$player1info[3])/$visual)+1
If Not $Terrain[$Round1[2]][$Round1[3]] Then
$Player1[1]+=$player1info[3]
ElseIf $ispressed1[0] Or $ispressed1[1] Then

ElseIf $Terrain[$Round1[0]+1][$Round1[1]]=0 And $Terrain[$Round1[0]+1][$Round1[1]+1]=0 And $Terrain[$Round1[0]-1][$Round1[1]]=0 And $Terrain[$Round1[0]-1][$Round1[1]+1]=0 Then
If $Player1[0]/$visual+1>$Round1[0] Then
$Player1[0]+=$player1info[3]
Else
$Player1[0]-=$player1info[3]
EndIf
ElseIf $Terrain[$Round1[0]+1][$Round1[1]]=0 And $Terrain[$Round1[0]+1][$Round1[1]+1]=0 Then
$Player1[0]+=$player1info[3]
ElseIf $Terrain[$Round1[0]-1][$Round1[1]]=0 And $Terrain[$Round1[0]-1][$Round1[1]+1]=0 Then
$Player1[0]-=$player1info[3]
EndIf
EndIf

if $ispressed1[3] Then
$Round1[2]=Round($Player1[0]/$visual)+1
$Round1[3]=Round(($Player1[1]-$player1info[3])/$visual)+1
If Not $Terrain[$Round1[2]][$Round1[3]] Then
$Player1[1]-=$player1info[3]
ElseIf $ispressed1[0] Or $ispressed1[1] Then

ElseIf $Terrain[$Round1[0]+1][$Round1[1]]=0 And $Terrain[$Round1[0]+1][$Round1[1]-1]=0 And $Terrain[$Round1[0]-1][$Round1[1]]=0 And $Terrain[$Round1[0]-1][$Round1[1]-1]=0 Then
If $Player1[0]/$visual+1>$Round1[0] Then
$Player1[0]+=$player1info[3]
Else
$Player1[0]-=$player1info[3]
EndIf
ElseIf $Terrain[$Round1[0]+1][$Round1[1]]=0 And $Terrain[$Round1[0]+1][$Round1[1]-1]=0 Then
$Player1[0]+=$player1info[3]
ElseIf $Terrain[$Round1[0]-1][$Round1[1]]=0 And $Terrain[$Round1[0]-1][$Round1[1]-1]=0 Then
$Player1[0]-=$player1info[3]
EndIf
EndIf
#EndRegion ### --> Sterowanie graczem 1

#Region ### Sterowanie graczem 2
if $ispressed2[0] Then
$Round2[2]=Round(($Player2[0]+$player2info[3])/$visual)+1
$Round2[3]=Round($Player2[1]/$visual)+1
If Not $Terrain[$Round2[2]][$Round2[3]] Then
$Player2[0]+=$player2info[3]
ElseIf $ispressed2[2] Or $ispressed2[3] Then

ElseIf $Terrain[$Round2[0]][$Round2[1]+1]=0 And $Terrain[$Round2[0]+1][$Round2[1]+1]=0 And $Terrain[$Round2[0]][$Round2[1]-1]=0 And $Terrain[$Round2[0]+1][$Round2[1]-1]=0 Then
If $Player2[1]/$visual+1>$Round2[1] Then
$Player2[1]+=$player2info[3]
Else
$Player2[1]-=$player2info[3]
EndIf
ElseIf $Terrain[$Round2[0]][$Round2[1]+1]=0 And $Terrain[$Round2[0]+1][$Round2[1]+1]=0 Then
$Player2[1]+=$player2info[3]
ElseIf $Terrain[$Round2[0]][$Round2[1]-1]=0 And $Terrain[$Round2[0]+1][$Round2[1]-1]=0 Then
$Player2[1]-=$player2info[3]
EndIf
EndIf

if $ispressed2[1] Then
$Round2[2]=Round(($Player2[0]-$player2info[3])/$visual)+1
$Round2[3]=Round($Player2[1]/$visual)+1
If Not $Terrain[$Round2[2]][$Round2[3]] Then
$Player2[0]-=$player2info[3]
ElseIf $ispressed2[2] Or $ispressed2[3] Then

ElseIf $Terrain[$Round2[0]][$Round2[1]+1]=0 And $Terrain[$Round2[0]-1][$Round2[1]+1]=0 And $Terrain[$Round2[0]][$Round2[1]-1]=0 And $Terrain[$Round2[0]-1][$Round2[1]-1]=0 Then
If $Player2[1]/$visual+1>$Round2[1] Then
$Player2[1]+=$player2info[3]
Else
$Player2[1]-=$player2info[3]
EndIf
ElseIf $Terrain[$Round2[0]][$Round2[1]+1]=0 And $Terrain[$Round2[0]-1][$Round2[1]+1]=0 Then
$Player2[1]+=$player2info[3]
ElseIf $Terrain[$Round2[0]][$Round2[1]-1]=0 And $Terrain[$Round2[0]-1][$Round2[1]-1]=0 Then
$Player2[1]-=$player2info[3]
EndIf
EndIf

if $ispressed2[2] Then
$Round2[2]=Round($Player2[0]/$visual)+1
$Round2[3]=Round(($Player2[1]+$player2info[3])/$visual)+1
If Not $Terrain[$Round2[2]][$Round2[3]] Then
$Player2[1]+=$player2info[3]
ElseIf $ispressed2[0] Or $ispressed2[1] Then

ElseIf $Terrain[$Round2[0]+1][$Round2[1]]=0 And $Terrain[$Round2[0]+1][$Round2[1]+1]=0 And $Terrain[$Round2[0]-1][$Round2[1]]=0 And $Terrain[$Round2[0]-1][$Round2[1]+1]=0 Then
If $Player2[0]/$visual+1>$Round2[0] Then
$Player2[0]+=$player2info[3]
Else
$Player2[0]-=$player2info[3]
EndIf
ElseIf $Terrain[$Round2[0]+1][$Round2[1]]=0 And $Terrain[$Round2[0]+1][$Round2[1]+1]=0 Then
$Player2[0]+=$player2info[3]
ElseIf $Terrain[$Round2[0]-1][$Round2[1]]=0 And $Terrain[$Round2[0]-1][$Round2[1]+1]=0 Then
$Player2[0]-=$player2info[3]
EndIf
EndIf

if $ispressed2[3] Then
$Round2[2]=Round($Player2[0]/$visual)+1
$Round2[3]=Round(($Player2[1]-$player2info[3])/$visual)+1
If Not $Terrain[$Round2[2]][$Round2[3]] Then
$Player2[1]-=$player2info[3]
ElseIf $ispressed2[0] Or $ispressed2[1] Then

ElseIf $Terrain[$Round2[0]+1][$Round2[1]]=0 And $Terrain[$Round2[0]+1][$Round2[1]-1]=0 And $Terrain[$Round2[0]-1][$Round2[1]]=0 And $Terrain[$Round2[0]-1][$Round2[1]-1]=0 Then
If $Player2[0]/$visual+1>$Round2[0] Then
$Player2[0]+=$player2info[3]
Else
$Player2[0]-=$player2info[3]
EndIf
ElseIf $Terrain[$Round2[0]+1][$Round2[1]]=0 And $Terrain[$Round2[0]+1][$Round2[1]-1]=0 Then
$Player2[0]+=$player2info[3]
ElseIf $Terrain[$Round2[0]-1][$Round2[1]]=0 And $Terrain[$Round2[0]-1][$Round2[1]-1]=0 Then
$Player2[0]-=$player2info[3]
EndIf
EndIf
#EndRegion ### --> Sterowanie graczem 2

#Region ### Rysowanie mapy
_IrrBeginScene( 0,0,0)
For $temp1=1 to $maps[0]
For $temp2=1 to $maps[1]
_IrrDraw2DImageElement( $grafika[$Terrain[$temp1][$temp2]], $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_IGNORE_ALPHA )
If $Bombs[$temp1][$temp2][0] Then
If $Bombs[$temp1][$temp2][0]=$time Then
$Bombs[$temp1][$temp2][0]=0
BombUse_Remove($temp1, $temp2)
For $licz=0 To $Bombs[$temp1][$temp2][1]
If $Terrain[$temp1][$temp2+$licz]=2 Then
$Terrain[$temp1][$temp2+$licz]=0
$Booms[$temp1][$temp2+$licz][0]=$time+10
$Items[$temp1][$temp2+$licz]=ItemRandom()
ExitLoop
ElseIf $Terrain[$temp1][$temp2+$licz] Then
ExitLoop
EndIf
$Booms[$temp1][$temp2+$licz][0]=$time+10
Next
For $licz=0 To $Bombs[$temp1][$temp2][1]
If $Terrain[$temp1][$temp2-$licz]=2 Then
$Terrain[$temp1][$temp2-$licz]=0
$Booms[$temp1][$temp2-$licz][0]=$time+10
ExitLoop
ElseIf $Terrain[$temp1][$temp2-$licz] Then
ExitLoop
EndIf
$Booms[$temp1][$temp2-$licz][0]=$time+10
Next
For $licz=0 To $Bombs[$temp1][$temp2][1]
If $Terrain[$temp1+$licz][$temp2]=2 Then
$Terrain[$temp1+$licz][$temp2]=0
$Booms[$temp1+$licz][$temp2][0]=$time+10
ExitLoop
ElseIf $Terrain[$temp1+$licz][$temp2] Then
ExitLoop
EndIf
$Booms[$temp1+$licz][$temp2][0]=$time+10
Next
For $licz=0 To $Bombs[$temp1][$temp2][1]
If $Terrain[$temp1-$licz][$temp2]=2 Then
$Terrain[$temp1-$licz][$temp2]=0
$Booms[$temp1-$licz][$temp2][0]=$time+10
ExitLoop
ElseIf $Terrain[$temp1-$licz][$temp2] Then
ExitLoop
EndIf
$Booms[$temp1-$licz][$temp2][0]=$time+10
Next
Else
_IrrDraw2DImageElement( $PicBomb, $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_USE_ALPHA )
EndIf
EndIf
Next
Next
#EndRegion ### <--Rysowanie mapy

#Region ### Immortal
If $immortal[0]=$time Then
$immortal[0]=0
GUICtrlSetBkColor($labellives1, 0xffffff)
EndIf
If $immortal[1]=$time Then
$immortal[1]=0
GUICtrlSetBkColor($labellives2, 0xffffff)
EndIf
#EndRegion ### <-- Immortal

#Region ### Rysowanie wybuchów i itemków
For $temp1=1 to $maps[0]
For $temp2=1 to $maps[1]
If $Items[$temp1][$temp2] Then
$ItemDelete=False
_IrrDraw2DImageElement( $PicItem[$Items[$temp1][$temp2]], $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_USE_ALPHA )
If $Round1[0]=$temp1 And $Round1[1]=$temp2 Then $ItemDelete=ItemPickUp(1, $Items[$temp1][$temp2])
If $Round2[0]=$temp1 And $Round2[1]=$temp2 Then $ItemDelete=ItemPickUp(2, $Items[$temp1][$temp2])
If $ItemDelete Then $Items[$temp1][$temp2]=0
If $Bombs[$temp1][$temp2][0] Then _IrrDraw2DImageElement( $PicBomb, $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_USE_ALPHA )
EndIf
If $Booms[$temp1][$temp2][0] Then
If $Booms[$temp1][$temp2][0]=$time Then
$Booms[$temp1][$temp2][0]=0
Else
_IrrDraw2DImageElement( $PicBoom, $temp1*$visual-$visual, $temp2*$visual-$visual, 0,0,32,32, $IRR_USE_ALPHA )
If $Bombs[$temp1][$temp2][0] Then $Bombs[$temp1][$temp2][0]=$time+1
If $Round1[0]=$temp1 And $Round1[1]=$temp2 Then HitPlayer(1)
If $Round2[0]=$temp1 And $Round2[1]=$temp2 Then HitPlayer(2)
EndIf
EndIf
Next
Next
#EndRegion ### <-Rysowanie wybuchów i itemków
_IrrDraw2DImageElement( $PicPlayer1, $Player1[0] ,$Player1[1], 0,0,$visual,$visual, $IRR_use_ALPHA )
_IrrDraw2DImageElement( $PicPlayer2, $Player2[0] ,$Player2[1], 0,0,$visual,$visual, $IRR_use_ALPHA )
_Irrendscene()
;ToolTip($Round1[0] & @CRLF & $Round1[1])
WEnd


Func MapRandom($sizex, $sizey)
$mapname="Mapa"
$mapsize[0]=$sizex
$mapsize[1]=$sizey
$maps[0]=$mapsize[0]
$maps[1]=$mapsize[1]
;If ($mapsize[0]=0 Or Not ($mapsize[0]<$maxmap[0])) then $maps[0]=$maxmap[0]-1
;If ($mapsize[1]=0 Or Not ($mapsize[1]<$maxmap[1])) then $maps[1]=$maxmap[1]-1
For $temp1=0 to $maps[0]+1
For $temp2=0 to $maps[1]+1
If not(Mod($temp1, 2) Or Mod($temp2, 2)) Or $temp1=0 Or $temp2=0 Or $temp1=$maps[0]+1 Or $temp2=$maps[1]+1 Then
$temp3=1
ElseIf Random(0, $random, 1) And ($temp1>2 Or $temp2>2) And ($maps[0]+1-$temp1>2 Or $temp2>2) And ($temp1>2 Or $maps[1]+1-$temp2>2) And ($maps[0]+1-$temp1>2 Or $maps[1]+1-$temp2>2) Then
$temp3=2
Else
$temp3=0
EndIf

;$temp3=(Random(0, 4, 1)>0)
$Terrain[$temp1][$temp2]=$temp3
Next
Next
ReDim $Bombs[$maps[0]+1][$maps[1]+1][2]
ReDim $Booms[$maps[0]+1][$maps[1]+1][2]
ReDim $Items[$maps[0]+1][$maps[1]+1]

EndFunc


func Exi()
Exit
EndFunc
Func Close()
DllClose($hdll)
FileClose($map)
EndFunc

Func FPS()
_IrrSetWindowCaption( "Bomberman - " & $klatka & "fps" )
$klatka=0
EndFunc

Func Bomb1()
If Not $Bombs[$Round1[0]][$Round1[1]][0] And ArrayMath($UsedBombs1, $Player1info[1]) Then
$Bombs[$Round1[0]][$Round1[1]][0]=$time+$bomb_frames_to_boom
$Bombs[$Round1[0]][$Round1[1]][1]=$Player1info[0]
ArrayAdd($UsedBombs1, $Round1[0], $Round1[1])
EndIf
EndFunc

Func Bomb2()
If Not $Bombs[$Round2[0]][$Round2[1]][0] And ArrayMath($UsedBombs2, $Player2info[1]) Then
$Bombs[$Round2[0]][$Round2[1]][0]=$time+$bomb_frames_to_boom
$Bombs[$Round2[0]][$Round2[1]][1]=$Player2info[0]
ArrayAdd($UsedBombs2, $Round2[0], $Round2[1])
EndIf
EndFunc

Func BombUse_Remove($x, $y)
For $licz=0 To UBound($UsedBombs1, 1)-1
If $UsedBombs1[$licz][0]=$x And $UsedBombs1[$licz][1]=$y Then
$UsedBombs1[$licz][0]=0
$UsedBombs1[$licz][1]=0
EndIf
If $UsedBombs2[$licz][0]=$x And $UsedBombs2[$licz][1]=$y Then
$UsedBombs2[$licz][0]=0
$UsedBombs2[$licz][1]=0
EndIf
Next
EndFunc

Func ArrayAdd(ByRef $array, $add1, $add2)
For $licz=0 To UBound($array, 1)-1
If $array[$licz][0]=0 And $array[$licz][1]=0 Then
$array[$licz][0]=$add1
$array[$licz][1]=$add2
ExitLoop
EndIf
Next
EndFunc

Func ArrayMath($array, $number)
$licz2=0
For $licz=0 To UBound($array, 1)-1
If $array[$licz][0]>0 And $array[$licz][1]>0 Then $licz2+=1
Next
If $licz2<$number Then Return 1
Return 0
EndFunc

Func HitPlayer($P)
If $P=1 Then
If Not $immortal[0] Then
$immortal[0]=$time+50
$player1info[2]-=1
GUICtrlSetData($labellives1, $player1info[2])
GUICtrlSetBkColor($labellives1, 0xff0000)
If $player1info[2]<=0 Then Win(MsgBox(4, "Koniec gry", "Wygrał gracz niebieski" & @CRLF & "Zagrać jeszcze raz?"))
EndIf
ElseIf $P=2 Then
If Not $immortal[1] Then
$immortal[1]=$time+50
$player2info[2]-=1
GUICtrlSetData($labellives2, $player2info[2])
GUICtrlSetBkColor($labellives2, 0xff0000)
If $player2info[2]<=0 Then Win(MsgBox(4, "Koniec gry", "Wygrał gracz czerwony" & @CRLF & "Zagrać jeszcze raz?"))
EndIf
EndIf
EndFunc

Func Win($iMsgBoxAnswer)
Select
Case $iMsgBoxAnswer = 6 ;Yes
MapRandom($sizex,$sizey)
Global $Player1[2]=[($maps[0]-1)*$visual, ($maps[1]-1)*$visual], $Player2[2]=[0, 0], $player1info[4]=[2, 1, 3, 4], $player2info[4]=[2, 1, 3, 4], $Bombs[$maps[0]+1][$maps[1]+1][2], $Booms[$maps[0]+1][$maps[1]+1][2], $Items[$maps[0]+1][$maps[1]+1], $UsedBombs1[100][1], $UsedBombs2[100][1]
GUICtrlSetData($labellives1, $player1info[2])
GUICtrlSetData($labellives2, $player2info[2])
GUICtrlSetBkColor($labellives1, 0xffffff)
GUICtrlSetBkColor($labellives2, 0xffffff)
Case $iMsgBoxAnswer = 7 ;No
Exit
EndSelect
EndFunc

Func ItemRandom()
$r=Random(0, 5, 1)
If $r>4 Then $r=0
Return $r
EndFunc

Func ItemPickUp($p, $i)
;$playerinfo - 0 - zasięg 1-ilośc bomb 2-ilosć żyć, 3-prędkość
If $p=1 Then
Switch $i
Case 1
$Player1info[3]+=1
Case 2
If $Player1info[1]+1<100 Then $Player1info[1]+=1
Case 3
$Player1info[0]+=1
Case 4
$Player1info[2]+=0.4
GUICtrlSetData($labellives1, $player1info[2])
EndSwitch
ElseIf $p=2 Then
Switch $i
Case 1
$Player2info[3]+=1
Case 2
If $Player2info[1]+1<100 Then $Player2info[1]+=1
Case 3
$Player2info[0]+=1
Case 4
$Player2info[2]+=0.4
GUICtrlSetData($labellives2 , $player2info[2])
EndSwitch
EndIf
Return 1
EndFunc

 

Paczka: https://skydrive.liv...AGw9o_ilaxKxOTU

EDIT:

 

@ jackraymund: zaraz wrzucę

 

screen.jpg?psid=1

Sorry za koszmarną grafikę postaci, ale nie mam pomysłu jak by mogli wyglądać. Obok jest jeszcze jedno okienko, w którym jest napisana ilość życia obu graczy. Nie uchwyciłem na screenie bomby i wybuchu, ale myślę, że screen oddaje ogólny obraz gry.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

Hah, poprawiłeś mi humor ;)

Ktoś z moich poradników skorzystał i napisał w irrlichcie w autoit grę ... no mój życiowy sukces :D

 

Gra super , chociaż ma kilka błędów (kolizje, + po ustaleniu rozmiaru mapy ale jeszcze przed jej rozrysowaniem dodaj do wysokosci z 50px dla okna i tam umiesc paski zycia bohaterow, najlepiej graficznie )

Brawo ! :)

Opublikowano
pierdolisz, zajebista grafika, ciekawe jak sie sprawdza, potem obczaje bo czasu niemam

Mówię o grafice postaci, tym ludziku.

Szkoda, że ikonki nie ma, mógłbyś dorobić.

No, zapomniałem, jak wymyślę to zrobię.

Z tym czasem uśpienia to fatalny pomysł. Powinieneś zrobić pętlę gry, która samodzielnie koryguje ilość fps.

Ten sposób z linku nie do końca rozumiem, ale wydaje mi się, że dodatkowe obciążenie dla procesora. Można by zrobić pierwsze 50 klatek sprawdzanie, czy procesor jest odpowiednio szybki, a potem jeśli tak to za pomocą AdlibRegister. Gorzej, jak ktoś w połowie gry uruchomi wymagającą aplikację to funkcja nie kończąc się, zacznie się od nowa i po pierwsze przestanie się wyświetlać, a po drugie po jakimś czasie AutoIt dupnie.

Co do grafiki to część jest chyba z jakiegoś flashowego bombermana.

W sumie racja, przedmioty(i sam pomysł na grę) wziąłem stąd: http://www.wyspagier...-z-ogniem-2.htm

A teksturki trawy i przeszkód zwinąłem bratu z jakiegoś teksturepack'a do minecraft'a.

Bombę, postać i życie robiłem sam.

Ktoś z moich poradników skorzystał i napisał w irrlichcie w autoit grę ... no mój życiowy sukces

Jak byś jeszcze napisał jak zapisać stan planszy i w kolejnej klatce wczytać go ponownie(tu jak widzisz dla każdej klatki plansza, bomby, wybuchy itp jest rysowana od nowa) to można by było zrobić kilkukrotny wzrost wydajności.

EDIT:

A w kolizjach nie wiem, co Ci się nie podoba. Wyszły mi dokładnie takie, jak zaplanowałem.

EDIT2:

Przeskalowałem jeszcze raz teksturki z 64x64 na 32x32 i wygląda jeszcze lepiej oraz dodałem ikonę Wszystko jest w paczce, ale nie za bardzo wiem, jak tą ikonę ustawić do okna irrlight. Zaraz spróbuję jeszcze dodać te info o życiu w irrlight.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

najlepiej plansze zapisac wg id klockow.

rozmiar mapy dla tego przykladu to 5x5. czyli jest to tablica map[5][5]

Zapisujesz w pliku w takiej postaci:

5 5

1 0 0 0 1

2 1 3 3 1

0 0 0 0 0

1 1 2 1 1

1 2 1 2 1

 

Gdzie pierwsze 2 parametry to rozmiar mapy (szerokosc i wysokosc), a kolejne to czytane wierszami ID klocka jakie ma wstawic komputer.

Dla 0 to woda,1-trawa,2-ziemia,3-drewno czy cos w tym guscie jak tam zrobisz.

Robisz plik graficzny od tekstur w ktorym w jednej linni powklejasz zeskalowane już obrazki o rozmiarach kazdy 50x50. Maja byc w jednej linni. Kolejno wg ID.Czyli pierwszy dla id =0 bedzie obrazek wody, kolejny to trawa itd.

Rysowanie:

for $x=0 to 5
for $y=0 to 5

_IrrDraw2DImageElement( tekstura, x*50 ,y*50, map[x][y],0,szerokosc,wysokosc, kanalalfa)  //gdzie map[x][y] to nasza mapa zapisana do pliku . to zaraz.
next
next

 

Mapę wczytujesz po jednym znaku i kazde id przypisujesz do $map[odpowiednix][odpowiedniy]

 

Teraz pozwol ze napisze to w autoit bo takie rzeczy to najlepiej w c++ a w autoit nie ma tak latwo z bialymi znakami wiec musze chwile pokombinowac.

Ogarniasz troche ? :)

Opublikowano

Ogarniam wszystko, ale nie o to mi chodzi, to nie przyspieszy odświeżania, tu jest powtarzane _IrrDraw2DImageElement tyle razy ile jest pól, a mi chodzi o to, żeby było używane tylko jeden raz. Czyli jak wczytasz tą mapę w ten sposób, to żeby najlepiej taką całą grafikę poskładaną z tekstur zapisać do zmiennej. Albo żeby _IrrBeginScene automatycznie wczytywało też mapę.

A tekst czym najlepiej? Bo znalazłem _IrrAddBillboardTextSceneNode, ale to jest do 3D... Nie chcę osobno rysować wszystkich liter.

EDIT: Przecież ja właśnie tak robię nawet... $Terrain przechowuje ID klocków w tablicy... Początkowo nawet przechowywała zmienną zwracaną przez _irrgettexture, ale zrezygnowałem z tego sposobu, bo to, bo jest teraz jest prostsze do ogarnięcia.

BTW: _IrrDraw2DImageElement( tekstura, x*50 ,y*50, map[x][y] - widzę, że tu nowy argument... Ale nie za bardzo wiem, jak on ma działać.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

Wiem na pewno,że było coś od tekstu 2D i tyle mogę Ci powiedzieć ,bo od tamtej pory nic nie pisałem w irrlichcie.W dokumentacji znajdziesz na pewno w zakladce pewnie dla 2D.

Co do odswiezania, w petli musisz odswiezac ciagle obraz postaci(bo zmieniaja pozycje), bomb,wybuchow, klockow rozwalajacych sie. To co jest stałe mozesz wyrysować przed petla .

Opublikowano

No właśnie... Przed pętlą... Ale IrrBeginScene wszystko skasuje... Da się jakoś inaczej zacząć nową klatkę? Coś jak GetScene żeby zapisać ją do zmiennej, a potem UseScene żeby ją wczytać?

Nic tam nie ma do tekstu w includzie au3irr2_2D

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

Hmm... nie działa... Wydaje mi się, że to też potrzebuje kamery... :/

Ale na to jednorazowe tworzenie mapy chyba znalazłem sposób :D Niestety wiąże się z przepisywaniem większości kodu. Ale efektem będzie fps bliski 200 na przeciętnym komputerze zamiast 100 na najszybszym.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

Rozpracowałem ustalanie liczby fps. Ale za to z poprawy wydajności nici.

O ile coś takiego działa tak jak chcę, czyli zostawia poprzedni rysunek i po sekundzie oprócz niego dorysowuje drugi:

_IrrDraw2DImageElement( $PicPlayer2, 50 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
_IrrDrawScene()
_IrrDraw2DImageElement( $PicPlayer2, 100 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
Sleep(1000)
_IrrDrawScene()
_IrrEndScene()

To takie coś niestety nie tworzy kolejnych ludzików co 200ms... Pojawia się pierwszy, a potem cała reszta razem zamiast po kolei.

 

_IrrDraw2DImageElement( $PicPlayer2, 50 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
_IrrDrawScene()
_IrrDraw2DImageElement( $PicPlayer2, 100 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
Sleep(200)
_IrrDrawScene()
_IrrDraw2DImageElement( $PicPlayer2, 150 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
Sleep(200)
_IrrDrawScene()
_IrrDraw2DImageElement( $PicPlayer2, 200 ,50, 0,0,$visual,$visual, $IRR_use_ALPHA )
Sleep(200)
_IrrDrawScene()

Law of Revelation: The hidden flaw never remains hidden.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...