tisdag 22 juli 2014

Lägg till reklam i din app med Game Maker Studio


  • Öppna Game Maker Studio och tryck på fliken "Demos"
  • Leta dig fram till "Ad Providers" och tryck på "Google_mobile_ad"
  • I projektet så gå till "Extension" i vänstra fältet och högerklicka med musen och välj exportera.
    • Spara den på ett bra ställe.
  • Öppna ditt eget projekt och högerklicka på "Extension" och importera filen från det bra stället.
  • I ett objekt med en "Game Start" event klistra in följande
    /// Init Ads
    GoogleMobileAds_Init("ca-app-pub-2978192583326741/6837289118");
  • I samma objekt i en "Create" event:
    GoogleMobileAds_AddBanner("ca-app-pub-2978192583326741/6837289118", GoogleMobileAds_Banner);
    // Position it at bottom right of screen
    var bw,bh,px,py;
    var bw = GoogleMobileAds_BannerGetWidth();
    var bh = GoogleMobileAds_BannerGetHeight();
    var px = display_get_width()-bw;
    var py = display_get_height()-bh;
    GoogleMobileAds_MoveBanner(px, py);
  • Observera att GoogleMobileAds_AddBanner och GoogleMobileAds_Init använder samma ID nummer. Om du villanvända fler banners så gör följande:
    GoogleMobileAds_Init("ca-app-pub-2978192583326741/6837289118","ca-app-pub-2978192583326741/6837289119",...);
    • Lägg till alla du vill ha med ett komma mellan.

"the application is incorrectly configured" säger Andoid.


  • Om du får följande meddelande när du kör ditt färdiga spel på Andoid och vill koppla dig till Google Play:
    • "the application is incorrectly configured. check that the package name and signing certificate match the client id created in developer console. also, if the application is not yet published, check that the account you are trying to sing in with is listed as a tester account. see logs for more information."
  • Så måste du ange din plattas gmail adress till testare i google developer console:


Buggar i Game Maker


  • Jag har stött på några buggar när jag försöker starta mitt första android spel:
    • Om du ska använda Game Maker och testköra spelet så måste du göra följande. Annars kraschar den på plattan direkt:
      •  Avaktivera "Google Services" i "Global game settings" -> "Android" -> "Social".
    • För att undvika att Game Maker hänger sig närdu testkör till Android så gör följande:
      • På plattan: avinstallera "yoyorunner". Varje dag.
      • På PC: starta om Game Maker Studio. Efter varje testkörning.
      • Om det hänger sig i alla fall så:
        • På PC: Innan du testkör på plattan testkör alltid en gång på windows. Sen provar du att testköra på plattan. Gör detta varje gång du testkör.
    • Om din app hänger sig så fort du testkör den på plattan så skapa ett nytt Game Maker projekt och importera alla bilder, objekt ... Och prova köra den. (OBS importera parent objekten först!!! och rummen sist.)

onsdag 16 juli 2014

Game Maker Studio kör Android första gången.


  • Man måste ladda ner och installera:
    • Java JDK
    • Android SDK
      • När du kommer till Android SDK Manager, avsluta den,
        Öppna den igen men se till att du öppnar den som administratör.
        Lägg till:
        • Google Play Service
        • API 7
        • API 8
        • API 13
        • API 15
      • Innan du ska installerar så måste du trycka på varje huvud kategori i den vänstra listan och godkänna alla licenser. Sen kan du trycka på installera. (annars är installera gråmarkerad!)
    • Android NDK
  • I Game Maker:
    • Select File>Preferences>Web Server
    • Web Server Port: This is set to 51268 to 51280 by default. There is no need to change this unless these ports are already in use
    • IP Allowed List: Enter your local IP Address here as seen in this example: 192.168.1.1/24
  • På din android:
    • Alternativ 1:
      • http://www.youtube.com/watch?v=vUSRmtexmUo
        • Drivrutinen finns också i googles SDK:
          C:\Program Files (x86)\Android\android-sdk\extras\google\usb_driver
    • Alternativ 2:
      • Innan du ansluter din android måste du ha drivrutiner. Ja windows säger att han har dem men han bara säger så för att han tror han är något.
        Ladda ner något som heter "naked adb driver": http://forum.xda-developers.com/showthread.php?t=1766220
      • Jag zipade upp den.
      • Starta din android och gå in på Inställningar > Om surfplattan > och tryck på "Version" texten sju gånger. Plattan gratulerar dig att du nu är en utvecklare.
      • Gå tillbaka ett steg och tryck "Utvecklaralternativ" och se till att rutan för "USB-felsökning" är ikryssad.
      • Anslut android till din dator med usb kabeln. Windows installerar android, klar att användas säger den men tro det inte.
      • Gå in på kontrollpanelen > Enhetshanteraren och titta under oidentifierade saker. Du ser din android där. Högerklicka på den och välj uppdatera drivrutin. Säg att du vill välja själv och leta dig fram till den upp zipade drivrutinen och tryck ok. Grattis din android fungerar nu. (Om din android inte finns med under oidentifierade utan under "Android Device" behöver du inte uppdatera drivrutinen, du hade den redan av någon anledning.)
  • Om du får problem kolla länken: http://help.yoyogames.com/entries/23363366-Preparing-GameMaker-Studio-for-Android

En bugg i Game Maker när man använder WITH obj {}


  • När jag försökte med följande kod så fungerade det inte (temp_list är en ds_list data struktur):
     str=file_text_read_string(file);
     ds_list_read(temp_list,str);
     for (i=0; i<ds_list_size(temp_list); i+=6)
     {   
       with instance_create(real(temp_list[| i]),real(temp_list[| i+1]),obj_Ball)
      {
        speed=real(temp_list[| i+2]);
        direction=real(temp_list[| i+3]);
        image_xscale=real(temp_list[| i+4]);
        image_yscale=real(temp_list[| i+4]);
        image_blend=real(temp_list[| i+5]);
      }
    }
  • När jag försökte med följande kod så fungerade det bra:
    str=file_text_read_string(file);
     ds_list_read(temp_list,str);
     for (i=0; i<ds_list_size(temp_list); i+=6)
    {
       val[0]=real(temp_list[| i+2]);
       val[1]=real(temp_list[| i+3]);
       val[2]=real(temp_list[| i+4]);
       val[3]=real(temp_list[| i+5]);      
       with instance_create(real(temp_list[| i]),real(temp_list[| i+1]),obj_Ball)
      {
        speed=val[0];
        direction=val[1];
        image_xscale=val[2];
        image_yscale=val[2];
        image_blend=val[3];
      }
  • Slutsats:
    Det verkar som om Game Maker inte klarar av att "skicka med" data strukturer (ds_list ex) till dem andra objekten när man använder "with". Men den går bra med vanliga variabler och arrays.
    • Finns en work around: i with {} så använd other.temp_list[| i+2]. other blir den aktuella instansen man är i när man använder with.

tisdag 8 juli 2014

Kod snippets.


Tänk annorlunda.


Spine i game maker studio.


  • after exporting from Spine in notepad or any other text editor and remove the "size: <some numbers here>" line. It's the second line in the file.
  • Öppna atlas filen och ändra om game maker ger dig ett felmeddelande när du öppnar din spine animation. 
  • Det verkar som om spine 1.7 fungerar men inte 1.8 och framåt.
  • Om man vill ändra animationer i spine så måste man ha game maker studio pro.

måndag 7 juli 2014

Det här går ju bra.


  • Har kört igenom dem tre första tutorial som finns med i game maker studio. Allt fungerar. Inga konstiga buggar. Inga ouppdaterade tutorials. Visst går spelen långsammare men dem fungerar. Ska fortsätta igenom alla tutorials innan jag börjar försöka mig på egna projekt.

En funktion som jag vill spara. (eget talsystem loop)


  • Tänk att du behöver ett värde mellan 1 och 15. Men du har ett x värde som hela tiden ökar med 1. Hur ska du få talserien 1 - 15 med vilket x värde som helst. x börjar med 0.
  • (x mod max)+min
    • (0 mod 15)+1 = 1
      (1 mod 15)+1 = 2
      (2 mod 15)+1 = 3
      (3 mod 15)+1 = 4
      (4 mod 15)+1 = 5
      (5 mod 15)+1 = 6
      (6 mod 15)+1 = 7
      (7 mod 15)+1 = 8
      (8 mod 15)+1 = 9
      (9 mod 15)+1 = 10
      (10 mod 15)+1 = 11
      (11 mod 15)+1 = 12
      (12 mod 15)+1 = 13
      (13 mod 15)+1 = 14
      (14 mod 15)+1 = 15
      • Nu börjar din talserie om igen men x bara ökar.
        (15 mod 15)+1 = 1
        (16 mod 15)+1 = 2
        (17 mod 15)+1 = 3

lördag 5 juli 2014

Måste kolla lite alternativ.


  • Nu börjar jag bli trött på gamla tutorials som inte fungerar och buggar i cocos2dx-3
  • Ska undersöka GameMaker några dagar. Kanske är bättre.
    • Ok. Nr 1#. Använd INTE gamemaker studio i windows 8 eller 8.1. Buggar och åter buggar.
  • Provar just nu i Windows 7.
    • Fungerar bra. Men jag skulle vilja köra det på windows 8. Provade en annan dator med windows 8 och det fungerade bra. Det verkar som om game maker är lite känslig för vilket grafikkort man har.

torsdag 3 juli 2014

Spara användardata.


  • int best = UserDefault::getInstance()->getIntegerForKey("Best_Score");
    UserDefault::getInstance()->setIntegerForKey("Best_Score",best);
    char buffer[10];
    sprintf(buffer, "%04i", best);
    bestScore->setString("Best: " + std::string(buffer));
    UserDefault::getInstance()->flush();

Accelerator.

.h

  • void OnAcceleration(cocos2d::Acceleration *acc,cocos2d::Event *event);
.cpp
  • Device::setAccelerometerEnabled(true);
    auto listener2 = EventListenerAcceleration::create(CC_CALLBACK_2(HelloWorld::onAcceleration,this));
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener2,this);

    void HelloWorld::onAcceleration(cocos2d::Acceleration *acc,cocos2d::Event *event)
    {
    CCLOG("%f",acc->z);
    }

Sprite animation.


  • Gör din sprite och action men när du ska köra den skriv:
    mySprite->runAction(EaseElasticInOut::create(action,0.5));
    • Det finns många fler att välja på.

onsdag 2 juli 2014

Lägg till en ny Scen.


  • Kopiera HelloWorld.h och .cpp och namnge den nya scenen.
  • I F:\Cocos2dx\EgnaProgram\Cocos\MyCppGame\proj.android\jni\Android.mk lägg till
    • ../../Classes/NewScene.cpp

      vid:

      LOCAL_SRC_FILES := hellocpp/main.cpp \
      ../../Classes/AppDelegate.cpp \
      ../../Classes/HelloWorldScene.cpp \
      ../../Classes/NewScene.cpp
      • Glöm inte \ efter ../../Classes/HelloWorldScene.cpp den måste du lägga till.
  • Detta är bara till för att fixa Android. Dem andra systemen fixar detta själv.
  • För att byta till den nya scenen måste man i en knapp säga:
    auto scene=NewScene::createScene();
    Director::getInstance()->pushScene(scene);
    • #include "NewScene.h" måste includeras längst upp i .cpp filen.
  • För att få bort den nya scenen och gå tillbaka görs detta i den nya scenen i en knapp:
    • Director::getInstance()->popScene();
  • För att byta scenen till en annan och ersätta den aktuella gör detta:
    • auto scene=HelloWorld::createScene();
      Director::getInstance()->replaceScene(scene);
  • För att göra en snygg övergång gör följande:
    • Director::getInstance()->replaceScene(TransitionFlipX::create(2,scene));

Meny align.

instället för:
menu->setPosition(Point(origin.x,origin.y));
menu_item_1->setPosition(Point(visibleSize.width/2,(visibleSize.height/5)*4));
menu_item_2->setPosition(Point(visibleSize.width/2,(visibleSize.height/5)*3));
menu_item_3->setPosition(Point(visibleSize.width/2,(visibleSize.height/5)*2));
menu_item_4->setPosition(Point(visibleSize.width/2,(visibleSize.height/5)*1));

sätt:
menu->alignItemsVertically();

Bild meny.

auto menu_item_4 = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::ImageButton,this));

Text Meny.

.h:

    void Play(Ref *pSender);
    void Highscore(Ref *pSender);
    void Settings(Ref *pSender);

.cpp

    // Menu
    auto menu_item_1 = MenuItemFont::create("Play",CC_CALLBACK_1(HelloWorld::Play,this));
    auto menu_item_2 = MenuItemFont::create("Highscore",CC_CALLBACK_1(HelloWorld::Highscore,this));
    auto menu_item_3 = MenuItemFont::create("Settings",CC_CALLBACK_1(HelloWorld::Settings,this));

    menu_item_1->setPosition(Point(visibleSize.width/2,(visibleSize.height/4)*3));
    menu_item_2->setPosition(Point(visibleSize.width/2,(visibleSize.height/4)*2));
    menu_item_3->setPosition(Point(visibleSize.width/2,(visibleSize.height/4)*1));

    auto *menu = Menu::create(menu_item_1,menu_item_2,menu_item_3,NULL);
    menu->setPosition(Point(origin.x,origin.y));
    this->addChild(menu);

void HelloWorld::Play(Ref *pSender)
{
CCLOG("Play");
}

void HelloWorld::Highscore(Ref *pSender)
{
CCLOG("Highscore");
}

void HelloWorld::Settings(Ref *pSender)
{
CCLOG("Settings");
}

Multi tryck på skärmen.


  • I .h filen:
    void onTouchesBegan(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event);
    void onTouchesMoved(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event);
    void onTouchesEnded(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event);

  • I cpp filen:
    auto listener = EventListenerTouchAllAtOnce::create();
    listener->onTouchesBegan=CC_CALLBACK_2(HelloWorld::onTouchesBegan,this);
    listener->onTouchesMoved=CC_CALLBACK_2(HelloWorld::onTouchesMoved,this);
    listener->onTouchesEnded=CC_CALLBACK_2(HelloWorld::onTouchesEnded,this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);

    void HelloWorld::onTouchesBegan(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event)
    {
    CCLOG("MultiTouchesBegan x = %f, y = %f",touch->getLocation().x,touch->getLocation().y);
    }

    void HelloWorld::onTouchesMoved(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event)
    {
    CCLOG("MultiTouchesMoved");
    }

    void HelloWorld::onTouchesEnded(const std::vector<cocos2d::Touch *> &touches,cocos2d::Event * event)
    {
    CCLOG("MultiTouchesEnded");
    }

Enkel tryck på skärmen. (Koordinater skickas till Eclipse)


  • bool onTouchBegan(cocos2d::Touch *touch,cocos2d::Event * event);
    void onTouchMoved(cocos2d::Touch *touch,cocos2d::Event * event);
    void onTouchEnded(cocos2d::Touch *touch,cocos2d::Event * event);
    • läggs i .h filen
  • Det här koden under skapar en "lyssnare". Han lyssnar efter tryckningar eller rörelser. I cpp filen skrivs alltså:
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan=CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
    listener->onTouchMoved=CC_CALLBACK_2(HelloWorld::onTouchMoved,this);
    listener->onTouchEnded=CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  • Skapa en funktion med koden:
    bool HelloWorld::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *event)
    {
    // Raden under sänder tillbaka koordinaterna till Eclipse
    CCLOG("onTouchBegan x = %f, y = %f",touch->getLocation().x,touch->getLocation().y);
    return true;
    }

    void HelloWorld::onTouchMoved(cocos2d::Touch *touch,cocos2d::Event *event)
    {
    CCLOG("onTouchMoved x = %f, y = %f",touch->getLocation().x,touch->getLocation().y);
    }

    void HelloWorld::onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *event)
    {
    CCLOG("onTouchEnded x = %f, y = %f",touch->getLocation().x,touch->getLocation().y);
    }
  • Starta appen och tryck någon stanns på skärmen så dyker koordinaterna upp i "LogCat" fönstret.
    • om inte lägg till:
      • #define COCOS2D_DEBUG 1
    • i .h filen längst upp.

Ljud.


  • // Ljudmotor
  • #include "SimpleAudioEngine.h"
  • // Ladda ljudet till minnet
  • CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("audio/Collide.wav");
    • Notera / inte \
  • CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("audio/Collide.wav");
    • Obs: plattan kanske inte hinner ladda in ljudet innan den försöker spela upp den. Måste hitta en lösning på det.
  • CocosDenshion::SimpleAudioEngine::getInstance()->setEffectsVolume(0.5);
    • 50% volym.
  • Alla funktioner måste deklareras i .h filen.
  • this->schedule(schedule_selector(HelloWorld::PlayEffect),5.0f);
    • Skapar ett schema som körs var 5e sekund.
  • BackgroundMusic:
  • CocosDenshion::SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(0.5);
  • CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("audio/MainMusic.mp3");
  • CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("audio/MainMusic.mp3",true);
  • CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
  • CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

tisdag 1 juli 2014

Basic Cocos2dx-3


  • mySprite = Sprite::create("CloseNormal.png");
    • Skapar en sprite/bild
  • Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();
    mySprite->setPosition(Point((visibleSize.width / 2) + origin.x, (visibleSize.height / 2) + origin.y));
    • Flyttar bilden till mitten av skärmen
  • this->addChild(mySprite);
    • Lägger till bilden till scenen
  • auto action = MoveBy::create(3,Point((visibleSize.width/2),10));
    • Skapar en action som sedan kan användas för att flytta bilden från den nuvarande positionen till x antal pixlar åt något håll på 3 sekunder.
  • auto action = MoveTo::create(3,Point(100,300));
    • Action som flyttar bilden från nuvarande position till en exakt koordinat.
  • auto action = JumpBy::create(3,Point(100,0),50,3);
    • Action som hoppar bilden från aktuell position med x pixlar åt något håll. 50 är höjden och 3 är antal hopp.
  • auto action = JumpTo::create(3,Point(origin.x,origin.y),50,6);
    • Action som hoppar bilden från aktuell position till en ny position. I detta fall origin på skärmen.
  • Origin är längst ner till vänster på skärmen. Inte som en pc där den är längst upp till vänster.
  • ccBezierConfig bezier;
    bezier.controlPoint_1=Point(0,visibleSize.height/2);
    bezier.controlPoint_2=Point(300,-visibleSize.height/2);
    bezier.endPosition=Point(200,100); // flyttar sig x och y från nuvarande position
    auto action=BezierBy::create(3,bezier);
    • Action som flyttar bilden från en position med x pixlar åt något annat håll. Dock med en kurva som gör att den slingrar sig fram istället för går rakt bara.
  • ccBezierConfig bezier;
    bezier.controlPoint_1=Point(0,visibleSize.height/2);
    bezier.controlPoint_2=Point(300,-visibleSize.height/2);
    bezier.endPosition=Point(0,100); //flyttar sig sig till position x,y
    auto action=BezierTo::create(3,bezier);
    • Action som flyttar bilden från en position med x pixlar åt något annat håll. Dock med en kurva som gör att den slingrar sig fram istället för går rakt bara.
  • auto action=Place::create(Point(100,200));
    • Action som placerar bilden direkt på en position. Ingen animering.
  • auto action=ScaleBy::create(3,3,0.3);
    • Action som ändrar skalan på bilden under en viss tid. Under tre sekunder ökar x med 3ggr (300% större) och y minskar till 0.3 (60% försvinner alltså.)
  • ScaleTo
  • RotateBy
  • RotateTo
  • TintBy
    • Ändrar färgen på bilden. ex -255 tar bort all färg under en viss tid som du anger.
  • TintTo
  • FadeTo
    • Ändrar alpha värdet på bilden.
  • mySprite->setOpacity(0);
    • Ändrar bildens alpha direkt.
  • FadeIn
    • Från nuvarande alpha till full alpha (255).
  • FadeOut
    • Från nuvarnade alpha till 0 alpha.
  • Repeat
    • Repetera en Action x ggr.
  • RepeatForever
    • Repetera för alltid. Bra när man gör bakgrunds animationer som ska hålla på för evigt.
  • Secuence
    • En sekvens 'r en Action av flera Actions efter varandra.
      Avsluta alltid med en NULL så att sekvensen vet vart den sista action är.
  • SkewBy
    • Vrider bildens UV så man kan se baksidan på den.