Problém-automatický pohyb v SDL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém-automatický pohyb v SDL – C / C++ – Fórum – Programujte.comProblém-automatický pohyb v SDL – C / C++ – Fórum – Programujte.com

 

bebe19
~ Anonymní uživatel
2 příspěvky
12. 10. 2008   #1
-
0
-

Zdravím, napsal jsem si kód:



#include <SDL.h>
#include <stdio.h>
#include <stdlib.h>


SDL_Surface *screen;
SDL_Surface *zbran;
SDL_Surface *background;
SDL_Surface *cil;
SDL_Surface *bullet;

int zbran_x=0;
int zbran_y=150;
int cil_x=500;
int cil_y=500;
int bull_x;
int bull_y;

void LoadImages(){
zbran = SDL_LoadBMP("zbran.bmp");
background = SDL_LoadBMP("bg.bmp");
cil = SDL_LoadBMP("cil.bmp");
bullet = SDL_LoadBMP("bullet.bmp");
}

void DrawIMG(SDL_Surface *img, int x, int y){
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(img, NULL, screen, &rect);
}

void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2){
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_Rect rect2;
rect2.x = x2;
rect2.y = y2;
rect2.w = w;
rect2.h = h;
SDL_BlitSurface(img, &rect2, screen, &rect);
}


void DrawScene(){
DrawIMG(background, zbran_x-1, zbran_y-1, 200, 200, zbran_x-1, zbran_y-1);
DrawIMG(zbran, zbran_x, zbran_y);
DrawIMG(cil, cil_x, cil_y);
SDL_Flip(screen);
}

void DrawBullet(){
DrawIMG(bullet,bull_x,bull_y);
SDL_Flip(screen);
}
Uint32 Timer1(Uint32 interval, void* param){

bull_x+=1;


return interval;
}


int main(int argc, char *argv[]){

Uint8* keys;



if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0 ){
printf("Inicializace SDL se nezdařila: %s", SDL_GetError());
exit(1);
}

atexit(SDL_Quit);
screen = SDL_SetVideoMode(895, 716, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);

if ( screen == NULL ){
printf("Vytvoření okna se nezdařilo: %s", SDL_GetError());
exit(1);
}

LoadImages();
DrawIMG(background, 0, 0);


bool done=false;

while(done == false){
SDL_Event event;
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) done = true;
if(event.type == SDL_KEYUP){
if(event.key.keysym.sym == SDLK_RETURN) done = true;

}
}

keys = SDL_GetKeyState(NULL);
if(keys[SDLK_RIGHT]) zbran_x += 1;
if(keys[SDLK_LEFT]) zbran_x -= 1;
if(keys[SDLK_DOWN]) zbran_y += 1;
if(keys[SDLK_UP]) zbran_y -= 1;
if(keys[SDLK_SPACE]) {
bull_x=zbran_x+100;
bull_y=zbran_y+10;

float chun=bull_x-cil_x;
float khun=bull_y-cil_y;
while ((chun>200)||(khun>200))
bull_x+=1;
DrawBullet();
}
DrawScene();
}

}

a mám tři dotazy:
1)Proč se kulka nechce hýbat a jak to zařídit?
2)Jak udělat aby se při každém zmáčknutí mezrníku vytvořila nová kulka, ne aby se přemístila stará?
3)Bude potom fungovat to zjištování kolize nebo to chce udělat nové..?

Nahlásit jako SPAM
IP: 88.146.167.–
KIIV
~ Moderátor
+43
God of flame
12. 10. 2008   #2
-
0
-

1) tezko rict asi ji neprekreslujes....
2) 3) udelej kulku jako objekt
nove objekty snad uz zvladnes ... a pak jen projdes pole kulek a vykreslis vsechny... pripadne zrusis ty ktere sou uz passe

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
o-lox0
Super člen
13. 10. 2008   #3
-
0
-

Měl jsem volných 20 minut(na to co přesně radil KIIV), ale nastolilo to nové otázky,
-jako kulka nemíří na cíl vypočítej trajektorii a vylepši její pohyb
-cíl zůstává netknut, atd.. :-)
Klidně s tebou pojedu kooperativně(mailem), možná už máš svojí lepší verzi...
PS nezapomínej na

abs()



#include <SDL.h> 

#include <stdio.h>
#include <stdlib.h>


SDL_Surface *screen;
SDL_Surface *zbran;
SDL_Surface *background;
SDL_Surface *cil;
SDL_Surface *bullet;

int i,j,a,b;
int zbran_x=0;
int zbran_y=150;
int cil_x=500;
int cil_y=500;
enum Typ {nic,strela};
class Objekt{
public:
enum Typ typ;
void Objekt::DrawBullet();
int bull_x;
int bull_y; }
objekt[200];

void LoadImages(){
zbran = SDL_LoadBMP("zbran.bmp");
background = SDL_LoadBMP("bg.bmp");
cil = SDL_LoadBMP("cil.bmp");
bullet = SDL_LoadBMP("bullet.bmp");
}

void DrawIMG(SDL_Surface *img, int x, int y){
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(img, NULL, screen, &rect);
}

void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2){
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_Rect rect2;
rect2.x = x2;
rect2.y = y2;
rect2.w = w;
rect2.h = h;
SDL_BlitSurface(img, &rect2, screen, &rect);
}


void DrawScene(){
DrawIMG(background, zbran_x-1, zbran_y-1, 200, 200, zbran_x-1, zbran_y-1);
DrawIMG(zbran, zbran_x, zbran_y);
DrawIMG(cil, cil_x, cil_y);
SDL_Flip(screen);
}

void Objekt::DrawBullet(){
DrawIMG(bullet,bull_x,bull_y);
SDL_Flip(screen);

float chun=bull_x-cil_x;
float khun=bull_y-cil_y;
if ((abs(chun)>20)||(abs(khun)>20))
bull_x+=1; else typ=nic;
}
Uint32 Timer1(Uint32 interval, void* param){
//bull_x+=1;
return interval;
}

int main(int argc, char *argv[]){
Uint8* keys;

if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0 ){
printf("Inicializace SDL se nezdaøila: %s", SDL_GetError());
exit(1);
}

atexit(SDL_Quit);
screen = SDL_SetVideoMode(895, 716, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);

if ( screen == NULL ){
printf("Vytvoøení okna se nezdaøilo: %s", SDL_GetError());
exit(1);
}

LoadImages();
DrawIMG(background, 0, 0);


bool done=false;

while(done == false){
SDL_Event event;
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) done = true;
if(event.type == SDL_KEYUP){
if(event.key.keysym.sym == SDLK_RETURN) done = true;

}
}

keys = SDL_GetKeyState(NULL);
if(keys[SDLK_RIGHT]) zbran_x += 1;
if(keys[SDLK_LEFT]) zbran_x -= 1;
if(keys[SDLK_DOWN]) zbran_y += 1;
if(keys[SDLK_UP]) zbran_y -= 1;
if(keys[SDLK_SPACE]) {
for (i=0;i<200;i++)
if (objekt[i].typ==nic) {
objekt[i].bull_x=zbran_x+100;
objekt[i].bull_y=zbran_y+10;
objekt[i].typ=strela;
break;
}
}
for (i=0;i<200;i++)
switch (objekt[i].typ){
case strela: objekt[i].DrawBullet();
}
DrawScene();
}
return 0;
}

Nahlásit jako SPAM
IP: 85.71.152.–
KIIV
~ Moderátor
+43
God of flame
13. 10. 2008   #4
-
0
-

no pokud chcete neco jako realisticky pohyb kulky tak jeste pridat vektor rychlosti kulky... nejlepe rozlozenej do x/y(/z), gravitacni zrychleni, vahu kulky, mozna i odpor vzduchu a treba i smer vetru a posun dejme tomu o nejakou casovou jednotku... aby kdyz vystreli skoro kolmo nad sebe tak aby kulka dopadla pekne tam kde ma, nebo pokud by foukal silnej vitr tak aby ji to trochu unaselo

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 113 hostů

Podobná vlákna

SDL - šikmý pohyb? — založil vollf82

Problém s SDL — založil Systém

Problem s SDL — založil yaqwsx

Problem s SDL — založil Milan

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý