Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/
PowrótPowrótHistoria odwiedzonych stron
AutorWiadomość
Data: 2010-06-03 14:03:47

wojownik266
[Allegro] kosmiczna strzelanka

Mam już napisany kawałek gry, która zachowuje się tak jak sobie to zaplanowałem. statki(wrogowie) poruszają się z góry na dół a statek (bohater) porusza się w pozimie z lewej do prawej i na odwrót oddając przy tym strzały (po nacisnieciu spacji), i wszystko niby jest okey poza takim mankamentem że po zajsciu kolizji pocisku z wrogim statkiem następuje kolizja która  się nie kończy bo kiedy statek wroga znajduje się jeszcze u góry ekranu a statek bohater na lini jego lotu (toru lotu), następuje znowu  kolizja... Co zrobić aby kolizja następowała tylko po oddaniu strzału i trafieniu pociskiem  wrogiego statku? Ani wcześniej ani później? Poniżej kod programu a tutaj link do kodu źródłowego (załącznika) i grafik: http://www.easykoder.vot.pl/forum/showthread.php?tid=152
Prawie na samym dole:"kosmiczna strzelanka".

#include <allegro.h>
#include <vector>

using std::vector;

BITMAP* bufor=NULL;
BITMAP* niebo = NULL;
BITMAP* niebo1 = NULL;
BITMAP* statek = NULL;
BITMAP* pocisk = NULL;
SAMPLE* laser = NULL;
MIDI* muzyczka;

volatile long int speed=0;
volatile long int k = 0;

void increment_speed()
{
  speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_VARIABLE(k);

class Bohater
{
  public:
  int poz_x,poz_y;
  short int x,y;
  short int s,w;
  vector<BITMAP*>spodki;
  Bohater();
  ~Bohater();
};

Bohater::Bohater()
{
  spodki.reserve(10);
}

Bohater::~Bohater()
{
}

bool kolizja(float x1,float y1,float s1,float w1,float x2,float y2,float s2,float w2)
{
  if(x1+s1>=x2 && x1<=x2+s2 && y1+w1>=y2 && y1<=y2+w2) return(true);
  return(false);
};

int main()
{
  allegro_init();
  install_keyboard();
  install_timer();
  set_color_depth(16);
  set_gfx_mode(GFX_AUTODETECT,640,480,0,0);
  install_int_ex(increment_speed,BPS_TO_TIMER(80));
  detect_digi_driver(DIGI_AUTODETECT);
  detect_midi_driver(MIDI_AUTODETECT);
  install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT, NULL);

  Bohater boh,wrog[10],pocisk0[10];// Obiekty klasy Bohater
  //Wczytywanie grafik i dzwięków
  muzyczka = load_midi ("muzyczka.mid");
  laser = load_sample("laser.wav");
  bufor=create_bitmap(640,480);
  niebo=load_bmp("glob.bmp", default_palette);
  niebo1=load_bmp("glob.bmp", default_palette);
  statek =load_bmp ("statek.bmp",NULL);
  pocisk =load_bmp ("pocisk.bmp", NULL);
  for (int i=0;i<10;++i)
  boh.spodki[i]=load_bmp("spodek.bmp", NULL);


  boh.x=320, boh.y=420;
  int pociskx=320, pocisky=420;// Poruszanie pociskiem
  int pozsx=320,pozsy=420;// Zmienne do statek

  for ( int i=0;i<10;++i)
  {
    wrog[i].x=40;
    wrog[i].y=40;
    wrog[i].s=40;
    wrog[i].w=40;
  }


  pocisk0[0].x=320, pocisk0[0].y=420,pocisk0[0].w=40, pocisk0[0].s=40;
  //Zmienne potrzebne do scrollowania tła
  int niebo_x = 0, niebo_y = 0;
  int niebo1_x = 0, niebo1_y = 0;
  int niebo2_x = 0, niebo2_y = 0;
  int mapa_y=0, ekran_y=480;
  int obraz_y=ekran_y;

  play_midi( muzyczka, 1);
  while (!key[KEY_ESC])
  {
    clear_to_color(bufor,makecol(0,0,0));
    niebo_y = -mapa_y%ekran_y;
    niebo1_y = ekran_y-mapa_y%ekran_y;
    mapa_y++;
    blit( niebo, bufor, 0,0, niebo_x, niebo_y, niebo->w, niebo->h);
    blit( niebo1, bufor, 0,0, niebo1_x, niebo1_y, niebo1->w, niebo1->h);

    while (speed>0)
    {
      if (key[KEY_LEFT]){pozsx-=2;pocisk0[0].x-=2; }
      if (key[KEY_RIGHT]){pozsx+=2;pocisk0[0].x+=2;}
      if (key[KEY_SPACE])
      {


        /*Przemieszczanie pocisku*/
        for (int i=0;i<=10;++i)
        {
          if (pocisk0[i].y<480)
          {
            pocisk0[i].y-=15;
          }
          if (pocisk0[i].y<=0)
          {
            pocisk0[i].y=420;
            //pocx=320;
          }
          pocisk0[i].y--;
        }

        create_bitmap(pocisk->w,pocisk->h);/* kopiowanie pocisku do bufora*/
        masked_blit(pocisk,bufor,0,0,pocisk0[0].x,pocisk0[0].y,pocisk0[0].s,pocisk0[0].w);
      }
      speed--;

    }
    /*Scrollowanie statków, wrogów*/
    for (int i=0;i<10;++i)
    {
      if (wrog[i].y<480)
      {
        wrog[i].y+=2;

      }
      else if (wrog[i].y>=480)
      {
        wrog[i].x=20;
        wrog[i].y=20;
      }
    }
    k++;
    if(k == 256)
    k = 0;

    // rect(bufor,0,0,bufor->w - 1,bufor->h - 1,makecol(255,255,255));

    // rotate_sprite(bufor,boh.spodki[0], wrog.x-80 , wrog.y+40 ,itofix(k));

    masked_blit(boh.spodki[0],bufor,0,0,wrog[0].x=200,wrog[0].y+40,wrog[0].s,wrog[0].w);
    masked_blit(boh.spodki[1],bufor,0,0,wrog[1].x=280,wrog[1].y+120,wrog[1].s,wrog[1].w);
    masked_blit(boh.spodki[2],bufor,0,0,wrog[2].x=360,wrog[2].y+40,wrog[2].s,wrog[2].w);
    masked_blit(statek,bufor,0,0,pozsx,pozsy,statek->w,statek->h);

    if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[0].x,wrog[0].y,wrog[0].s, wrog[0].w)==true)
    {
      textprintf_ex(bufor, font, 0, 460, makecol(255, 255, 0), -1, "Kolizja 0");
      play_sample(laser,2000,1000,255,0);

    }
    if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[1].x,wrog[1].y,wrog[1].s, wrog[1].w)==true)
    {
      textprintf_ex(bufor, font, 0, 460, makecol(155, 155, 0), -1, "Kolizja 1");
      play_sample(laser,2000,1000,255,0);
    }
    if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[2].x,wrog[2].y,wrog[2].s, wrog[2].w)==true)
    {
      textprintf_ex(bufor, font, 0, 460, makecol(255,255,255), -1, "Kolizja 2");
      play_sample(laser,2000,1000,255,0);
    }

    blit(bufor, screen,0,0,0,0,640,480);
  }
  for (int i=0;i<10;++i)
  destroy_bitmap(boh.spodki[i]);
  destroy_bitmap(bufor);
  destroy_bitmap(niebo);
  destroy_bitmap(pocisk);
  destroy_sample(laser);
  allegro_exit();
  return 0;
}
END_OF_MAIN();
Data: 2010-06-11 09:00:27

lemis.aryl


Statki wroga tak zasuwają, że ich prawie nie widać.

1



Statystyki tematuOstatnio przeczytali
Czytało użytkowników:30maciejo, Iromix, shutdown, adwi32, madmike44, dmx81, Czarnt, pixelmaster, filipesq, szyx_yankez, Dragonit, michalp, Piotr Szawdyński, SeaMonster131, lenrokskate, TheLukon, Patzick, malan, Iname (√ιק), lemis.aryl
Przeczytało użytkowników:20
Czytało osób ogólnie:71
Przeczytało osób ogólnie:44



PowrótPowrótHistoria odwiedzonych stron
Panel Logowania
Login:
Hasło:

Użytkowników
Obecnie aktywnych:11
Zalogowanych:2
Zarejestrowanych:4367
Ostatnie 24h:531
Non-cookie 24h:2665
Wszystkich:214127
Ostatnia Aktualizacja
2010-09-01 19:27:34 (4 dni temu)
Ostatnio aktywni
Mateusz1244 min
SeaMonster1319 min
Gronek862421 min
wiew68 min
Koni79 min
fish131 godz
wiewiorka2 godz
lenrokskate9 godz
dmx8111 godz
steckel12 godz
pixelmaster15 godz
maciejo15 godz

Wynajem Sopot - wakacje
Pokój 2 osobowy 130zł/doba;
Lokalizacja: Sopot


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinki
Kurs HTML - strona WWW za darmoRestauracja "ATOL" - SopotValid HTML 4.01 TransitionalValid CSS!HTML CSS JavaScript FLASH PHP MySQL