디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

C 오류점영 ㅠㅠ 전체소스 올릴겡

응잉앙앵(175.201) 2012.04.20 20:26:52
조회 57 추천 0 댓글 2

// SDL GAME.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include "stdafx.h"

#include <SDL.h>
#include <sdl_gdiplus.h>
#include <string>
#include <time.h>
#include <math.h>

#pragma comment(lib,"SDL")
#pragma comment(lib,"SDLmain")
#pragma comment(lib,"SDL_gdiplus")

#define MapWidth 500
#define view_wview 640
#define view_hview 480

SDL_Surface *screen;
bool keyLeft=0,
         keyRight=0,
         keyUp=0,
         keyDown=0,
     keyLeftPress=0,
         keyRightPress=0,
         keyUpPress=0,
         keyDownPress=0;
        
short mapPos[MapWidth][MapWidth]={0};
bool canPass[7]={0};
int view_xview=0,view_yview=0;

int random(int x){return rand()%(x+1);}
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}

SDL_Surface* LoadIMG(std::string name){
        SDL_Surface* Loadedimage=NULL;
        SDL_Surface* Optimizedimage=NULL;
        Loadedimage=IMG_Load(name.c_str());

        if(Loadedimage!=NULL){
                Optimizedimage=SDL_DisplayFormat(Loadedimage);
                SDL_FreeSurface(Loadedimage);
                printf(""%s" loading success\n",name.c_str());
        }else printf(""%s" loading fail\n",name.c_str());

        return Optimizedimage;
}

typedef struct Position{
        int x,y;
}Position;

typedef struct Sprite{
        SDL_Surface *res;
        int width,height,xoffset,yoffset;
}Sprite;

typedef struct Object{
        Sprite spr;
        Position pos,targetPos;
        int flag;
}Object;

void SpriteInit(Sprite &spr){
        spr.width=1;
        spr.height=1;
        spr.xoffset=0;
        spr.yoffset=0;
        printf("width: %d / height: %d\n",spr.res->w,spr.res->h);
}

void ObjectInit(Object &obj,std::string res,int x,int y){
        obj.spr.res=LoadIMG(res);
        SpriteInit(obj.spr);
        obj.pos.x=x;
        obj.pos.y=y;
}

void DrawSurface(SDL_Surface *dst,Sprite spr,int index,int x,int y){
        SDL_Rect rectDst,rectSrc;
        rectDst.x=x-spr.xoffset;
        rectDst.y=y-spr.yoffset;
        rectSrc.x = (index%spr.width) * spr.res->w/spr.width;
        rectSrc.y = (index/spr.width) * spr.res->h/spr.height;
        rectSrc.w = spr.res->w/spr.width;
        rectSrc.h = spr.res->h/spr.height;
        SDL_BlitSurface(spr.res,&rectSrc,dst,&rectDst);
}

void Render(){
        SDL_Flip(screen);
}

void DrawObject(SDL_Surface *dst,Object &obj){
        DrawSurface(dst,obj.spr,0,obj.pos.x*16-view_xview,obj.pos.y*16-view_yview);
}

int main(int argc,char **argv){
        SDL_Init(SDL_INIT_VIDEO);

        screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE | SDL_DOUBLEBUF);

        //변수 선언
        bool quit=0;
        float fps=60;
        int startTick,i,j;

        SDL_Event event;

        //게임변수 선언
        int move_delay=0;
        short turn=0;

        //리소스 로드
        Sprite back;
        Sprite background;
        back.res=LoadIMG("res\\img\\back.png");
        SpriteInit(back);
        background.res=LoadIMG("res\\img\\background.png");
        SpriteInit(background);

        background.width=7;
        
        //게임관련 변수 초기화
        SDL_WM_SetCaption("SDL GAME TEST",NULL);
        srand((unsigned)time(NULL));
        for(i=0;i<MapWidth;i++)for(j=0;j<MapWidth;j++)
                mapPos[i][j]=random(6);

        //블록 통행여부
        canPass[0]=1;
        canPass[1]=1;
        canPass[2]=1;
        canPass[3]=1;
        canPass[4]=1;
        canPass[5]=1;
        canPass[6]=0;

        //인스턴스 생성        
        Object player;
        ObjectInit(player,"res\\img\\charactor.png",random(MapWidth),random(MapWidth));
        Object act[2000];
        for(i=0;i<2000;i++){
                ObjectInit(act[i],"res\\img\\charactor.png",random(MapWidth),random(MapWidth));
                act[i].flag=i<200?3:(1+random(1));
                act[i].targetPos.x=random(MapWidth);
                act[i].targetPos.y=random(MapWidth);
        }
        
        while(!quit){
                startTick=SDL_GetTicks();

                //프레임 초기화
                keyLeftPress=0;
                keyRightPress=0;
                keyUpPress=0;
                keyDownPress=0;

                if(SDL_PollEvent(&event)){
                        switch(event.type){
                        case SDL_QUIT:
                                quit=1;
                                break;
                        case SDL_KEYDOWN:
                                switch(event.key.keysym.sym){
                                case SDLK_LEFT:
                                        keyLeft=1;
                                        keyLeftPress=1;
                                        break;
                                case SDLK_RIGHT:
                                        keyRight=1;
                                        keyRightPress=1;
                                        break;
                                case SDLK_UP:
                                        keyUp=1;
                                        keyUpPress=1;
                                        break;
                                case SDLK_DOWN:
                                        keyDown=1;
                                        keyDownPress=1;
                                        break;
                                case SDLK_SPACE:
                                        for(j=-5;j<=5;j++){
                                                        for(i=-5;i<=5;i++){
                                                                if(i||j)printf("%d ",mapPos[player.pos.x+i][player.pos.y+j]);
                                                                else printf("  ");
                                                        }
                                                        printf("\n");
                                                }
                                        break;
                                }
                                break;
                        case SDL_KEYUP:
                                switch(event.key.keysym.sym){
                                case SDLK_LEFT:
                                        keyLeft=0;
                                        break;
                                case SDLK_RIGHT:
                                        keyRight=0;
                                        break;
                                case SDLK_UP:
                                        keyUp=0;
                                        break;
                                case SDLK_DOWN:
                                        keyDown=0;
                                        break;
                                }
                                break;
                        }
                }
                
                //캐릭터 이동
                if((keyRight||keyLeft||keyDown||keyUp)&&move_delay<=0){

                        move_delay=10;
                        if(keyRight&&canPass[mapPos[player.pos.x+1][player.pos.y]]){
                                player.pos.x+=1;
                                if(!keyLeft)turn++;
                        }
                        if(keyLeft&&canPass[mapPos[player.pos.x-1][player.pos.y]]){
                                player.pos.x-=1;
                                if(!keyRight)turn++;
                        }
                        if(keyDown&&canPass[mapPos[player.pos.x][player.pos.y+1]]){
                                player.pos.y+=1;
                                if(!keyUp)turn++;
                        }
                        if(keyUp&&canPass[mapPos[player.pos.x][player.pos.y-1]]){
                                player.pos.y-=1;
                                if(!keyDown)turn++;
                        }

                        player.pos.x=max(0,min(MapWidth-1,player.pos.x));
                        player.pos.y=max(0,min(MapWidth-1,player.pos.y));

                }else{move_delay-=1;}

                view_xview=player.pos.x*16-320;
                view_yview=player.pos.y*16-240;

                while(turn){
                        turn--;

                        for(i=0;i<2000;i++){
                                if(act[i].pos.x==act[i].targetPos.x&&act[i].pos.y==act[i].targetPos.y){
                                        act[i].targetPos.x=random(MapWidth);
                                        act[i].targetPos.y=random(MapWidth);
                                }

                                if((random(1)||act[i].pos.y==act[i].targetPos.y)&&act[i].pos.x!=act[i].targetPos.x){
                                        if(canPass[mapPos[act[i].pos.x+(act[i].pos.x<act[i].targetPos.x)-(act[i].pos.x>act[i].targetPos.x),act[i].pos.y]]){//여기서 오류
                                                act[i].pos.x+=(act[i].pos.x<act[i].targetPos.x)-(act[i].pos.x>act[i].targetPos.x);
                                        }
                                }else{
                                        if(canPass[mapPos[act[i].pos.x,act[i].pos.y+(act[i].pos.y<act[i].targetPos.y)-(act[i].pos.y>act[i].targetPos.y)]]){//여기서 오류
                                                act[i].pos.y+=(act[i].pos.y<act[i].targetPos.y)-(act[i].pos.y>act[i].targetPos.y);
                                        }
                                }
                        }
                }


                //Rendering
                DrawSurface(screen,back,0,0,0);
                for(j=max(0,-view_yview/16-1);j<min(30,-view_yview/16+MapWidth-1);j++)for(i=max(0,-view_xview/16-1);i<min(40,-view_xview/16+MapWidth-1);i++){
                        DrawSurface(screen,background,mapPos[view_xview/16+i][view_yview/16+j],i*16,j*16);
                }
                DrawObject(screen,player);
                for(i=0;i<2000;i++){
                        DrawObject(screen,act[i]);
                }
                Render();

                SDL_Delay((int)(1000/fps));
        }

        SDL_Quit();

        return 0;
}









실험해보니깐 mapPos 내부에 쓰레기값이 들어간거 같아... 전부 4502016 뭐 이런값들 줄줄 들어가있던데 무슨일이지.. 초기화도 다 시켰고,, ㅠ
SDL써서 만든거 ㅠ

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48785 65
2905356 입시 면접 FM 합격 솔루션(필승 전략 해법)!U 프갤러(121.142) 23:15 7 1
2905353 조갑제도 “국힘은 이적단체”…여당은 ‘내란 가짜뉴스’ 대응 중 발명도둑잡기(118.216) 22:57 10 0
2905352 해외 투자 증세에 관해 [1] 발명도둑잡기(118.216) 22:54 37 0
2905351 나님 달러 미국주식 풀매수중 ㅇㅅㅇ [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 22:50 21 0
2905350 미국주식갤에서 친미매국노들 욕하다가 차단당함 [2] 손발이시립디다갤로그로 이동합니다. 22:43 18 0
2905349 이태원 발언으로 모욕죄 벌금 100만원 싸게쳤다 vs 과하다 [5] ㅇㅇ(39.7) 22:36 30 0
2905348 영어를 못해서 구글을 못가네 [1] ㅇㅇ갤로그로 이동합니다. 22:35 17 0
2905345 원티드 자격요건은 거기 직원들도 다 못할거 같은데 ㅇㅇ(182.228) 22:25 12 0
2905344 이태원 모욕죄로 100만원 벌금받았는데 걍 목매달고 죽을까 [2] ㅇㅇ(39.7) 22:24 20 0
2905343 오픈소스에서는 취약점을 감시하는 사람이 더 많다 발명도둑잡기(118.216) 22:23 13 0
2905342 사타구니 털 제모하면 이상한 사람인가요? [5] 넥도리아(220.74) 22:22 28 0
2905341 노말틱도 말해주잖아 오픈소스의 취약점 [1] ㅇㅇ(114.30) 22:17 23 0
2905340 <복면가왕> 관련 생각나는 예전 글 발명도둑잡기(118.216) 22:14 14 0
2905339 정치가 어쨌든 나라가 어쨌든 국가가 어쨌든 삶이 어쨌든 [8] 넥도리아(220.74) 22:13 38 0
2905338 이태원 모욕죄로 구약식 벌금100만원 = 재산잃고 전과남고 인생조진거지? [10] ㅇㅇ(39.7) 22:11 26 0
2905337 저좀 어떻게 성공시켜 주실 분 없나요? [2] 넥도리아(220.74) 22:07 23 0
2905335 사실 제가 틀딱이 아니라 귀여운 여자임을 인증합니다 [6] 헬마스터갤로그로 이동합니다. 21:58 41 0
2905332 페이커닮은 개발자 찾습니다 프갤러(106.101) 21:38 22 0
2905331 진짜 크게 벌리는 건 아니고… 그냥 생활비용 차트부자(1.233) 21:35 16 0
2905325 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [1] ♥멘헤라냥덩♥갤로그로 이동합니다. 20:52 22 0
2905324 프로그래머, 내가 하다 하다 3D 공부한다. [4] 프갤러(59.16) 20:52 43 1
2905319 출퇴근길에 소소하게 짭짤하네요 [1] 존버장군(1.233) 20:15 30 0
2905316 나 좀 찾지 말아달라고 했음 ㅇㅇ(211.234) 20:02 29 0
2905313 나 아까 실수했네 발명도둑잡기(118.216) 19:45 23 0
2905299 서울 유명 스웨디시 후기 모음집 ㅇㅇ(118.235) 18:50 28 0
2905298 어제부터 저녁에 배가 안 고픔;; [6] ♥멘헤라냥덩♥갤로그로 이동합니다. 18:49 49 0
2905297 클래스 101 결제해본 사람있나 ㅇㅇ(140.248) 18:28 26 0
2905296 국비 말고 혼자 자격증 따서 취직하는것도 가능함? [1] ㅇㅇ갤로그로 이동합니다. 18:27 31 0
2905294 후 시발 이런건 15분만에 최라락 써서 뚝딱 해야하는건데 프갤러(14.52) 17:56 31 0
2905293 회원가입 겨우 완성했다. 프갤러(14.52) 17:53 32 0
2905292 <서울 자가에 대기업 다니는 김부장 이야기>관련 생각나는 글 발명도둑잡기(118.216) 17:31 35 0
2905291 맨땅에 헤딩하기에는 c가 가장 적절한듯 ㅇㅇ(118.235) 17:29 22 0
2905289 AI 로 뚝딱해서 돈 벌었다는 사람 통장 까봐. 프갤러(59.16) 17:09 31 1
2905288 미디어에서 AI 로 1 분만에 뚝딱 개발했다니까 정말 그런줄 알아. 프갤러(59.16) 17:04 30 1
2905287 프로그래머가 되려면 꿈과 희망을 버려라. [3] 프갤러(59.16) 16:57 51 0
2905284 “시간이 돈을 버는 구조 만들기: 매달 ‘짭짤한 복리’ 얻는 방식” 88아재 (119.15) 16:32 18 0
2905283 <우주메리미>가 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 16:28 20 0
2905282 면접문제를 만들어봤다. 프갤러(49.165) 16:11 31 0
2905281 "찬송가 부르고 주식 사"‥ 이불말이는 주가 올리는 '제물' 발명도둑잡기(118.216) 16:03 13 0
2905280 시대의 어르신들이 하나 둘 돌아가시는게 참 먹먹하구낭.. [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 15:55 37 0
2905279 바지가 내려가 넥도리아(223.38) 15:49 34 0
2905278 ■si회사갈거면 포트폴리오 프론트엔드 뭘로하는게 좋냐? [9] ㅇㅇ갤로그로 이동합니다. 15:47 58 0
2905277 Ada 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 15:33 28 0
2905276 착한 중국인 환영⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 15:30 24 0
2905275 Ada 언어는 공부하면 할수록 너무 신기하다.. ㅎㅎ 나르시갤로그로 이동합니다. 15:14 26 0
2905274 나님 왤케 소중하실깡..?⭐+ [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 15:08 42 0
2905272 SK네트웍스 FAMILY AI 캠프 24기 프갤러(118.235) 14:46 26 0
2905271 미국정치 갤러리 이미지, 동영상 첨부 차단 중 [1] 발명도둑잡기(118.216) 14:46 33 0
2905270 열심히 살아라 RyuDOG갤로그로 이동합니다. 14:46 32 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2