ja sam pokusao da je napravim cisto da vidim da li cu moci jer nesto prostije od toga mislim da ne postoji
e sad treba mi pomoc posto sam vec poceo da se nerviram jer nece sve da radi kako treba
evo coda
#include <conio.h> //potrebno zbog getch()
#include <dos.h> //potrebno zbog delay()
#define ZUTA 44 //zuta boja
#define CRNA 1 //crna boja
#define DUZINA 50 //duzina zmije
void setmode(int mode); //za menjanje gragf modova
void pp(int x,int y, unsigned char c); //za iscrtavanje pixela na ekranu
int main(){
int x=50, y=50; //pocetne kordinate zmije
int xb,yb; //kordinate poslednje tacke na zmiji koju treba pocrneti (izbrisati)
setmode(0x13); //prebacujem se u video mod
for(int i=x+DUZINA; i!=x; x++) //ovaj loop iscrtava pocetni polozaj zmije
{
pp(x,y,ZUTA);
}
for(;;) //ovaj loop animira kretanje zmije
{
pp(x,y,ZUTA); //putpixel zute boje na sledecu tacku
pp(xb,yb,CRNA); //putpixel crne boje na poslednju tacku tj
//obrisi je (jer je pozadina takodje crna)
delay(20); //20 milisec izmedju svakog iscrtavanja pixela....brzina igre
if (kbhit() != 0) //kbhit proverava da li je pritisnuto neko dugme
{
char c = getch(); //ako jeste zovi getch() da primi koje dugme
if (c==27) break; //ako je to dugme escape (39 dec) prekini loop
/**************************************************************************
obradjivanje tastera koji je pritisnut
u zavisnosti od njega promeniti smer zmije
if (c=='2') { } // dole
if (c=='4') { } // levo
if (c=='6') { } // desno
if (c=='8') { } // gore
***************************************************************************/
}
}
return 0;
}
/**********************************************************************
* Funkcija "void setmode(int mode)" postavlja trazeni video mod
* 0x13 - 320x200x256
* 0x03 - dos text mode
**********************************************************************/
void setmode(int mode)
{
asm {
mov ax,mode //vrednost ax odredjuje video mod
int 0x10 //prebacuje u zeljeni video mod
}
}
/************************************************************************
* Iscrtava pixel na ekranu, asm code *
************************************************************************/
void pp(int x,int y, unsigned char c)
{ asm {
mov ax, 0xA000
mov es, ax
mov bx, [x]
mov dx, [y]
xchg dh, dl
mov al, [c]
mov di, dx
shr di, 2
add di, dx
add di, bx
stosb
}
}
ok znaci ovo je recimo 2% celog programa (treba jos tu da dodje okvir, bube, textualni intro, top scores...) ali to je ono glavno sve ostalo je posle laksi deo
dakle treba mi pomoc oko proracunavanja pixela koji ce da se obrise, onda oko kretanja zmije i pomoc oko obrade pritisnutog tastera
ja sam probao ovo da resim ali.....evo na koji nacin
int x2, y2 ; //ovo su bile kordinate koje sam dodavao na x i y..kao neki offset
pp(x+x1, y+y1, BOJA); //ovo bi iscrtavalo nove pixele
pp(x+x1-DUZINA+y2, (y+y1)-y1, CRNA) //ovo bi brisalo poslednji pixel
//tj ovo "x+x1-DUZINA+y2" je proracun x ose poslednjeg
//pixela a "(y+y1)-y1" y ose...nepitajte me kako
//sam dotle dosao jer ne znam ni ja sam i znam da neradi!!!
if (kbhit() != 0)
{
char c = getch();
if (c==27) break; //escape quit
if (c=='2') //user je pritisnuo 2 tj smer DOLE znaci zaustavljam
//povecavanje/smanjenje x ose i povecavam y
//(y se povecava na dole posto su kordinate 0,0 u
//gornjem levom uglu ekrana)
{
y2++; //y2 = 1
x2=0;
/* za ostale smerove nisam uradio jer sam hteo da prvo probam sa ovim
pa sam mislio poslecu lako za ostale...al ni ovaj nisam uspeo*/
}
}
if (y2!=0) y2++; //znaci ako je y2!=0 onda vrsim pomeranje po y osi
if (x2!=0) x2++; //takodje i za x
}
takodje me zanima u opste da li je dobar nacin ili se sve to radi na neki drugi jednostavniji, skolskiji nacin?
da li je sama programska shema i ideja dobra ili losa?
kompajler: borland turbo c++ za dos
COBOL, and nineteen other high-tech
words.