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

[Problem] Usuwanie przedmiotu podczas kolizji.


Rekomendowane odpowiedzi

Opublikowano

Witam, na wstępie dodam, że to dotyczy Irrlicht'a. 1. Robię gierkę i podczas kolizji pocisku i statku znika pocisk, a od HP odejmuje losową wartość w przedziale x-y.i właśnie jak usunąć ten pocisk? 2. Tworzenie trajektorii lotu. Jak mam zrobić tak, aby pocisk nie podążał za statkiem, tylko leciał do wody.

Jakoś tu pusto...

Opublikowano

2d?

1. no to kolizja kwadrat kwadrat, chodź z tego co kojarze irricht wspiera kolizje, poprzez tekstury.(getcollision czy jakoś tak, odpal f1)

prosta kolizja aka sopelek(funkcja iscollision)

 

#include <GUIConstantsEx.au3>

#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <misc.au3>
$Form1 = GUICreate("Form1", 382, 228, 192, 124)
$y1 = 24
$x1 =24
$y2 =80
$x2 =64
$wys = 36
$szer = 17
$xs = 0
$ys = 0
$Label1 = GUICtrlCreateLabel("kamera", $x1,$y1,$wys,$szer)
GUICtrlSetBkColor(-1, 0xFF0000)
$Label2 = GUICtrlCreateLabel("mob", $x2,$y2,$wys,$szer)
GUICtrlSetBkColor(-1, 0x00FF00)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
AdlibRegister("move", 10)
func move()
if _IsPressed("25") then left()
if _IsPressed("26") then up()
if _IsPressed("27") then right()
if _IsPressed("28") then down()
if GetCollision($x1+$xs, $x1+$wys+$xs,$y1,$y1+$szer,$x2,$x2+$wys,$y2,$y2+$szer) then $xs = 0
if GetCollision($x1,$x1+$wys,$y1+$ys,$y1+$szer+$ys,$x2,$x2+$wys,$y2,$y2+$szer) then $ys = 0
$x1 += $xs
$y1 += $ys
GUICtrlSetPos($Label1, $x1, $y1)
$ys = 0
$xs = 0
EndFunc
func left()
$xs = -1
EndFunc
func right()
$xs = 1
EndFunc
func up()
$ys = -1
EndFunc
func down()
$ys = 1
EndFunc
func GetCollision($1X1, $1X2, $1Y1, $1Y2, $2X1, $2X2, $2Y1, $2Y2)
if (($1X2 > $2X1) and ($1Y2>$2Y1) and ($1X1<$2X2) and ($1Y1<$2Y2)) then
return true
Else
return False
endif
endfunc
func mob()
if($x1 < $x2) Then
$xz = 1
if GetCollision($x1, $x1+$wys+3,$y1,$y1+$szer,$x2,$x2+$wys,$y2,$y2+$szer) then $xz = 0
$x2 -= $xz
guictrlsetpos($Label2,$x2,$y2)
EndIf
if($x1 > $x2) Then
$xz = 1
if GetCollision($x1, $x1+$wys,$y1,$y1+$szer,$x2,$x2+$wys+3,$y2,$y2+$szer) then $xz = 0
$x2 += $xz
guictrlsetpos($Label2,$x2,$y2)
EndIf
if($y1 < $y2) Then
$yz = 1
if GetCollision($x1, $x1+$wys,$y1,$y1+$szer+3,$x2,$x2+$wys,$y2,$y2+$szer) then $yz = 0
$y2 -= $yz
guictrlsetpos($Label2,$x2,$y2)
EndIf
if($y1 > $y2) Then
$yz = 1
if GetCollision($x1, $x1+$wys,$y1,$y1+$szer,$x2,$x2+$wys,$y2,$y2+$szer+3) then $yz = 0
$y2 += $yz
guictrlsetpos($Label2,$x2,$y2)
EndIf
EndFunc
AdlibRegister("mob", 50)
Do
until guigetmsg() = -3

 

 

kolizja na koło-kwadrat

 

bool IsCollision(float xk,float yk,float rk,float xkw,float ykw,float wkw)

{
float x0 = xk;
float y0 = yk;
float x1 = xkw;
float y1 = ykw;
float x2 = xkw + wkw;
float y2 = ykw;
float n = fabs(( x2 - x1 ) *( y1 - y0 ) -( x1 - x0 ) *( y2 - y1 ) );
float d = sqrt(( x2 - x1 ) *( x2 - x1 ) +( y2 - y1 ) *( y2 - y1 ) );
float dist = n / d;
if( dist > rk ) return false;
float d1 = sqrt(( x0 - x1 ) *( x0 - x1 ) +( y0 - y1 ) *( y0 - y1 ) );
if(( d1 - rk ) > d ) return false;
float d2 = sqrt(( x0 - x2 ) *( x0 - x2 ) +( y0 - y2 ) *( y0 - y2 ) );
if(( d2 - rk ) > d ) return false;
return true;

}

 

2.

90 do 150 masz funkcje, w tym przypadku droga pilki, po kliknięciu myszką

 

#include "funkcje.hpp"
//#include <Winhttp.h>
#define PI 3.14159265
using namespace std;
int main()
{
int i;
int iloscrzad = 2;
char a;
for(a = 'A';a <='H';0)
{
for (int z = 0; z < iloscrzad;z++)
{
if(a <= 'H')
{
cout<<a<<"\t";
a++;
}
}
cout<<endl;
if(a == 'I')
{
cout << "ziaaa ile w rzedzie?" <<endl;
cin >> iloscrzad;
a = 'A';
}
}
setup();
ALLEGRO_EVENT events;
event_quene = al_create_event_queue();
al_register_event_source(event_quene,al_get_display_event_source(display));
al_register_event_source(event_quene,al_get_mouse_event_source());
bool newgame = true;
while(newgame)
{
ALLEGRO_EVENT events;
al_get_next_event(event_quene, &events);
if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
return 0;
if(events.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
{
if(events.mouse.button &1)
{
if(events.mouse.x >= 200 && events.mouse.x <= 300 && events.mouse.y >= 200 && events.mouse.y <= 220)
{
newgame = false;
}
}
}
al_draw_rectangle(200, 200, 300, 220,al_map_rgb(0, 0, 0), 1.0);
drawtekst(203,200,"New Game");
al_draw_rectangle(200, 225, 300, 245,al_map_rgb(0, 0, 0), 1.0);
drawtekst(201,225,"Load Game");
al_flip_display();
}
ALLEGRO_BITMAP *player1 = al_load_bitmap("cannon.bmp");
cannon = al_clone_bitmap(player1);
al_destroy_bitmap(player1);
ALLEGRO_BITMAP *player2 = al_load_bitmap("wood.bmp");
ALLEGRO_BITMAP *banana = al_clone_bitmap(player2);
al_destroy_bitmap(player2);
ALLEGRO_BITMAP *player3 = al_load_bitmap("puff.bmp");
ALLEGRO_BITMAP *bum = al_clone_bitmap(player3);
al_destroy_bitmap(player3);
float strzaltimer = 300.0,colldown = 1.0;
ALLEGRO_TIMER *timer = al_create_timer(1.0/40.0);
ALLEGRO_TIMER *timerstrzal = al_create_timer(1.0/strzaltimer);
ALLEGRO_TIMER *timercolldown = al_create_timer(1.0/colldown);
al_register_event_source(event_quene,al_get_timer_event_source(timer));
al_register_event_source(event_quene,al_get_timer_event_source(timerstrzal));
al_register_event_source(event_quene,al_get_timer_event_source(timercolldown));
al_start_timer(timer);
al_start_timer(timerstrzal);
al_start_timer(timercolldown);
int punkty = 0;
char const *tekst;
float pozycjax=100,pozycjaz=100,speed = 7, random, cannony = 100,poczatekx,poczateky;
bool done = false,chodzenie = false,chodzenieg = false,chodzenieb = false;
double result,resultx,resulty;
vector < strzala > pocisk;
while(!done)
{
al_get_next_event(event_quene, &events);
if(events.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
return 0;
if(events.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
{
if(events.mouse.button &1)
{
chodzenie = true;
chodzenieg = true;
chodzenieb = true;
chodzeniex = events.mouse.x;
chodzeniez = events.mouse.y;
poczatekx = chodzeniex;
poczateky = chodzeniez;
result = atan2 (poczateky-pozycjaz,poczatekx-pozycjax)* 180 / PI;
resultx = sin (result*PI/180);
resulty = cos (result*PI/180);
}
if(events.mouse.button &2)
pocisk.push_back(strzala(400, 100,0,false));
}
if ((int)al_get_timer_count(timercolldown) >= 1)
{
random = rand() % 100 + (pozycjaz-70);
if (random <= 0)
{
random +=10;
}
cannony = random;
pocisk.push_back(strzala(400, random,0,false));
al_set_timer_count(timercolldown,(int64_t)0);
}
if ((int)al_get_timer_count(timer) >= 1)
{
al_set_timer_count(timer,(int64_t)0);
if (chodzenie)
{
if(chodzenieg)
{
if(pozycjaz < chodzeniez || pozycjaz > chodzeniez)
pozycjaz += resultx*speed;
}
if(chodzenieb)
{
if(chodzeniex > pozycjax || chodzeniex < pozycjax)
pozycjax += resulty*speed;
}
if(abs(pozycjax-chodzeniex)<=speed)
{
pozycjax = chodzeniex;
chodzenieb = false;
}
if(abs(pozycjaz-chodzeniez)<=speed)
{
pozycjaz = chodzeniez;
chodzenieg = false;
}
if(abs(pozycjax-chodzeniex)<=speed && abs(pozycjaz-chodzeniez)<=speed)//abs usuwa minus
{
chodzenie = false;
}
}
}
if ((int)al_get_timer_count(timerstrzal) >= 1)
{
for( int i = 0; i < pocisk.size(); i++ )
{
if(!pocisk.ifbum)
{
pocisk.x -=2;
if (IsCollision((float)pozycjax,(float)pozycjaz,17.0,(float)pocisk.x,(float)pocisk.y-8,100.0) || pocisk.x < 0 || IsCollision((float)pozycjax,(float)pozycjaz,17.0,(float)pocisk.x,(float)pocisk.y+20,100.0))
{
if(pocisk.x < 0)
{
punkty +=1;
al_set_timer_speed(timercolldown, 1.0/sqrt(sqrt(punkty)));
}
else if(pocisk.x > 0)
{
punkty -=1;
}
std::cout << "kolizja " << pocisk.x << ":" << pocisk.y << std::endl;
pocisk.ifbum = true;
}
}
if(pocisk.ifbum)
{
pocisk.bum +=1;
if(pocisk.bum >= 200)
{
pocisk.erase( pocisk.begin() + i );
--i;
}
}
}
al_set_timer_count(timerstrzal,(int64_t)0);
}
al_draw_filled_circle(pozycjax,pozycjaz,17,al_map_rgb(0, 0, 0));
//al_draw_pixel(strzalx,strzaly,al_map_rgb(0, 0, 0));
int i = punkty;
std::string s;
std::stringstream out;
out << i;
s = out.str();
drawtekst(1,1,s.c_str());
for( int i = 0; i < pocisk.size(); i++ )
{
if(pocisk.ifbum)
al_draw_bitmap(bum,(pocisk.x)- 38,(pocisk.y)-27,0);
else if(!pocisk.ifbum)
al_draw_bitmap(banana,pocisk.x,pocisk.y,0);
}
al_draw_bitmap(cannon,400,cannony-20,0);
al_flip_display();
al_clear_to_color(al_map_rgb(255, 255, 255));
}
al_rest(1.0);
al_destroy_display(display);
return 0;
}

 

 

Opublikowano

Tak 2d, te dwa ostatnie przykłady to wyglądały na C++, ale tego to jeszcze nie ogarniam (bo piszę to w AutoIt3). Wrzucam tu kod i paczkę obrazków:

 

 

 


#include "au3Irrlicht2.au3"
#include "Misc.au3"
#include "GUIConstantsEx.au3"
#NoTrayIcon
$screen_width = 800
$screen_height = 650
HotKeySet("{ESC}", "_exit")


_IrrStart($IRR_EDT_DIRECT3D9,$screen_width,$screen_height)
_IrrSetWindowCaption("Game")
$bitmapFont = _IrrGetFont ( "./media/fonthaettenschweiler.bmp" ) ;Tekstury

$zielony = _IrrGetTexture("./assets/zielony.bmp")
_IrrColorKeyTexture($zielony, 255,255,255)

$czerwony = _IrrGetTexture("./assets/czerwony.bmp")
_IrrColorKeyTexture($czerwony, 255,255,255)

$pocisk = _IrrGetTexture("./assets/pocisk.bmp")
_IrrColorKeyTexture($pocisk,255,255,255)

$ogien = _IrrGetTexture("./assets/ogien.bmp")
_IrrColorKeyTexture($ogien,255,255,255)



$zielonyx = 350 ;Koordynaty obiektów
$zielonyy = 600

$czerwonyx=350
$czerwonyy=100

$pociskx = $czerwonyx + 16
$pocisky = $czerwonyy + 8

$aCzerwony = 100
$aZielony = 100
While _IrrRunning()
_IrrBeginScene(0,0,255)
_Irr2DFontDraw( $BitmapFont,"HP:"&$aCzerwony&"/100", 25, 25, 250, 96 ) ;HP
_Irr2DFontDraw( $BitmapFont,"HP:"&$aZielony&"/100", 25, 525, 250, 96 ) ;HP
_IrrDraw2DImageElement( $zielony, $zielonyx, $zielonyy, 0,0,85,20, $IRR_use_ALPHA) ;Statek zielony
_IrrDraw2DImageElement( $czerwony, $czerwonyx, $czerwonyy, 0,0,85,20, $IRR_use_ALPHA) ;Statek czerwony
_IrrDraw2DImageElement( $pocisk, $pociskx, $pocisky, 0,0,4,4, $IRR_use_ALPHA) ;Pociski
_IrrEndScene()
Sterowanie()
AIstatek()
AIpocisk()
Sleep(20)
WEnd

Func Sterowanie() ;Sterowanie statkiem
If _IsPressed("27")=1 Then $zielonyx+=Random(2.5,3.5)
If _IsPressed("25")=1 Then $zielonyx-=Random(2.5,3.5)
EndFunc

Func AIstatek() ;Podążanie za statkiem
If $czerwonyx<$zielonyx Then $czerwonyx+=2
If $czerwonyx>$zielonyx Then $czerwonyx-=2
EndFunc

Func AIpocisk()
	;Lot pocisków
	If $pociskx<$zielonyx + 17 Then $pociskx+=5
	If $pociskx>$zielonyx + 17 Then $pociskx-=5
	If $pocisky<$zielonyy + 12 Then $pocisky+=5
	If $pocisky>$zielonyy + 12 Then $pocisky-=5
	;Kolizja pocisków

EndFunc

Func _exit() ; wyjście
	Exit
EndFunc


 

 

assets.rar

Jakoś tu pusto...

Opublikowano

wystarczy że pododajesz dolary przed zmiennymi i pousuwasz floaty inty, boole itd.

ify są na takich samych miejscach

w c++ dlatego że nie opłaca się pisać gier w au3

okrojona wersja

  if(events.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)//funkcja wcisniecia myszki
        {
            if(events.mouse.button &1)//guziksona
            {
                chodzenie = true;
                chodzenieg = true;
                chodzenieb = true;
                chodzeniex = events.mouse.x;
                chodzeniez = events.mouse.y;
                poczatekx = chodzeniex;
                poczateky = chodzeniez;
                result = atan2 (poczateky-pozycjaz,poczatekx-pozycjax)* 180 / PI;
                resultx = sin (result*PI/180);
                resulty = cos (result*PI/180);
            }
        }
            if (chodzenie)
            {
                if(chodzenieg)
                {


                    if(pozycjaz < chodzeniez || pozycjaz > chodzeniez)
                        pozycjaz +=  resultx*speed;
                }
                if(chodzenieb)
                {
                    if(chodzeniex > pozycjax || chodzeniex < pozycjax)
                        pozycjax += resulty*speed;
                }
                if(abs(pozycjax-chodzeniex)<=speed)
                {
                    pozycjax = chodzeniex;
                    chodzenieb = false;
                }
                if(abs(pozycjaz-chodzeniez)<=speed)
                {
                    pozycjaz = chodzeniez;
                    chodzenieg = false;
                }
                if(abs(pozycjax-chodzeniex)<=speed && abs(pozycjaz-chodzeniez)<=speed)//abs usuwa minus
                {
                    chodzenie = false;
                }
            }

Opublikowano

Czyli lepiej uczyć sie cpp do gier? Mam Code::Blocks i Visual (najnowsze) i czytałem poradnik na cpp0x, ale on ma inną wersję Code::Blocks.

Jakoś tu pusto...

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...