'잡다한것들전부/팁'에 해당되는 글 38건

  1. 2013.12.10 포물선 운동 관련 소스
  2. 2013.12.03 헥사 게임 알고리즘
  3. 2013.12.02 비쥬얼드 로직
  4. 2013.12.02 비쥬얼드 3개 블록 맞추는 로직
  5. 2013.12.02 cocos2d-x 3.0 관련 컴포넌트 사용
  6. 2013.12.02 ios7 UITableView 사용시 배경화면 흰색으로 나오는 현상
  7. 2013.12.02 iOS7 상태바 안보이게 설정하기
  8. 2013.11.20 관련 사이트

포물선 운동 관련 소스

|

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
   
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback) );
    pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition( CCPointZero );
    this->addChild(pMenu, 1);

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
   
    sprite = CCSprite::create("CloseNormal.png");
    this->addChild(sprite);
    sprite->setPosition(ccp(20, winSize.height/2));
   

//힘

    int Force = 5;
   

//각도 조절
    float x = Force * cos(25);
    float y = Force * sin(25);
//벡터값   
    vector = CCPoint(x, y);
    time = 0.0f;
    initPos = sprite->getPosition();
    CCLog("%f, %f" , x,y);
   
    this->schedule(schedule_selector(HelloWorld::gameLogic));
    return true;
}

void HelloWorld::gameLogic(float dt)
{
   
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    //CCLog("gameLogic!");
    time += dt;

//시간에 따른 포물선 운동 공식
    float x = vector.x * time;
    float y = vector.y * time - (9.8f/2.0f * time * time);
   
    CCPoint pos = sprite->getPosition();
    sprite->setPosition(ccp(pos.x+x,pos.y+y));
   
    if(sprite->getPositionY() < 0)
    {
        time = 0;
        sprite->setPosition(ccp(20, winSize.height/2));
    }
   
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

'잡다한것들전부 > ' 카테고리의 다른 글

중급 개발자가 되는 방법 5가지  (0) 2013.12.16
배경 무한 스크롤링  (0) 2013.12.11
포물선 운동 관련 소스  (0) 2013.12.10
헥사 게임 알고리즘  (0) 2013.12.03
비쥬얼드 로직  (0) 2013.12.02
비쥬얼드 3개 블록 맞추는 로직  (0) 2013.12.02
Trackback 0 And Comment 0

헥사 게임 알고리즘

|
떨어지는 블럭의 위치를 기준으로 체크를 합니다. 이게 하나가 블럭이 떨어진 경우는 쉽게 처리가 가능한데

만약 상쇄되어 여러개가 그 밑으로 내려가서 반응하는 경우를 어렵게 생각하실거 같습니다만

모두를 하나씩 생각한다면 어렵지 않습니다.

 

일단 기본방법은 주위의 블럭을 비교해서 같은 것인지 체크를 합니다. 2차원 배열을 하나 만들어서 없어져야 할 블럭칸을 마킹 합니다.

마킹하고 또 주위 블럭을 검사하고 마킹합니다. 마킹한 블럭은 검사할 필요 없죠. 재귀호출 함수나 길찾기 알고리즘을 이용할 수 도 있습니다.

그래픽툴에서 색칠하기 공식도 유사하구요. 이렇게 해서 1단계 마킹처리가 끝나면 그 마킹된 위치의 블럭들을 없애는 처리를 합니다.

그러면 블럭사이에 빈 공간이 생길 수 있는데 블럭을 내리고 블럭의 칸들을 하나씩 검사해서 위 과정을 뒤풀이 합니다.


'잡다한것들전부 > ' 카테고리의 다른 글

배경 무한 스크롤링  (0) 2013.12.11
포물선 운동 관련 소스  (0) 2013.12.10
헥사 게임 알고리즘  (0) 2013.12.03
비쥬얼드 로직  (0) 2013.12.02
비쥬얼드 3개 블록 맞추는 로직  (0) 2013.12.02
cocos2d-x 3.0 관련 컴포넌트 사용  (0) 2013.12.02
Trackback 0 And Comment 0

비쥬얼드 로직

|
출처 : http://www.emanueleferonato.com/2010/12/16/complete-bejeweled-game-in-less-than-2kb/

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.TextField;
    public class n extends Sprite {
        private var jw:Array=new Array();
        private var g:Sprite;
        private var s:Sprite=new Sprite();
        private var pr:int=-10;
        private var pc:int=-10;
        private var cl:Array=new Array(0xFF0000,0xFF00,0xFF,0XFFFF00,0xFF00FF,0xFFFF,0xFFFFFF);
        private var cp:Boolean=false;
        private var ts:TextField=new TextField();
        private var th:TextField=new TextField();
        private var sc:uint=0;
        private var m:uint=0;
        public function n() {
            addChild(ts);
            ts.textColor=0xFFFFFF;
            ts.x=500;
            addChild(th);
            th.textColor=0xFFFFFF;
            th.x=550;
            for (var i:uint=0; i<8; i++) {
                jw[i]=new Array();
                for (var j:uint=0; j<8; j++) {
                    do {
                        jw[i][j]=Math.floor(Math.random()*7);
                    } while (rk(i,j)>2||ck(i,j)>2);
                    g=new Sprite();
                    g.graphics.beginFill(cl[jw[i][j]]);
                    g.graphics.drawCircle(30,30,29);
                    g.graphics.endFill();
                    g.name=i+"_"+j;
                    g.x=j*60;
                    g.y=i*60;
                    addChild(g);
                }
            }
            addChild(s);
            s.graphics.lineStyle(2,0xff0000,1);
            s.graphics.drawRect(0,0,60,60);
            s.visible=false;
            stage.addEventListener(MouseEvent.CLICK,ci);
            addEventListener(Event.ENTER_FRAME,ef);
        }
        private function ef(e:Event):void {
            var f:Boolean=false;
            for (var i:int=6; i>=0; i--) {
                for (var j:uint=0; j<8; j++) {
                    if (jw[i][j]!=-1&&jw[i+1][j]==-1) {
                        f=true;
                        jw[i+1][j]=jw[i][j];
                        jw[i][j]=-1;
                        getChildByName(i+"_"+j).y+=60;
                        getChildByName(i+"_"+j).name=(i+1)+"_"+j;
                        break;
                    }
                }
                if (f) {
                    break;
                }
            }
            if (! f) {
                var h:Boolean=false;
                for (i=7; i>=0; i--) {
                    for (j=0; j<8; j++) {
                        if (jw[i][j]==-1) {
                            h=true;
                            jw[0][j]=Math.floor(Math.random()*7);
                            g=new Sprite();
                            g.graphics.beginFill(cl[jw[0][j]]);
                            g.graphics.drawCircle(30,30,29);
                            g.graphics.endFill();
                            g.name="0_"+j;
                            g.x=j*60;
                            g.y=0;
                            addChild(g);
                            break;
                        }
                    }
                    if (h) {
                        break;
                    }
                }
                if (! h) {
                    var r:Boolean=false;
                    for (i=7; i>=0; i--) {
                        for (j=0; j<8; j++) {
                            if (rk(i,j)>2||ck(i,j)>2) {
                                r=true;
                                var tr:Array=[i+"_"+j];
                                var u:uint=jw[i][j];
                                var t:int;
                                if (rk(i,j)>2) {
                                    t=j;
                                    while (chk(u,i,t-1)) {
                                        t--;
                                        tr.push(i+"_"+t);
                                    }
                                    t=j;
                                    while (chk(u,i,t+1)) {
                                        t++;
                                        tr.push(i+"_"+t);
                                    }
                                }
                                if (ck(i,j)>2) {
                                    t=i;
                                    while (chk(u,t-1,j)) {
                                        t--;
                                        tr.push(t+"_"+j);
                                    }
                                    t=i;
                                    while (chk(u,t+1,j)) {
                                        t++;
                                        tr.push(t+"_"+j);
                                    }
                                }
                                for (i=0; i<tr.length; i++) {
                                    removeChild(getChildByName(tr[i]));
                                    var cd:Array=tr[i].split("_");
                                    jw[cd[0]][cd[1]]=-1;
                                    sc+=m;
                                    m++;
                                }
                                break;
                            }
                        }
                        if (r) {
                            break;
                        }
                    }
                    if (! r) {
                        cp=true;
                        m=0;
                    }
                }
            }
            ts.text=sc.toString();
        }
        private function ci(e:MouseEvent):void {
            if (cp) {
                if (mouseX<480&&mouseX>0&&mouseY<480&&mouseY>0) {
                    var sr:uint=Math.floor(mouseY/60);
                    var sc:uint=Math.floor(mouseX/60);
                    if (!(((sr==pr+1||sr==pr-1)&&sc==pc)||((sc==pc+1||sc==pc-1)&&sr==pr))) {
                        pr=sr;
                        pc=sc;
                        s.x=60*pc;
                        s.y=60*pr;
                        s.visible=true;
                    } else {
                        swp(pr,pc,sr,sc);
                        if (rk(pr,pc)>2||ck(pr,pc)>2||rk(sr,sc)>2||ck(sr,sc)>2) {
                            th.text="";
                            cp=false;
                            getChildByName(pr+"_"+pc).x=sc*60;
                            getChildByName(pr+"_"+pc).y=sr*60;
                            getChildByName(pr+"_"+pc).name="t";
                            getChildByName(sr+"_"+sc).x=pc*60;
                            getChildByName(sr+"_"+sc).y=pr*60;
                            getChildByName(sr+"_"+sc).name=pr+"_"+pc;
                            getChildByName("t").name=sr+"_"+sc;
                        } else {
                            swp(pr,pc,sr,sc);
                        }
                        pr=-10;
                        pc=-10;
                        s.visible=false;
                    }
                } else {
                    for (var i:uint=0; i<8; i++) {
                        for (var j:uint=0; j<8; j++) {
                            if (i<7) {
                                swp(i,j,i+1,j);
                                if ((rk(i,j)>2||ck(i,j)>2||rk(i+1,j)>2||ck(i+1,j)>2)) {
                                    th.text = i.toString()+","+j.toString()+"->"+(i+1).toString()+","+j.toString();
                                }
                                swp(i,j,i+1,j);
                            }
                            if (j<7) {
                                swp(i,j,i,j+1);
                                if ((rk(i,j)>2||ck(i,j)>2||rk(i,j+1)>2||ck(i,j+1)>2) ) {
                                    th.text = i.toString()+","+j.toString()+"->"+(i).toString()+","+(j+1).toString();
                                }
                                swp(i,j,i,j+1);
                            }
                        }
                    }
                }
            }
        }
 
        private function swp(r1:uint,c1:uint,r2:uint,c2:uint):void {
            var t:uint=jw[r1][c1];
            jw[r1][c1]=jw[r2][c2];
            jw[r2][c2]=t;
        }
        private function rk(r:uint,c:uint):uint {
            var u:uint=jw[r][c];
            var stk:uint=1;
            var t:int=c;
            while (chk(u,r,t-1)) {
                t--;
                stk++;
            }
            t=c;
            while (chk(u,r,t+1)) {
                t++;
                stk++;
            }
            return (stk);
        }
        private function ck(r:uint,c:uint):uint {
            var u:uint=jw[r][c];
            var stk:uint=1;
            var t:int=r;
            while (chk(u,t-1,c)) {
                t--;
                stk++;
            }
            t=r;
            while (chk(u,t+1,c)) {
                t++;
                stk++;
            }
            return (stk);
        }
        private function chk(g:uint,r:int,c:int):Boolean {
            if (jw[r]==null) {
                return false;
            }
            if (jw[r][c]==null) {
                return false;
            }
            return g==jw[r][c];
        }
    }
}


Trackback 0 And Comment 0

비쥬얼드 3개 블록 맞추는 로직

|
var grid:Array = [[2,3,2,2,2,4],
                  [ .. ]]; //multidimensional array
var matches:uint;
var gemType:uint;
for(col = 0; col < grid.length; col++){
    matches = 0;        
    gemType = 0; //Reserve 0 for the empty state. If we make it a normal gem type, then only 2 are needed to match for the start.
    for(i = 0; i < grid[0].length; i++){
        if(grid[col][i] == gemType){
            matches++;
        }
        if(grid[col][i] != gemType || i == grid[0].length - 1){ //subtract 1 because arrays start at 0
            if(matches >= 3){
                removeMatches(blah);
            }
            gemType = grid[col][i];
            matches = 1;
        }
    }
}






int item = grid[x,y];
if(grid[x-1,y]==item)
{
    int step=x;
    int matches =2;
    while(grid[step-1,y]==item)
    {
        step++;
        matches++
    }
    if(matches>2)
        //remove all matching items
}
else if(grid[x+1,y]==item
    //....
else if(grid[x,y-1==item)
    //...
else if(grid[x,y+1]==item)
    //...








 public int getHMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 0, column, 1);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }


    public int getVMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 1, column, 0);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }

    /// <summary>
    /// I return the match size.
    /// </summary>
    /// <param name="row"></param>
    /// <param name="rowDelta">1 means look vertically.  Dont set both deltas to 1.</param>
    /// <param name="column"></param>
    /// <param name="columnDelta">1 means look horizontally.  Dont set both deltas to 1.</param>
    /// <returns>The number of contiguous matching things</returns>
    public int getMatchValue(int row, int rowDelta, int column, int columnDelta)
    {
        int[] start = getEndItem(row, -1 * rowDelta, column, -1 * columnDelta);
        int[] end = getEndItem(row, rowDelta, column, columnDelta);

        int returnMe = 0;
        returnMe += end[0] - start[0];
        returnMe += end[1] - start[1];
        return returnMe;
    }

    /// <summary>
    /// I will return the end of a sequence of matching items.
    /// </summary>
    /// <param name="row">start here</param>
    /// <param name="column">start here</param>
    private int[] getEndItem(int row, int rowDelta, int column, int columnDelta)
    {
        Gem matchGem = new Gem(-1);
        int[] returnMe = new int[2];

        if (boardSpace[row + rowDelta][column + columnDelta] == boardSpace[row][column])
        {
            return getEndItem(row + rowDelta, rowDelta, column + columnDelta, columnDelta);
        }
        else
        {
            returnMe[0] = row;
            returnMe[1] = column;
            return returnMe;
        }
    }




Trackback 0 And Comment 0

cocos2d-x 3.0 관련 컴포넌트 사용

|
이번에 3.0 으로 코코스 2d가 바뀌면서 컴포넌트 개념을 많이 사용하는 것 같습니다.
참고하시면 좋을것 같아서 퍼옵니다.

kasa080622cppcompsys.ppt



출처 : http://www.dev3d.net/bbs/view.php?id=pds&page=3&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=106

Trackback 0 And Comment 0

ios7 UITableView 사용시 배경화면 흰색으로 나오는 현상

|
ios7은 UITableView의 셀 배경이 기본으로 흰색으로 설정되있는 것 같습니다.


cellForRowAtIndexPath 함수에 아래의 내용을 추가합니다.

cell
.backgroundColor = [UIColor clearColor]; cell.backgroundView = [[UIView new] autorelease]; cell.selectedBackgroundView = [[UIView new] autorelease];


Trackback 0 And Comment 0

iOS7 상태바 안보이게 설정하기

|

 iOS가 7 로 되면서 시간과 배터리 등의 정보가 상태바에 표시되는 증상이 있습니다. into.plist 파일에 View controller-based status bar appearance를 Add Row하시고 속성값을 NO로 세팅해주면 됩니다. 이런 현상이 사라지게 됩니다.

Trackback 0 And Comment 0

관련 사이트

|

http://paralaxer.com/


http://www.supersuraccoon-cocos2d.com/2011/09/17/sticky-demo-resource-list-keep-updating/

Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | next