pomoč

Vsi tehnični vidiki izdelovanja iger - programiranje vseh vrst in oblik, modeliranje, animacija, risanje, dizajn, grafika, glasba in zvok, umetna inteligenca, matematika, fizika itd.

pomoč

OdgovorNapisal/-a koscak » Ne Nov 20, 2011 10:36 pm

Pozdravljen, delam igrico(c++ pa glut bom uprabil) in imam problem, da mi izstrel metkov izrisuje zelo čudno:
Tako da če kdo ve kako pomagati da bo izrisoval metek kot metek bi bil hvaležžen.
Koda
[st.koda]
Koda: Izberi vse
class metki
{public:
      double vx, vy, x, y, r ,strel;
          int smer;
    // int direction;
        metki() {
r = 0.07;
vx=5.55;
vy = 0.55;
// direction = 0;
}
~metki();
void move() {

  x=ship->x;
  y=ship->y;
   smer=ship->direction;
    int i=0;
do
{
draw();

// y += cos(smer*PI/180)*0.01;
    x+= 0.001;

      i++;

 

//preverjanjeali metek trkne ob ladjo;

double dx = Montazna_ladja->ladx - x;
double dy = Montazna_ladja->lady - y;
double ar = Montazna_ladja->ladr + r;
if(dx*dx + dy*dy < ar*ar)
        {

  ship->reset();
//   Montazna_ladja= new montazna_ladja();
             }
//glutPostRedisplay();


     }
    while(i<750);


    /* if (x > (1.0 + r) || x < (-1.0 - r))
x = -x;
if (y > (1.0 + r) || y < (-1.0 - r))
y = -y;

    */
//y+= vy/FPS;
}
void draw() {

glBegin(GL_POLYGON);
glColor3d(0.5, 0.5, 0.5);
glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
glEnd();
//glClearColor(0, 0, 0, 0);
glBindTexture(GL_TEXTURE_2D,5);

/*
glPushMatrix();
glTranslated(x,y,0);
// glColor1d(1);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(-.05,-.05);
glTexCoord2d(1,0); glVertex2d(+.05,-.05);
glTexCoord2d(1,1); glVertex2d(+.05,+.05);
glTexCoord2d(0,1); glVertex2d(-.05,+.05);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D,0);
*/
}

      };
metki  *Metki;
[/st.koda]

takle je pa strel katastrofa pač:
http://www.shrani.si/f/2d/13J/35Uhj9SD/strel.gif
če maš idejo kako naj naredim da bo streljal tako kot prava ladjica bi bil vesel..zelo..
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 1:09 am

Lepo pozdravljen in dobrodošel na SGD-ju! :D
Vesel sm, da si se obrnu na SGD za pomoč in osebno se bom potrudil, da skupaj rešimo problem.

Prvo kot prvo je problem v tem, da verjetno ne natančno razumeš kako deluje "game loop" zanka.
Ko enkrat zaženemo igro, se morajo stvari izvajati v takem zaporedju (prikažem res osnovne korake na grobo):

Koda: Izberi vse
While( ne zapreš igre)
{
    - Input (preverjamo tipke / miško)
    - Update (tukaj se posodablajo objekti - premikanje itd.)
    - Render (izrisovanje stvari)
}


Torej, v Update posodobiš najprej vse objekte v igri kot je premik ladje, premik metka itd. in šele ko vse posodobiš, začneš z izrisovanjem vsega.

Kaj delaš narobe:
- premikaš pozicijo metka znotraj while-do zanke: vsak "loop" oz. krog moraš ti povečati pozicijo metka samo 1x in to izven do-while zanke.
- izrisuješ metek kjer se izvajajo posodobitve metka (beri: premikanje pozicije)
- vsakič ko premakneš metek, nastaviš njegovo pozicijo na pozicijo ladjice

* Zakaj pride do takega izrisa kot je na sliki: ker postaviš ob vsakem premiku metka njegovo pozicijo na pozicijo igralca in nato v while-do zanki, katera se ponovi 750x, premakneš in izrišeš metek in to naredi tako sled kakor je vidno na sliki.

Kaj moraš popravit:
- v vsakemu razredu objekta naredi funkcije "Draw()" ter "Update()". V Draw() boš klical izrisovanje, v update pa boš klical posodobitve - premikanje metka, preverjanje kolizij (trkov) itd.
- kjer imaš glavo programa (kjer se ti izvaja game-loop), pa nato kličeš prvo za vse objekte "Update" nato pa za vse objetke "Render"
- pri premikanju metka odstrani do-while zanko

Prilagam malce spremenjeno ter popravljeno kodo. Dodal sem funkcijo Update() katero moraš klicat kjer sem prej rekel in nato se bo znotraj Update() funkcije klicala še funkcija Move(). Začetna pozicija se določi v konstruktorju - metki() . Ob vsakem krogu, se bo metek premikal v desno za 0.05. Ne pozabit dodat pogoja, da metek izgine ko oddide iz zaslona.

Koda: Izberi vse
class metki {
public:
   double vx, vy, x, y, r ,strel;
   int smer;
   metki()
   {
      r = 0.07;
      vx=5.55;
      vy = 0.55;
      x = ship->x;
      y = ship->y;
   }
    ~metki();

    void Move()
   {
      smer = ship->direction;
      x+= 0.05;

      //preverjanje ali metek trkne ob ladjo;
      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
        {
         ship->reset();
        }
    }

   void Update()
   {
      Move();
   }

    void Draw()
   {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
      glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
      glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
      glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
      glEnd();

      glBindTexture(GL_TEXTURE_2D,5);
    }

};

metki  *Metki;

// recimo da je to funkcija kjer imaš main loop oz. od koder kličeš vse funkcije
// in za primer podajam kako moraš klicat funkcije v metku
void MainLoop()
{
    Metki->Update();
    Metki->Draw();
}



Se opravičujem če sem na kup vrgel preveč informacij ampak določene stvari so pomembe za povedat. Če kaj ne razumeš / če sem se kje zatipkal / oz. če rabiš dodatno razlago kar povej. Bomo pršli problemu do dna, da bo metek zadel in da se bodo ladjice razbijale :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 2:56 pm

Najlepša hvala za topel sprejem, to je cela koda, ki že premika le čudno metke strelja, dodal bi neke FPS-je in timer za štetje, ker drugače ne bom mogel naredit za izdelek. Najlepša hvala za trud. Nočem da mi naredite igro, samo prosil bi za nasvete do sedaj nima izkušenj z tem. Delal sem največ igro v graficks.h, to je tudi to in conio.h conio2.h, sedaj moram narediti igro v glutu, za grafično izrisovanje, to je to.
Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
      char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();
               draw();
               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
{public:
      double metekx, meteky, ladx, lady, ladr, metekr;
      int k;
int direction;
montazna_ladja() {
        metekr=0.07;

    ladr = 0.07;
    ladx = 0.8;
    lady = -0.8;
    k=0;
    direction = 0;
}
    ~montazna_ladja();
void move() {
    draw();
    lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
{
      int i=0;
      metekx=ladx;
      meteky=lady;
     // zdravje=zdravje-5;
do
{
// y += cos(smer*PI/180)*0.01;
    metekx-= 0.01;
izris2();
      i++;


    //  Sleep(5);

//preverjanjeali metek trkne ob ladjo;

double dx =    ship->x - metekx;
double dy = ship->y - meteky;
double ar = ship->r+ metekr;
if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

  //        ship->izpis_zdravja(a);

//   Montazna_ladja= new montazna_ladja();
             }

     }
    while(i<75);


}
if (ladx > (1.0) || ladx < (-1.0 - ladr))
ladx = -ladx;
if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
lady = -lady;

}
void draw() {
glBegin(GL_POLYGON);
glColor3d(0.5, 0.5, 0.5);
glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
glEnd();
}


void izris2() {

glBegin(GL_POLYGON);
glColor3d(0.5, 0.5, 0.5);
glVertex2f(sin((0 + direction)*PI/180)*metekr+metekx, cos((0 + direction)*PI/180)*metekr+meteky);
glVertex2f(sin((140 + direction)*PI/180)*metekr+metekx, cos((140 + direction)*PI/180)*metekr+meteky);
glVertex2f(sin((180 + direction)*PI/180)*metekr/4+metekx, cos((180 + direction)*PI/180)*metekr/4+meteky);
glVertex2f(sin((220 + direction)*PI/180)*metekr+metekx, cos((220 + direction)*PI/180)*metekr+meteky);
glEnd();
    glFlush();
glutSwapBuffers();
/*
glPushMatrix();
glTranslated(x,y,0);
// glColor1d(1);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(-.05,-.05);
glTexCoord2d(1,0); glVertex2d(+.05,-.05);
glTexCoord2d(1,1); glVertex2d(+.05,+.05);
glTexCoord2d(0,1); glVertex2d(-.05,+.05);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D,0);
*/
}
      };
montazna_ladja* Montazna_ladja;
class metki
{public:
      double vx, vy, x, y, r ,strel;
          int smer;
    // int direction;
        metki() {
r = 0.07;
vx=5.55;
vy = 0.55;
// direction = 0;
}
~metki();
void move() {

  x=ship->x;
  y=ship->y;
   smer=ship->direction;
    int i=0;
do
{
draw();

// y += cos(smer*PI/180)*0.01;
    x+= 0.001;

      i++;

     // Sleep(10);

//preverjanjeali metek trkne ob ladjo;

double dx = Montazna_ladja->ladx - x;
double dy = Montazna_ladja->lady - y;
double ar = Montazna_ladja->ladr + r;
if(dx*dx + dy*dy < ar*ar)
        {

  ship->reset();
//   Montazna_ladja= new montazna_ladja();
             }
//glutPostRedisplay();


     }
    while(i<750);


    /* if (x > (1.0 + r) || x < (-1.0 - r))
x = -x;
if (y > (1.0 + r) || y < (-1.0 - r))
y = -y;

    */
//y+= vy/FPS;
}
void draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3d(0.5, 0.5, 0.5);
glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
glEnd();
glBindTexture(GL_TEXTURE_2D,5);

/*
glPushMatrix();
glTranslated(x,y,0);
// glColor1d(1);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(-.05,-.05);
glTexCoord2d(1,0); glVertex2d(+.05,-.05);
glTexCoord2d(1,1); glVertex2d(+.05,+.05);
glTexCoord2d(0,1); glVertex2d(-.05,+.05);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D,0);
*/
}

      };
metki  *Metki;

static void reshape(int width, int height) {
glViewport(0, 0, (GLsizei)width, (GLsizei)height); // Set our viewport to the size of our window
glMatrixMode(GL_PROJECTION); // Switch to the projection matrix so that we can manipulate how our scene is viewed
glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
glMatrixMode(GL_MODELVIEW); // Switch back to the model view matrix, so that we can start drawing shapes correctly
}
static void idle() {
glutPostRedisplay();
}
static void timer(int value) {
glutPostRedisplay();
glutTimerFunc(1000/FPS, timer, 1);
}



void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
void pritisni (void) {

if (tip['a'])

  {    ship->left();}
else  if (tip['d'])

    {    ship->right();}
  else  if (tip['w'])

   {     ship->acc();}
else  if (tip['m'])
{
     Metki-> x=ship->x;
     Metki-> y=ship->y;
     Metki->smer=ship->direction;
     Metki->strel=1;
}
else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
{

     }}
static void miska(int gumb, int stanjeGumba, int x, int y) {
  if(stanjeGumba == GLUT_UP){
   switch(gumb) {
    case GLUT_LEFT_BUTTON:
           //      exit(0);
      break;
}
}
   else {
   switch(gumb) {
     case GLUT_RIGHT_BUTTON:
      break;
}
}
}


static void reorder() {
bool coll = true;
while (coll) {
coll = false;
// stik ladje z asteroidom
double dx = Montazna_ladja->ladx - ship->x;
double dy = Montazna_ladja->lady - ship->y;
double r = Montazna_ladja->ladr + ship->r;
if(dx*dx + dy*dy < r*r) {
coll = true;
Montazna_ladja = new montazna_ladja();
break;
}
}
}
static bool collision() {
bool coll = false;
// stik ladje z ladjo
double dx = Montazna_ladja->ladx - ship->x;
double dy = Montazna_ladja->lady - ship->y;
double ar = Montazna_ladja->ladr + ship->r;
if(dx*dx + dy*dy < ar*ar) {
ship->reset();
}

// ostale stik
return coll;
}
static void display() {
pritisni();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Izris


ship->move();
    Montazna_ladja->move();
    //   Metki->move();
collision();
if(Metki->strel==1)
{Metki->strel=0;
    Metki->move();
    Metki->draw();
    }
glFlush();
glutSwapBuffers();
}
int main(int argc, char** argv) {
// srand((unsigned)time(0));
ship = new Ship();
Montazna_ladja= new montazna_ladja();
Metki= new metki();
//reorder();
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowPosition(10, 10);
glutInitWindowSize(512, 512);
glutCreateWindow("Krneki");
//glutReshapeFunc(reshape);
glutDisplayFunc(display);
//glutIdleFunc(idle);


  //glutMouseFunc(miska);

   glutTimerFunc(1000/FPS, timer, 1);
   glClearColor(0, 1, 1, 0);

   glutKeyboardFunc(tipkovnica);
   glutKeyboardUpFunc(tipkovnica2);
   glutMainLoop();

return 1;
// system("pouse");
}

koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 3:18 pm

Aja kaj render je moj colision ki preverja trk med ladjo in metkom.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 3:42 pm

No, sej nimam namena naredit igro, samo podajal ti bom oporne točke in kako kaj spremenit in zakaj. A si poiskusil kaj spremenit kakor sem predlagal? Strelja še vedno enako kakor na sliki ki si jo priložil?
Trenutno delam, bom pa pregledal kodo ko pridem domov.

Render = Draw() - izrisovanje

Trke preverjaš v "Update()"
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 3:53 pm

Jaz enako v šoli ;) Mikrokrmilnike mamo :D
Se priporočam za nasvete in najlepša ti hvala. Bom naredil tako kot si rekel a ta colision je pri meni kot update, pa vse z maina klicem, Nekaj bi spremenil da bi naredil meni potem pa prek play kličem igrico .
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 3:56 pm

Aja pa prosil bi če bi mi sedaj povedal kaj moram prestavit ker pri 400 vrsticah se da spreminjat, pri 1000 ali več pa žal ,,,
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 8:15 pm

Ok, malo sem moral poiskat okoli kako deluje tale glut zadeva, tako da zdej znam kej več povedat.

Here it goes:

v main funkciji določiš funkcijo, v kateri se bodo izrisovale stvari - glutDisplayFunc(display);
Torej, karkoli imaš za izrisat izrisuješ v funkciji display, kar ni izrisovanja vrži ven iz nje.

glutTimerFunc(1000/FPS, timer, 1); pa je funkcija, s katero določiš funkcijo, ki se bo izvedla vsakih X milisekund (v tvojem primeru je to vsako 1 milisekundo). Tako funkcijo se lahko uporabi (in ti jo tudi boš) za posodablanje objektov, seveda pa obstajajo primernejši načini, kateri pa je bolje da zaenkrat počakajo.

Funkcija main
Koda: Izberi vse
int main(int argc, char** argv)
{
     ...
     ...
     glutInitWindowSize(512, 512);
     glutCreateWindow("Krneki");

     glutKeyboardFunc(tipkovnica);
     glutKeyboardUpFunc(tipkovnica2);
     glutDisplayFunc(Display);  // <---------
     glutTimerFunc(1000/FPS, Update, 1); // <--------
     ...
}


Funkcija Display()
Koda: Izberi vse
static void Display() // tukaj izrisuješ vse stvari...
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      
     ship->draw();
     Metki->draw();
     Montazna_ladja->draw();

     glFlush();
     glutSwapBuffers();
}


Funkcija Update() // tukaj naj se kličejo posodobitve objektov
Koda: Izberi vse
static void Update()
{
     glutPostRedisplay();
     ship->move();
     Montazna_ladja->move();
     if(Metki->strel==1)
     {
          Metki->strel=0;
          Metki->move();
      }

     collision();
}


To je prvi korak, ki ga moraš naredit. Loči posodobitve od izrisovanje ( nikoli ne kliči Draw() iz funkcije Move() ) zgoraj sem ti podal zgleda kako razdeliš to na dva dela in kako zaporedno kličeš.
PS: vidim da imaš v razredih povsod kličeš izrisovanja znotraj Move() funkcij. Vse te klice moraš pobrisat in jih kličeš le 1x znotraj funkcije Display() izven razreda.

Razumljivo? :)

PS: Pri mojih primerih lahko še vidiš način "lepega" pisanja kode. Poskusi delat zamike kakor jih vidiš pri mojih primerih. Na tak način je koda dosti lepše berljiva zate in za ostale, katerim jo kažeš. Ni obvezno je pa zelo priporočljivo :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 8:52 pm

Ekola sem spremenil vendar napaka pri:

Koda: Izberi vse
|395|error: invalid conversion from 'int (*)()' to 'void (*)(int)'|
    glutTimerFunc(1000/FPS, Update, 1);


Napaka pri timer funkciji. Kako bom pa namesto sleepa spremenil da se bo ladjica premikala, ali bom dodal kak timer ki bo meril čas in ko bo preteklo tistih par mili sekund se bo premaknila.
Ko si omenjal strel, menim da while zanka mora biti, ker brez nje se ne more metek premikat. (Zamislil sem si da metek potuje nekaj polij naprej preden izgubi moč)
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 8:56 pm

int value tole moraš dodati v update pa dela ;)
Je pa stvar zanimiva ratala sedaj noben premik ne dela ladji sta posatavljeni pri miru.
http://www.shrani.si/f/2b/px/3VrhBzrJ/primer.png
takole

uredil kodo, mislim da si mislil da takole..
Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
      char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
           {public:
              double metekx, meteky, ladx, lady, ladr, metekr;
              int k;
              int direction;
        montazna_ladja() {
           metekr=0.07;
           ladr = 0.07;
           ladx = 0.8;
           lady = -0.8;
           k=0;
           direction = 0;
           }
    ~montazna_ladja();
void move() {

    lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
       {
      int i=0;
      metekx=ladx;
      meteky=lady;


        do
        {

       metekx-= 0.01;
       draw();
      i++;
      double dx =    ship->x - metekx;
      double dy = ship->y - meteky;
      double ar = ship->r+ metekr;
    if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

             }

         }
         while(i<75);

      }
    if (ladx > (1.0) || ladx < (-1.0 - ladr))
      ladx = -ladx;
     if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
       lady = -lady;

      }
     void draw() {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
      glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
      glEnd();
      }


      };
montazna_ladja* Montazna_ladja;

class metki
{
    public:
      double vx, vy, x, y, r ,strel;
      int smer;

        metki() {
      r = 0.07;
      vx=5.55;
      vy = 0.55;
       }
    ~metki();

     void move() {

        x=ship->x;
        y=ship->y;
        smer=ship->direction;
        int i=0;
      do
     {
    x+= 0.001;
      i++;
      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
     if(dx*dx + dy*dy < ar*ar)
           {

        ship->reset();
            }
     }
            while(i<750);
     }


    void draw()

     {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glBegin(GL_POLYGON);
     glColor3d(0.5, 0.5, 0.5);
     glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
     glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
     glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
     glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
     glEnd();
     glBindTexture(GL_TEXTURE_2D,5);
     }

      };
metki  *Metki;


void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
          void pritisni (void) {

                if (tip['a'])

                  {    ship->left();}

                 else  if (tip['d'])

                  {    ship->right();}

                 else  if (tip['w'])

                  {     ship->acc();}

                 else  if (tip['m'])
                   {
                     Metki-> x=ship->x;
                     Metki-> y=ship->y;
                     Metki->smer=ship->direction;
                     Metki->strel=1;
                    }
                   else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
                    {

                      }}



   static bool collision() {
        bool coll = false;
        // stik ladje z ladjo
        double dx = Montazna_ladja->ladx - ship->x;
        double dy = Montazna_ladja->lady - ship->y;
        double ar = Montazna_ladja->ladr + ship->r;
     if(dx*dx + dy*dy < ar*ar)
      {
          ship->reset();
      }
     // ostale stik
       return coll;
        }
  static void display()

       {
       pritisni();
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Izris
        ship->draw();
        Montazna_ladja->draw();
        //Metki->draw();
        glFlush();
        glutSwapBuffers();
         }

    static void Update(int value)

         {
           glutPostRedisplay();
           ship->move();
           Montazna_ladja->move();
     /*  if(Metki->strel==1)
         {
            Metki->strel=0;
            Metki->move();
         }*/
          collision();
          }
int main(int argc, char** argv)    //             <---------------------------------------MAIN
{
// srand((unsigned)time(0));
         ship = new Ship();
         Montazna_ladja= new montazna_ladja();
         Metki= new metki();
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
         glutInitWindowPosition(10, 10);
         glutInitWindowSize(512, 512);
         glutCreateWindow("Krneki");
         glutKeyboardFunc(tipkovnica);
         glutKeyboardUpFunc(tipkovnica2);
         glutDisplayFunc(display);
         glutTimerFunc(1000/FPS, Update, 1); // <--------
         glutMainLoop();

return 1;
// system("pouse");
}
Zadnjič spremenil koscak, dne Po Nov 21, 2011 9:18 pm, skupaj popravljeno 1 krat.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 9:06 pm

Aja, vidiš vidiš, nism bil sigurn glede value :)

Glede premikanja pa ne, ne smeš imet v while zanki nikakor...
Kakor sm že večkrat omenu, igra deluje v krogu

Input
Update
Izris
..

Ko pride na vrsto update, poziciji objekta prišteješ neko vrednost natanko enrkat.

Recimo da imamo jabolko na drevesu z x = 10, y = 10. Določimo da jabolko pada in tako
vsak krog (vsakič ko pride Update na vrsto) zmanjšamo y za 1

Move()
{
y = y - 0.001;
}

Ti sedaj kličeš funkcijo Update() vsako 1ms, torej bo jabolko padlo na tla (doseglo y == 0) v natanko 1 sekundi, kar je pravilno.
Če bi naredil while zanko, ki gre 1000x skozi, pa bi jabolko že v 1ms doseglo tla...

Razumeš zakaj while zanka ni prav? :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 9:20 pm

Štekam zgoraj je urejena koda in tvoja pravilne vendar ladje se ne premikajo, in skos so izrisani metki , samo hočem povedat metki ne smejo it naprej, dokler jih nek triger(sprožilec) ne sproži.
Upam da razumeš, dokler jaz ne pritisnem tipke m- se ne smejo premikat.
Sedaj stoji vse pri miru tako kot sem gor pokazal. ne delujejo tipke, je pa sigurno boljši način ta ki si mi ga povedal. Pozna se ker prvič to delam.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 10:20 pm

Ne, se ne premikajo še, če si naredil vse do sedaj kakor sem rekel, potem sva sedaj šele pravilno nastavila izrisovanje in posodablanje objektov, sedaj pa pridejo ostali popravki.

Zakaj se metki ne premikajo:
- ko kličeš funkcijo Move() v metku, vedno nastaviš x ter y na pozicijo igralca. Na tak način bo metek vedno na miru oz. na poziciji igralca in se ne bo nikoli premaknil. V funkciji Move() moraš ti le dodajati vrednost pozicij, ne pa jo nastavljati na pozicijo ladjice, saj to narediš že, ko pritisneš tipko "m".
Prav tako upam, da si odstranil do-while zanko, ker ne sme biti tam.

Sedaj bova popravila stvari tako, da bo metek aktiven (se bo začel premikat) ko pristneš tipko "m").
1.) Kodo za ob pritisku na tipko "m" si že pravilno zapisal. Nastavimo metek na igralčevo pozicijo ter nastavimo spremenljivko "strel" na 1, kar pomeni da leti če se ne motim a ne?
2.) V razredu metki, nastavimo v konstruktorju (metki() { ....}) vrednost strel = 0.
3.) V funkciji Move() odstrani while-do zanko
4.) V funkciji Move() odstrani x = ship->x ter y = ship->y, tako preprečimo da bo metek vedno na igralčevi poziciji
5.) Kjer počuješ x za 0.001 naredi še pogoj if (strel == 1) torej, če metek leti, začni povečevat njegovo X pozicijo
6.) Če pride do trka, ne pozabit nastavit spremenljivke strel na 0

Prilagam še popravljeno kodo za Move().
Koda: Izberi vse
class metki{
public:
   double vx, vy, x, y, r ,strel;
   int smer;
        // int direction;
   metki()
   {
      r = 0.07;
      vx=5.55;
      vy = 0.55;
      strel = 0;  // <-------- nastavi vrednost na 0 (metek ne leti)
    }
    ~metki();
    void move()
    {
      smer = ship->direction;
               
      if(strel == 1)
         x+= 0.001;

      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
      {
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
      }
    }

    void Draw()
    {
        ...
        ...
        ...


Na zadnje pa ne pozabit klicat metek->Move() v funkciji Update() ki si jo prej spisal.

Sporoči kašni so rezultati :)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 10:29 pm

Ekola ..
http://www.shrani.si/f/f/t8/15LNABMB/primer2.png
takole ;)
Zalafvat morm debugerja ker drugače ne dela .
Sprememba kode
Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
      char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
           {public:
              double metekx, meteky, ladx, lady, ladr, metekr;
              int k;
              int direction;
        montazna_ladja() {
           metekr=0.07;
           ladr = 0.07;
           ladx = 0.8;
           lady = -0.8;
           k=0;
           direction = 0;
           }
    ~montazna_ladja();
void move() {

    lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
       {
      int i=0;
      metekx=ladx;
      meteky=lady;


        do
        {

       metekx-= 0.01;
       draw();
      i++;
      double dx =    ship->x - metekx;
      double dy = ship->y - meteky;
      double ar = ship->r+ metekr;
    if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

             }

         }
         while(i<75);

      }
    if (ladx > (1.0) || ladx < (-1.0 - ladr))
      ladx = -ladx;
     if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
       lady = -lady;

      }
     void draw() {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
      glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
      glEnd();
      }


      };
montazna_ladja* Montazna_ladja;

class metki{
public:
   double vx, vy, x, y, r ,strel;
   int smer;
        // int direction;
   metki()
   {
      r = 0.07;
      vx=5.55;
      vy = 0.55;
      strel = 0;  // <-------- nastavi vrednost na 0 (metek ne leti)
    }
    ~metki();
    void move()
    {
      smer = ship->direction;

      if(strel == 1)
         x+= 0.001;

      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
      {
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
      }
    }

    void draw()

     {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glBegin(GL_POLYGON);
     glColor3d(0.5, 0.5, 0.5);
     glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
     glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
     glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
     glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
     glEnd();
     glBindTexture(GL_TEXTURE_2D,5);
     }

      };
metki  *Metki;


void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
          void pritisni (void) {

                if (tip['a'])

                  {    ship->left();}

                 else  if (tip['d'])

                  {    ship->right();}

                 else  if (tip['w'])

                  {     ship->acc();}

                 else  if (tip['m'])
                   {
                    Metki->strel=1;
                    }
                   else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
                    {

                      }}



   static bool collision() {
        bool coll = false;
        // stik ladje z ladjo
        double dx = Montazna_ladja->ladx - ship->x;
        double dy = Montazna_ladja->lady - ship->y;
        double ar = Montazna_ladja->ladr + ship->r;
     if(dx*dx + dy*dy < ar*ar)
      {
          ship->reset();
      }
     // ostale stik
       return coll;
        }
  static void display()

       {
       pritisni();
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Izris
        ship->draw();
        Montazna_ladja->draw();
       Metki->draw();
        glFlush();
        glutSwapBuffers();
         }

    static void Update(int value)

         {
           glutPostRedisplay();
           ship->move();
           Montazna_ladja->move();
          Metki->move();

          collision();
          }
int main(int argc, char** argv)    //             <---------------------------------------MAIN
{
// srand((unsigned)time(0));
         ship = new Ship();
         Montazna_ladja= new montazna_ladja();
         Metki= new metki();
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
         glutInitWindowPosition(10, 10);
         glutInitWindowSize(512, 512);
         glutCreateWindow("Krneki");
         glutKeyboardFunc(tipkovnica);
         glutKeyboardUpFunc(tipkovnica2);

         glutTimerFunc(1000/FPS, Update, 1); // <--------
         glutDisplayFunc(display);
         glutMainLoop();

return 1;
// system("pouse");
}
Zadnjič spremenil koscak, dne Po Nov 21, 2011 10:45 pm, skupaj popravljeno 1 krat.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 10:33 pm

Bistvo je da razumeš princip zakaj se stvari ne primikajo in kako jih začet pravilno premikati, zato predlagam da poskusiš premakniti metek. Če ti uspe en metek pognat čez ekran ti bo lažje razumevanje moje razlage.

Potem bomo tudi ladjico premaknili kakor je treba
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 10:49 pm

Sprememba na zaslonu ampak če kliknem m se še kar nič ne premakne.
http://www.shrani.si/f/f/t8/15LNABMB/primer2.png
takole ;)
Zalafvat morm debugerja ker drugače ne dela .
Sprememba kode
Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
      char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
           {public:
              double metekx, meteky, ladx, lady, ladr, metekr;
              int k;
              int direction;
        montazna_ladja() {
           metekr=0.07;
           ladr = 0.07;
           ladx = 0.8;
           lady = -0.8;
           k=0;
           direction = 0;
           }
    ~montazna_ladja();
      void move() {

       lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
       {
      int i=0;
      metekx=ladx;
      meteky=lady;


        do
        {

       metekx-= 0.01;
       draw();
      i++;
      double dx =    ship->x - metekx;
      double dy = ship->y - meteky;
      double ar = ship->r+ metekr;
    if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

             }

         }
         while(i<75);

      }
    if (ladx > (1.0) || ladx < (-1.0 - ladr))
      ladx = -ladx;
     if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
       lady = -lady;

      }
     void draw() {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
      glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
      glEnd();
      }


      };
montazna_ladja* Montazna_ladja;

class metki{
public:
   double vx, vy, x, y, r ,strel;
   int smer;
        // int direction;
   metki()
   {
      r = 0.07;
      vx=5.55;
      vy = 0.55;
      strel = 0;  // <-------- nastavi vrednost na 0 (metek ne leti)
    }
    ~metki();
    void move()
    {
      smer = ship->direction;

      if(strel == 1)
         x+= 0.001;

      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
      {
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
      }
    }

    void draw()

     {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glBegin(GL_POLYGON);
     glColor3d(0.5, 0.5, 0.5);
     glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
     glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
     glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
     glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
     glEnd();
     glBindTexture(GL_TEXTURE_2D,5);
     }

      };
metki  *Metki;


void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
          void pritisni (void) {

                if (tip['a'])

                  {    ship->left();}

                 else  if (tip['d'])

                  {    ship->right();}

                 else  if (tip['w'])

                  {     ship->acc();}

                 else  if (tip['m'])
                   {
                    Metki-> x=ship->x;
                     Metki-> y=ship->y;
                     Metki->smer=ship->direction;
                     Metki->strel=1;
                    }
                   else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
                    {

                      }}



   static bool collision() {
        bool coll = false;
        // stik ladje z ladjo
        double dx = Montazna_ladja->ladx - ship->x;
        double dy = Montazna_ladja->lady - ship->y;
        double ar = Montazna_ladja->ladr + ship->r;
     if(dx*dx + dy*dy < ar*ar)
      {
          ship->reset();
      }
     // ostale stik
       return coll;
        }
  static void display()

       {
       pritisni();
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Izris
        ship->draw();
        Montazna_ladja->draw();
       Metki->draw();
        glFlush();
        glutSwapBuffers();
         }

    static void Update(int value)

         {
           glutPostRedisplay();
           ship->move();
           Montazna_ladja->move();
          Metki->move();

          collision();
          }
int main(int argc, char** argv)    //             <---------------------------------------MAIN
{
// srand((unsigned)time(0));
         ship = new Ship();
         Montazna_ladja= new montazna_ladja();
         Metki= new metki();
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
         glutInitWindowPosition(10, 10);
         glutInitWindowSize(512, 512);
         glutCreateWindow("Krneki");
         glutKeyboardFunc(tipkovnica);
         glutKeyboardUpFunc(tipkovnica2);

         glutTimerFunc(1000/FPS, Update, 1); // <--------
         glutDisplayFunc(display);
         glutMainLoop();

return 1;
// system("pouse");
}
Zadnjič spremenil koscak, dne Po Nov 21, 2011 10:53 pm, skupaj popravljeno 2 krat.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 10:53 pm

Preden karkoli več začem gledat, me zanima kakšno je stanje z metkom. Ali se premika? Izstreli? Ali ga ni?
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 10:59 pm

Blodyavenger napisal/-a:Preden karkoli več začem gledat, me zanima kakšno je stanje z metkom. Ali se premika? Izstreli? Ali ga ni?


http://www.shrani.si/f/1y/kd/1Jur4ViB/problem3.png

takole izrisuje sredinski je metek izreli ga pa žal ne, metek na sredini je kto je v konstrukorju prikazano.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 11:02 pm

Čeprov ni pa logično, zakaj za hudiča metek tam na sredino izriše.
Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
      char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
           {public:
              double metekx, meteky, ladx, lady, ladr, metekr;
              int k;
              int direction;
        montazna_ladja() {
           metekr=0.07;
           ladr = 0.07;
           ladx = 0.8;
           lady = -0.8;
           k=0;
           direction = 0;
           }
    ~montazna_ladja();
      void move() {

       lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
       {
      int i=0;
      metekx=ladx;
      meteky=lady;


        do
        {

       metekx-= 0.01;
       draw();
      i++;
      double dx =    ship->x - metekx;
      double dy = ship->y - meteky;
      double ar = ship->r+ metekr;
    if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

             }

         }
         while(i<75);

      }
    if (ladx > (1.0) || ladx < (-1.0 - ladr))
      ladx = -ladx;
     if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
       lady = -lady;

      }
     void draw() {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
      glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
      glEnd();
      }


      };
montazna_ladja* Montazna_ladja;

class metki{
public:
   double x, y, r ,strel;
   int smer;
        // int direction;
   metki()
   {
      r = 0.07;

      strel = 0;  // <-------- nastavi vrednost na 0 (metek ne leti)
    }
    ~metki();
    void move()
    {
      smer = ship->direction;

      if(strel == 1)
         x+= 0.001;

      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
      {
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
      }
    }

    void draw()

     {

     glBegin(GL_POLYGON);
     glColor3d(0.5, 0.5, 0.5);
     glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
     glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
     glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
     glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
     glEnd();
     glBindTexture(GL_TEXTURE_2D,5);
     }

      };
metki  *Metki;


void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
          void pritisni (void) {

                if (tip['a'])

                  {    ship->left();}

                 else  if (tip['d'])

                  {    ship->right();}

                 else  if (tip['w'])

                  {     ship->acc();}

                 else  if (tip['m'])
                   {
                    Metki-> x=ship->x;
                     Metki-> y=ship->y;
                     Metki->smer=ship->direction;
                     Metki->strel=1;
                    }
                   else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
                    {

                      }}



   static bool collision() {
        bool coll = false;
        // stik ladje z ladjo
        double dx = Montazna_ladja->ladx - ship->x;
        double dy = Montazna_ladja->lady - ship->y;
        double ar = Montazna_ladja->ladr + ship->r;
     if(dx*dx + dy*dy < ar*ar)
      {
          ship->reset();
      }
     // ostale stik
       return coll;
        }
  static void display()

       {
       pritisni();
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Izris
        ship->draw();
        Montazna_ladja->draw();
        Metki->draw();
        glFlush();
        glutSwapBuffers();
         }

    static void Update(int value)

         {
           glutPostRedisplay();
           ship->move();
           Montazna_ladja->move();
          Metki->move();

          collision();
          }
int main(int argc, char** argv)    //             <---------------------------------------MAIN
{
// srand((unsigned)time(0));
         ship = new Ship();
         Montazna_ladja= new montazna_ladja();
         Metki= new metki();
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
         glutInitWindowPosition(10, 10);
         glutInitWindowSize(512, 512);
         glutCreateWindow("Krneki");
         glutKeyboardFunc(tipkovnica);
         glutKeyboardUpFunc(tipkovnica2);

         glutTimerFunc(1000/FPS, Update, 1); // <--------
         glutDisplayFunc(display);
         glutMainLoop();

return 1;
// system("pouse");
}

koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 11:11 pm

Sedaj sem se spomnil kaj je verjetno narobe funkcija pritisni(), kam je potrebno vstavit funkcijo klici ker brez nje ne gre te funkcije. Ker v njej se nahajajo glavni pritiski na tipke (branja), fuknciji tipkovnica in tipkovnica2 ugotvljata le če je tipka pritisnjena in da ne pride do zmešnjav če imaš 2 tipke pritisnjeni naenkrat.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 11:12 pm

Poskusi zakomentirati kolizijo pri metku, mogoče ni dobro spisano in vedno zaznava trk in posledično vsakič resetira metek:

Tole zakomentiraj...
Koda: Izberi vse
/*if(dx*dx + dy*dy < ar*ar)
{
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
}*/


Drugače pa dobrodošel v svetu programiranja, zmelkoow bi rekli: "Problemi so in problemi bodo" ;)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » Po Nov 21, 2011 11:15 pm

Žal ne pomaga . Po moje je problem z branjem z tipkovnice. Preberi zgornji post, ki sem ga napisal vmes ko si pisal, kaj naj zakomentiram.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 11:26 pm

Poskusi popravit na začetku

Koda: Izberi vse
char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)


v

Koda: Izberi vse
bool tip[256]; // Create an array of boolean values of length 256 (0-255)
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a Blodyavenger » Po Nov 21, 2011 11:28 pm

Aaaa, točno, dobra analiza :)

Pokliči funkcjio pritisni( ) čisto na začetku Update() funkcije, samo da vidimo če dela
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » To Nov 22, 2011 1:20 pm

http://www.shrani.si/f/2D/bC/3A20C4ZM/primer.png
Ekola primer ko pritiskam tipke in mi sploh ne zazna da sem tipko pritisnil, sem dal (v vsaki tipki če je pritisnjena da izpiše neko črko (a)), pa vendar žal zgleda ne zmore prebrat , me pa čudi kaj je narobe ;(.

Koda: Izberi vse
#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <vector>
#include <dos.h>
#include <unistd.h>
#define RADIUS 0.0
#define FPS 60
#define PI 3.14
      void *font = GLUT_BITMAP_TIMES_ROMAN_24;
     char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)
      using namespace std;
             class Ship {
                 public:
                 double vx, vy, x, y, r,kroglax, kroglay;
                 int zdravje;
                 int direction;
             Ship() {
               r = 0.09;
               x = -0.8;
               y = -0.8;
               direction = 0;
               kroglax=-0.8;
               kroglay=-0.8;
               zdravje=100;
              }
             ~Ship();
             void move(){
               izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
            void izpis_zdravja(){
                char a;
                int i,len;
                glRasterPos2f(0.8,0.8);
                glutBitmapCharacter(font,i=(int)zdravje );
               }
           void draw() {
                glBegin(GL_POLYGON);
                glColor3d(0.5, 0.5, 0.5);
                glVertex2f(sin((0 + direction)*PI/180)*r+x, cos((0 + direction)*PI/180)*r+y);
                glVertex2f(sin((140 + direction)*PI/180)*r+x, cos((140 + direction)*PI/180)*r+y);
                glVertex2f(sin((180 + direction)*PI/180)*r/4+x, cos((180 + direction)*PI/180)*r/4+y);
                glVertex2f(sin((220 + direction)*PI/180)*r+x, cos((220 + direction)*PI/180)*r+y);
                glEnd();
                 }
           void left() {
                direction = (direction - 6) % 360;
                 }
           void right() {
                direction = (direction + 6) % 360;
                 }
           void acc() {
                 x += sin(direction*PI/180)*0.01;
                 y += cos(direction*PI/180)*0.01;
               /*
               y+=0.1*sin(direction);
               x+=0.1*cos(direction);*/
               }
          void stop() {
                vx = 0;
                vy = 0;
               }
         void reset() {
                stop();
                direction = 1;
                x = 0;
                y = 0;
                }
               };
              Ship* ship;
        class montazna_ladja
           {public:
              double metekx, meteky, ladx, lady, ladr, metekr;
              int k;
              int direction;
        montazna_ladja() {
           metekr=0.07;
           ladr = 0.07;
           ladx = 0.8;
           lady = -0.8;
           k=0;
           direction = 0;
           }
    ~montazna_ladja();
      void move() {

       lady+=0.01;
//y+=0.0001;
   if(lady>1)
    ladx-=0.02;
    Sleep(100);
    double dx =  ship->x - ladx;
    double dy = ship->y - lady;
    double ar = ship->r+ ladr;
    dx=sqrt(dx*dx);
    dy=sqrt(dy*dy);
  if(dx<(0.5)&&dy<(0.1))
       {
      int i=0;
      metekx=ladx;
      meteky=lady;


        do
        {

       metekx-= 0.01;
       draw();
      i++;
      double dx =    ship->x - metekx;
      double dy = ship->y - meteky;
      double ar = ship->r+ metekr;
    if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

             }

         }
         while(i<75);

      }
    if (ladx > (1.0) || ladx < (-1.0 - ladr))
      ladx = -ladx;
     if (lady > (1.0 + ladr) || lady < (-1.0 - ladr))
       lady = -lady;

      }
     void draw() {
      glBegin(GL_POLYGON);
      glColor3d(0.5, 0.5, 0.5);
      glVertex2f(sin((0 + direction)*PI/180)*ladr+ladx, cos((0 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((140 + direction)*PI/180)*ladr+ladx, cos((140 + direction)*PI/180)*ladr+lady);
      glVertex2f(sin((180 + direction)*PI/180)*ladr/4+ladx, cos((180 + direction)*PI/180)*ladr/4+lady);
      glVertex2f(sin((220 + direction)*PI/180)*ladr+ladx, cos((220 + direction)*PI/180)*ladr+lady);
      glEnd();
      }


      };
montazna_ladja* Montazna_ladja;

class metki{
public:
   double x, y, r ,strel;
   int smer;
        // int direction;
   metki()
   {
      r = 0.07;

      strel = 0;  // <-------- nastavi vrednost na 0 (metek ne leti)
    }
    ~metki();
    void move()
    {
      smer = ship->direction;

      if(strel == 1)
         x+= 0.001;

      double dx = Montazna_ladja->ladx - x;
      double dy = Montazna_ladja->lady - y;
      double ar = Montazna_ladja->ladr + r;
      if(dx*dx + dy*dy < ar*ar)
      {
         ship->reset();
         strel = 0;
         x = ship->x;
         y = ship->y;
      }
    }

    void draw()

     {

     glBegin(GL_POLYGON);
     glColor3d(0.5, 0.5, 0.5);
     glVertex2f(sin((0 + smer)*PI/180)*r+x, cos((0 + smer)*PI/180)*r+y);
     glVertex2f(sin((140 + smer)*PI/180)*r+x, cos((140 + smer)*PI/180)*r+y);
     glVertex2f(sin((180 + smer)*PI/180)*r/4+x, cos((180 + smer)*PI/180)*r/4+y);
     glVertex2f(sin((220 + smer)*PI/180)*r+x, cos((220 + smer)*PI/180)*r+y);
     glEnd();
     glBindTexture(GL_TEXTURE_2D,5);
     }

      };
metki  *Metki;


void tipkovnica (unsigned char tipka, int x, int y) {
tip[tipka] = true; // Set the state of the current key to pressed
}

void tipkovnica2 (unsigned char tipka, int x, int y) {
tip[tipka] = false; // Set the state of the current key to not pressed
}
          void pritisni (void) {

                if (tip['a'])

                  {    ship->left();
                  cout<<"a";  }

                 else  if (tip['d'])

                  {    ship->right();
                  cout<<"a";  }

                 else  if (tip['w'])

                  {     ship->acc();
                  cout<<"a";  }

                 else  if (tip['m'])
                   {
                    Metki-> x=ship->x;
                     Metki-> y=ship->y;
                     Metki->smer=ship->direction;
                     Metki->strel=1;
                     cout<<"a";                  }
                   else if(!((tip['a'])&&(tip['d'])&&(tip['w'])&&(tip['m'])))
                    {

                      }}



   static bool collision() {
        bool coll = false;
        // stik ladje z ladjo
        double dx = Montazna_ladja->ladx - ship->x;
        double dy = Montazna_ladja->lady - ship->y;
        double ar = Montazna_ladja->ladr + ship->r;
     if(dx*dx + dy*dy < ar*ar)
      {
          ship->reset();
      }
     // ostale stik
       return coll;
        }
  static void display()

       {
       
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Izris
        ship->draw();
        Montazna_ladja->draw();
        Metki->draw();
        glFlush();
        glutSwapBuffers();
         }

    static void Update(int value)

         {pritisni();
           glutPostRedisplay();
           ship->move();
           Montazna_ladja->move();
          Metki->move();

          collision();
          }
int main(int argc, char** argv)    //             <---------------------------------------MAIN
{
// srand((unsigned)time(0));
         ship = new Ship();
         Montazna_ladja= new montazna_ladja();
         Metki= new metki();
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
         glutInitWindowPosition(10, 10);
         glutInitWindowSize(512, 512);
         glutCreateWindow("Krneki");
       
         glutTimerFunc(1000/FPS, Update, 1); // <--------
         glutDisplayFunc(display);
          glutKeyboardFunc(tipkovnica);
         glutKeyboardUpFunc(tipkovnica2);

         glutMainLoop();

return 1;
// system("pouse");
}
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » To Nov 22, 2011 1:27 pm

Blodyavenger napisal/-a:Poskusi popravit na začetku

Koda: Izberi vse
char* tip = new char[256]; // Create an array of boolean values of length 256 (0-255)


v

Koda: Izberi vse
bool tip[256]; // Create an array of boolean values of length 256 (0-255)


Naredi to pa kako pa se je znajdu tisti "a" v konzoli? Na sliki je videt en izpis a-ja
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » To Nov 22, 2011 1:37 pm

ne koristi žal ne. sem že vmes probal pa ne dela... trenutno pa tudi a-ja ni več kakor zgleda...
Koda: Izberi vse
void move(){
              // izpis_zdravja();

               //brez tega gre moja ladjica za večno stran
               if (x > (1.0 + r) || x < (-1.0 - r))
               x = -x;
               if (y > (1.0 + r) || y < (-1.0 - r))
               y = -y;
               }
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » To Nov 22, 2011 2:00 pm

Poskusi dodat to vrstico, kjer se pritiska tipke:

Koda: Izberi vse
void tipkovnica (unsigned char tipka, int x, int y)
{
   tip[tipka] = true; // Set the state of the current key to pressed
   printf("Keydown:%d \n", tipka );  //<-------------
}


Da vidimo če deluje ta funkcija sploh
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Re: pomoč

OdgovorNapisal/-a koscak » To Nov 22, 2011 4:30 pm

http://www.shrani.si/f/a/37/2zbdpB0k/primer3.png

izpisuje črke, ker cem dal cout<<tipka; ker ti compailar noče prekompajlat printf-ja (v codeblocks) v dev c++ to deluje z printf ;)
Ob vsakem pritisku izpiše črko, kar je prav,..
Osebno mislim da pri metku bi mogla dat nek timer ki bi dovolil premik metka, mal počasneje da bi bil človeškemu očesu viden.
Mislim da je to narobe, in po moje bi mogla ko metek pride z polja dol, jih uničit,ker v najnem primeru se metek postavi na 0 šele ko zadane ladjo, ni pa nujno da zadane.
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: pomoč

OdgovorNapisal/-a Blodyavenger » To Nov 22, 2011 6:26 pm

Tam kjer povečaš X pri metku

x += 0.001 poskusi naredit malo večjo številko kot je npr. 0.1, ker sedaj se je metek povečeval 1 pixel vsako sekundo in mogoče ni bilo vidno. A tisto je metek na sredini drugače?
................ My personal GameDev Blog ...................
"Don't you dare using uninitialized variables, not in C++"
Uporabniški avatar
Blodyavenger
expert
expert
 
Prispevkov: 716
Pridružen: Pe Sep 12, 2008 3:31 pm
Kraj: Land of the Ten Hares

Naslednja

Vrni se na Izdelovanje iger

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron