Symulacje (Ognia, Wody, deszczu)

Vexiorus

Użytkownik
Dołączył
Kwiecień 25, 2009
Posty
51
Sprawa wyglada nastepujaco.
Jestem poczatkujacym programista, ale widzialem ze do programu mozna dodac grafike .jpeg
przykladowo mam 30 "grafik" .jpeg
10 obrazkow ognia
10 obrazkow wody
10 obrazkow deszczu

chcial bym zrobic symulator
<


przykladowo nazwijmy grafiki tak:
ogien1, ogien2, ogien3....... ogien10
woda1, woda2, woda3....... woda10
deszcz1, deszcz2, deszcz3....... deszcz10

niestety nie mialem jeszcze do czynienia z WinApi tak wiec ta czesc pomine
<


moj kod polegal na tym:
losowanie liczby miedzy 1 - 10
jezeli liczba == 1 wyswietla grafike nr1
ale grafiki tez nie umiem podpiac pod program
<

pomÓgl by mi ktos ??
daje ten kawalek kodu ktory odpowiada za losowanie liczby
<


Kod:
#include <iostream>
#include <conio.h>
#include <ctime>

using namespace std;
int random(int nMin, int nMax) { return rand() % nMax + nMin; }
int main()
{
    while (1 >= 1)
    {
 return random(1, 10);
if (random(1, 10) == 1)
{
//wyswietla ogien1
}
if (random(1, 10) == 2)
{
//wyswietla ogien2
}
if (random(1, 10) == 3)
{
//wyswietla ogien3
}
if (random(1, 10) == 4)
{
//wyswietla ogien4
}
if (random(1, 10) == 5)
{
//wyswietla ogien5
}
if (random(1, 10) == 6)
{
//wyswietla ogien6
}
if (random(1, 10) == 7)
{
//wyswietla ogien7
}
if (random(1, 10) == 8)
{
//wyswietla ogien8
}
if (random(1, 10) == 9)
{
//wyswietla ogien9
}
if (random(1, 10) == 10)
{
//wyswietla ogien10
}
    }
}

cos w tym stylu ;P czy chociaz mysle w dobrym kierunku ??
<
 

Vexiorus

Użytkownik
Dołączył
Kwiecień 25, 2009
Posty
51
Tyle to akurat wiedzialem
<

Tylko senk w tym ze otwieram nowy Projekt WinApi i ja tam nic nie widze ;P
kompletnie ciemny w ym kierunku jestem ;P
jedyne co am sie wypatrzylem to jak zmienic Tytul okienka ;P
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Alternatywami* dla WinAPI są m.in: SDL, DirectX, OpenGL, Allegro, w zależności od Twoich potrzeb praca z nimi może być prostsza niż z WinAPI.

*tzn jeśli chodzi o to, co chcesz zrobić, nie są to pełne odpowiedniki WinAPI rzecz jasna.
 

Vexiorus

Użytkownik
Dołączył
Kwiecień 25, 2009
Posty
51
Do tego dochodzi jeszcze jeden problem
<

Mianowicie taki :

Zwykła pętla która by mieściła tylko coś takiego

Kod:
while (1 >= 1)
    {
return random(1, 10);
if (random(1, 10) == 1)
{
//wyswietla ogien1
}
if (random(1, 10) == 2)
{
//wyswietla ogien2
}
if (random(1, 10) == 3)
{
//wyswietla ogien3
}
if (random(1, 10) == 4)
{
//wyswietla ogien4
}
if (random(1, 10) == 5)
{
//wyswietla ogien5
}
if (random(1, 10) == 6)
{
//wyswietla ogien6
}
if (random(1, 10) == 7)
{
//wyswietla ogien7
}
if (random(1, 10) == 8)
{
//wyswietla ogien8
}
if (random(1, 10) == 9)
{
//wyswietla ogien9
}
if (random(1, 10) == 10)
{
//wyswietla ogien10
}
}

Przeleci ponad 100 razy na sekunde, ludzkie oko nie jest tak doskonałe i niestety odbiera tylko około 24 lub 23 klatki na sekunde

Tak wiec co mozna zrobic aby ustawic ta petle tak aby przelatywala tylko 23 razy na sekunde ?? i nie wiecej ani nie mniej ?? :/
 

Vexiorus

Użytkownik
Dołączył
Kwiecień 25, 2009
Posty
51
Kod:
for (int i=1; i == 10; ++i)
{
if (random(1, 10) == i)
{
//wyswietl ogien[i]
}
}

ze skruceniem petli miales na mysli cos w tym stylu ??
<

akurat to raczej nie bedzie dzialac ale wiem ze to idzie jakos w tym kierunku
<


a propo twojej lekury ktora mi dales
<


moj angielski nie jest zly ale perfekt tez nie jest
<


doczytalem sie ze trzeba uzyc naglowka

#include <unistd.h>

ale nie rozumiem jak ma dzialac cos takiego

unsigned int sleep (unsigned int seconds)


ma to wygladac jakos tak ??

Kod:
#include <unistd.h>
#include <iostream>

using namespace std;

unsigned int sleep(unsigned int);
int a=0;
int main()
{
    while (1 >= 1)
    {
    sleep(1);
    cout << a << endl;
    ++a;
}
}

wyskakuje nastepujacy blad :
[Linker error] undefined reference to `sleep(unsigned int)'

pomugl by mi ktos rozwiazac tajemnice sleep
<
 

karololszak

Użytkownik
Dołączył
Marzec 4, 2008
Posty
130
<
C++ zaczynałem 2 lata temu, i je porzuciłem (stanąłem na tablicach - a zresztą nie ważne - to nie o tym temat
<
)... ale powiem Ci jedno - zmień
Kod:
unsigned int sleep(unsigned int);
na coś typu
Kod:
int sleep(5);
gdzie 5 to liczba sekund.
I po co robisz while (1 >= 1) ?? wtedy zawsze będzie 1 (OK), i zawsze będzie pokazywać. Równie dobrze mógłbyś to pominąć.

A co do skrócenia i pętli będzie coś w tym stylu:
Kod:
#include <unistd.h>
#include <iostream>

using namespace std;

int i = random(1, 10);

int sleep(5);

int main()
{

while(i <= 10) {
cout << a[i] << endl;
sleep;
}

}

Aha - ja mogę się mylić, dawno się z C++ nie bawiłem, zresztą zostawiłem je za sobą (chociaż na pewno do niego kiedyś wrócę
<
)
 

Vexiorus

Użytkownik
Dołączył
Kwiecień 25, 2009
Posty
51
zmieniłem tak jak poleciłes na
int sleep(5)
ale i tak mi nie działa
juz nie wiem co robie źle ;(

wpadłem więc na pomysł aby w pętli wstawic pętle która by wykonywała się poza naszą wiedzą i spowalniala by główną pętle
<

czyli cos w stylu :

Kod:
#include <unistd.h>
#include <iostream>
using namespace std;
int a=0;
int main()
{
while (1 >= 1)
{
     long int b = 0;
while (b >= 99999999)
{
      b = b +1;
}
cout << a << endl;
a = a+1;
}
}

btw. Pętle while (1 >= 1) uzywam poniewaz ona nie ma końca
<



Dobra to moze ktos poda mi kod jak do WinApi dodac grafike ??
<

bo kod samego okna juz mam napisany
Kod:
#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

//WYPEŁNIANIE STRUKTURY
 WNDCLASSEX wc;

 wc.cbSize = sizeof(WNDCLASSEX);
 wc.style = 0;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = NazwaKlasy;
 wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

//REJESTROWANIE KLASY OKNA
 if(!RegisterClassEx(&wc))
 {
  MessageBox(NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK);
   return 1;
 }

//TWORZENIE OKNA
 HWND hwnd;

 hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);

 if(hwnd==NULL)
 {
  MessageBox(NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION);
  return 1;
 }
 ShowWindow(hwnd, nCmdShow); //Pokaż okienko...
 UpdateWindow(hwnd);

//Pętla komunikatów
 while(GetMessage(&Komunikat, NULL, 0, 0))
 {
  TranslateMessage(&Komunikat);
  DispatchMessage(&Komunikat);
 }
 return Komunikat.wParam;
}

//OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch(msg)
 {
  case WM_CLOSE:
   DestroyWindow(hwnd);
  break;
  case WM_DESTROY:
   PostQuitMessage(0);
  break;
  default:
   return DefWindowProc(hwnd, msg, wParam, lParam);
  }
 return 0;
}




Moze w Dev-C++ nie ma opcji sleep() ??

na kilku forach czytalem i wiem ze trzeba uzyc naglowka
#include <unistd>

puzniej mozna bez problemu kozystac z

sleep()

ale mi to nie dzial wiec szukalem dalej
<

Na jakims angielskim forum koles napisał
There is not a c++ standard sleep (there is a posix standard shown above), but it is easy enough to write it yourself:
Kod:
#include <time.h>
 
void sleep(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}
[/b]

Tak wiec sprubowalem to
<


tylko nie wiem zabardzo jak to dziala

puzniej uzylem funkcje

sleep(1000);

wyszlo okolo lekko ponad sekunde :/ setne sekundy to nie są a ile ma mili sekunda ??
<



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Znalazłem odpowiedzi na temat sleep
<


w nagłówku
#include <windows.h>

jest

Sleep();

a nie
sleep();
Wielka litera
<


i czas podaje sie w mili sekundach
1 sec == 1000mili sec
 
Do góry Bottom