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

Au3Irrlicht2- coś a`la mario.


Rekomendowane odpowiedzi

Opublikowano

Siemaneczko!

Korzystając z tutoriala dot. Au3Irrlicht2 przerobiłem trochę gotowy kod.

I mam prośbę, do kogoś, kto zna się na tym: Czy byłby w stanie powiedzieć mi/dodać mi do programu funkcję dotyczącą "stania na elemencie"

Tzn. ta mini-gra ma przypominać mario. Typowa platformówka 2D. Ale niestety kminie od 2 godzin i nie mogę rozkminić, jak funkcję kolizji z tutorialu przerobić tak, aby postać zamiast omijać ten element stawała na nim. Rozumiecie?

I jeszcze jedno- zrobiłem coś w rodzaju grawitacji- tak więc teraz postać zawsze wraca do poziomu y=500. Czy to przypadkiem nie będzie kolidować z staniem na elementach?

Dodatkowo skok zrobiłem za pomocą _IfPressed. I teraz mam problem, bo jak naciskam klawisz skoku (lewy ctrl) to postać zamiast mi elegancko skacze, ale jeśli przytrzymam ten klawisz, zaczyna ona po prostu lecieć.

 

KOD:

 

 

 

#include "au3Irrlicht2.au3"
#include "misc.au3"
;zmienne
$screen_width = 800
$screen_height = 650
_IrrStart()
_IrrSetWindowCaption( "Jakistytul" )
$mob=_irrgettexture("mob.bmp")
$postac=_IrrGetTexture("postac.bmp")
$kladka=_IrrGetTexture("kladka.bmp")
$przeszkoda=_IrrGetTexture("przeszkoda.bmp");
_IrrColorKeyTexture($postac, 255,255,255 )
$x=50
$y=500
$xmob=200
$ymob=100
;pętla
WHILE _IrrRunning()
_IrrBeginScene( 150,0,0)
_IrrDraw2DImageElement( $postac, $x ,$y, 0,0,50,50, $IRR_use_ALPHA )
_IrrDraw2DImageElement( $mob, $xmob, $ymob,0,0,50,50, $IRR_USE_ALPHA )
_IrrDraw2DImageElement( $kladka, 0, 540,0,0,800,5, $IRR_IGNORE_ALPHA )
_IrrDraw2DImageElement( $przeszkoda,200,200,0,0,100,100, $IRR_IGNORE_ALPHA ) ; to nasz przedmiot z którym kolidujem
_Irrendscene()
sterowanie()
grawitacja()
mobek()
kolizja($x,$y,50,50,200,200,100,100,0)
Sleep(1)
WEnd
;funkcje
func sterowanie()
if _IsPressed("27")=1 Then $x+=3
if _IsPressed("25")=1 Then $x-=3
if _isPressed("A2")=1 Then $y-=30
EndFunc

func kolizja($bohater_x,$bohater_y,$szer_bohater,$wys_bohater,$przeszkoda_x,$przeszkoda_y,$szer_przeszkoda,$wys_przeszkoda,$id=0)
if ($bohater_x + $szer_bohater > $przeszkoda_x) And ($bohater_y + $wys_bohater > $przeszkoda_y) And ($bohater_x < $przeszkoda_x + $szer_przeszkoda) And ($bohater_y < $przeszkoda_y + $wys_przeszkoda) Then
if $id=0 then
if $bohater_x>$przeszkoda_x then $x+=3
if $bohater_x<$przeszkoda_x then $x-=3
if $bohater_y>$przeszkoda_y then $y+=3
if $bohater_y<$przeszkoda_y then $y-=3
EndIf
endif
endfunc
func grawitacja()
if $y < 500 then $y+=10
EndFunc
func mobek()
if $xmob<$x then $xmob+=1
if $ymob<$y then $ymob+=1
if $ymob>$y then $ymob-=1
if $xmob>$x then $xmob-=1
EndFunc

 

 

Opublikowano

Zrób podczas grawitacji sprawdzanie kolizji z tym obiektem na który chcesz wskoczyć. Dla skoku wyznacz jakąś max wartość jaką możesz się odbić w górę i po jej osiągnięciu zablokuj dalszy skok.

Opublikowano

Po prostu odległość "odbicia" w kolizji jest za mała w stosunku do grawitacji ,przez co element "przecieka" przez obiekt. Proszę tu kolizja bez ześlizgiwania się (wyrzuciłem zmiane pozycji x z kolizji jak widac) i bez przeciekania:

 

 


func kolizja($bohater_x,$bohater_y,$szer_bohater,$wys_bohater,$przeszkoda_x,$przeszkoda_y,$szer_przeszkoda,$wys_przeszkoda,$id=0)
if ($bohater_x + $szer_bohater > $przeszkoda_x) And ($bohater_y + $wys_bohater > $przeszkoda_y) And ($bohater_x < $przeszkoda_x + $szer_przeszkoda) And ($bohater_y < $przeszkoda_y + $wys_przeszkoda) Then
if $id=0 then
if $bohater_y>$przeszkoda_y then $y+=10
if $bohater_y<$przeszkoda_y then $y-=10
EndIf
endif
endfunc

 

Opublikowano

Co do skoku:

Jeśli walne ograniczenie do max 470 (zaczynamy na 500, więc jest to 30 px) to postać nigdy nie wskoczy wyżej. Czyli lipa. Zastanawia mnie jedna rzecz:

Czy nie da się napisać funkcji, która następowałaby po naciśnięciu ctrl i ta oto funkcja podbijała by postać o 30 px, a potem zablokować jakoś, żeby można było wykonać tą funkcję dopiero wtedy, kiedy postać przestanie się ruszać. Jeśli to niemożliwe, to walnę tę funkcję i dam jej na końcu sleepa 3000 i tyle.

Oczywiście o ile sama funkcja nie sprawi mi problemu, o tyle przy samej jej blokadzie, dopóki postać się porusza potrzebuje pomocy.

PS: Polecam kisiel FRUGO, zajebisty!

Opublikowano

Walnij ograniczenie na 0 zeby nigdy nie wyskoczyl powyzej mapy nie na 470...:)

Tak jest to możliwe. Wystarczy pomyslec.

Niech Ctrl uruchamia funkcje "skok". W tej funkcji musisz napisać warunki:

1. Jeżeli $y=500 and $blokada=0 then wykonaj skok i zmien wartosc $blokada na 1

2.Po wykonaniu skoku zmien $blokada spowrotem na 0.

 

Wydaje mi się ,że tak powinno działać

Opublikowano

Ja już na dziś nie mam siły, a na 80% jutro nie wejdę, tak więc mam do was prośbę- poprawicie mi to skakanie? Tak, żeby to było płynnie, no i żeby działało to z blokadą

Down: http://speedy.sh/gCtSE/poradnikirr2d.rar

Nie wiem co jest źle.

Ustawiłem, żeby odejmował 1 od blokady, kiedy postać jest na poziomie 500, i chyba po prostu ten idiota cały czas odejmuje i po np. 20 sekundach $blokada już wynosi np. -400.

PS: wybaczcie mi podstawowe błędy, jestem wykończony w tym tygodniu

PS2: mam nadzieję, że to co wrzuciłem chociaż działa.

Opublikowano
i chyba po prostu ten idiota

jeśli masz na myśli komputer, to musisz być bardzo inteligentny

 

cały czas odejmuje i po np. 20 sekundach $blokada już wynosi np. -400.

 

I pewnie masz racje. Prawdopodobnie cały czas odejmuje, bo tak go zaprogramowałeś

Opublikowano

 

 


#include "au3Irrlicht2.au3"
#include "misc.au3"
;zmienne
$screen_width = 800
$screen_height = 650
_IrrStart()
_IrrSetWindowCaption( "Jakistytul" )
$mob=_irrgettexture("mob.bmp")
$postac=_IrrGetTexture("postac.bmp")
$kladka=_IrrGetTexture("kladka.bmp")
$przeszkoda=_IrrGetTexture("przeszkoda.bmp");
_IrrColorKeyTexture($postac, 255,255,255 )
$x=50
$y=500
$xmob=200
$ymob=100
$blokada=0
;pętla
WHILE _IrrRunning()
_IrrBeginScene( 150,0,0)
_IrrDraw2DImageElement( $postac, $x ,$y, 0,0,50,50, $IRR_use_ALPHA )
_IrrDraw2DImageElement( $mob, $xmob, $ymob,0,0,50,50, $IRR_USE_ALPHA )
_IrrDraw2DImageElement( $kladka, 0, 540,0,0,800,5, $IRR_IGNORE_ALPHA )
_IrrDraw2DImageElement( $przeszkoda,200,200,0,0,100,100, $IRR_IGNORE_ALPHA ) ; to nasz przedmiot z którym kolidujem

_Irrendscene()
sterowanie()
grawitacja()
mobek()
kolizja($x,$y,50,50,200,200,100,100,0)
Sleep(1)
WEnd
;funkcje
func sterowanie()
if _IsPressed("27")=1 Then $x+=3
if _IsPressed("25")=1 Then $x-=3
if _isPressed("A2")=1 Then skok()

EndFunc

func kolizja($bohater_x,$bohater_y,$szer_bohater,$wys_bohater,$przeszkoda_x,$przeszkoda_y,$szer_przeszkoda,$wys_przeszkoda,$id=0)
if ($bohater_x + $szer_bohater > $przeszkoda_x) And ($bohater_y + $wys_bohater > $przeszkoda_y) And ($bohater_x < $przeszkoda_x + $szer_przeszkoda) And ($bohater_y < $przeszkoda_y + $wys_przeszkoda) Then
if $id=0 then
if $bohater_y>$przeszkoda_y then $y+=10
if $bohater_y<$przeszkoda_y then $y-=10

EndIf
endif
endfunc


func grawitacja()
if $y <500 then $y+=10
EndFunc



func mobek()
if $xmob<$x then $xmob+=1
if $ymob<$y then $ymob+=1
if $ymob>$y then $ymob-=1
if $xmob>$x then $xmob-=1
EndFunc



func skok()

ConsoleWrite(@CRLF&$y)
if $blokada=0 then
$blokada=1
$y-=100
AdlibRegister("odblok",100)
EndIf

EndFunc

func odblok()
$blokada=0
EndFunc



 

 

Czy to takie trudne?

Czas adlibregistera , zmienne jak wysoko ma odbic sie postac i grawitacji musisz dojsc "eksperymentalnie"

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...