kotliners.pl – My new place in the web.

kotliners.pl

You are welcome to my new website!

Reklamy

13. Daj się poznać 2017 – Jak wygrać game jam?

Byłem, kodziłem, zwyciężyłem…

…ale z sobą. Stworzyłem fajny jak na dwa dni kodzenia projekt, który podsumowywał moją wiedzę.

A jak wygrać gameJam?
Fajnie by było mieć zespół a nie pracować samemu. Można wykorzystać ten czas na pair programming, żeby nie wchodzić sobie w drogę a jak najmocniej wykorzystać dostępny czas. Do tego grafik! prawdopodobnie must-have do wygrania game jamu. I tworzymy grę zgodnie ze wskazówkami soczystości, czyli:

  • efekty cząsteczek
  • wstrząsy kamerą
  • fajne dźwięki
  • uber cool grafiki !

Posiadając te cztery elementy, jesteśmy w czołówce i wtedy dopiero liczy się pomysł jaki mieliśmy na grę.

Code on!

11. Get noticed 2017 – Game jam on SilesiaGameDevs.

that was very busy two weeks. I participate in interview and tests to the company from Szczecin and I was on Silesia Game Devs where I’m create a game.

I think it look’s better than my first idea to the contest Get Noticed. It’s easiest to porting to Android, there is a better game-play. So I switch my idea to the Zombie Shooter and I’ll start develop this project.

New: <a href=”https://github.com/ejdrian313/Game-Jam-SilesiaGameDevs&#8221; target=”_blank”>Github</a>

Short post, let’s code!

10. Get noticed 2017 – Particle system.

This is how particle system looks like on the beginning of the implemented them.

The class of the Particle looks that:

public class Particle extends Sprite {

public float x;

public float y;

public float width;

public float height;

public float finalY = 0;

public float finalX = 0;

public float alpha = 1;

private int random;

private Texture tex;

private Sprite sprite;

protected static Random generator = new Random();    public Particle(String color, float posx, float posy) {

tex = new Texture(color + „.png”);

sprite = new Sprite(tex);

width = tex.getWidth()/15;

height = tex.getHeight()/15;

sprite.setSize(width, height);

random = (generator.nextInt(4)+1);

finalX = generator.nextInt(800) – 400;

finalY = generator.nextInt(800) – 400;

x = posx;

y = posy;

}

public void update(float delta) {

x +=  (delta / random) * finalX;

y +=  (delta / random) * finalY;

}

public void draw(SpriteBatch batch, float alpha) {

sprite.setPosition(x, y);

sprite.setAlpha(alpha);

sprite.draw(batch);

}

public void dispose() {

tex.dispose();

}

}

And the particle emitter looks like this:

public class ParticleSystem {

private Particle p;

private LinkedList particles;

private LinkedList particlesToDestroy;    public ParticleSystem(int howMany, String color, float posX, float posY) {

particles = new LinkedList();

particlesToDestroy = new LinkedList();

for(int i=0; i            p = new Particle(color, posX, posY);

particles.add(p);

}

}

public void particleShoot(float posX, float posY) {

for(Particle p : particles) {

p.finalX = posX + Particle.generator.nextInt(10) – 5;

p.finalY = posY + Particle.generator.nextInt(120) – 60;

}

}

public void update(float deltaTime) {

for(Particle p : particles) {

p.update(deltaTime);

}

destroy();

}

public void draw(SpriteBatch sp, float delta) {

for(Particle p : particles) {

p.alpha -= delta;

if(p.alpha                 p.alpha = 0;

particlesToDestroy.add(p);

}

p.draw(sp, p.alpha);

}

}

public void destroy() {

for(int i = 0; i             particles.remove(particlesToDestroy.get(i));

}

particlesToDestroy.clear();

}

public void dispose() {

for(Particle p : particles) {

p.dispose();

}

}

}

Btw. paste code looks better by this convener but the „is greater/less” or „equal to” is not formatting properly.
The code is after update and the area of the particle effect is more randomly.
When random is equal to four:
kiqzkl

And the random is eight right now:zjyrhh
I should said: the random has value from one to eight.

Code on!

9. Get noticed 2017 – not AI of enemies -> random moves!

Welcome back. I implemented a basic AI of enemy entities. Like in the title it’s not an AI it’s just a random jump, and some patrol area. Code look like this:

public void update(float delta) {
toNextRandomJump += delta;
if(toNextRandomJump > 2) {
getRandom = generator.nextInt(10);
toNextRandomJump = 0;
}
if( getRandom == 2 || getRandom == 7) {
jump();
}
checkMaxSpeed();
if(canMoving) {
x += velocityX * delta;
}
addGravity();
y += velocityY * delta;
}

public void patrol(float patrolArea) {
if(x < startPosition + patrolArea && goingRight) {
velocityX += SPEED;
} else {
velocityX -= SPEED;
goingRight = false;
}
if (x <= startPosition) {
velocityX += SPEED;
goingRight = true;
}
}

Short post because I was on job fairs.
 

8. Get noticed 2017 – Design pattern – Observer

It is simple and very useful design pattern. Two the most important things in that is observer and observable/subject. Both are interface’s. Observer should notify when something important happen. So interface looks like this:

1
2
3
4
5
public interface Observer {

void notifyYourself();

}

And the subject looks like this:

1
2
3
4
5
6
7
public interface Subject {

void register(Observer o);
void unregister(Observer o);
void notifyObservers();

}

I try this pattern on rifle weapon in my game:

 1
2
3
4
5
6
7
8
9
10
11
12
13
 private void bulletCollision() {
for(Rifle.Bullet b : bullets) {
for(EnemyWorm e : enemyWorms) {
if(Collision.isBulletHitWorm(b, e)) {
bulletsToRemove.add(b);
e.getDamage(b.getPower(), e);
if(e.Health <= 0) {
enemyWormsToRemove.add(e);
morePower += morePower;
e.notifyObservers(morePower);
}
}
}

So when enemy is add to the list of death it notify rifle about it and rifle get more power to destroy next enemies. 🙂

I dont know why the spaces in paste code doesnt look good. For more code I invite to my github.

7. Get noticed 2017 – How I fix collision bug

Like you see I decided to write this post in English. So let’s begin ours small journey through my code.ncra7a

Collision bug

Game doesn’t change from visual site. But a lot of changes appear in code.
I repair collision check between bullet and enemyWorm. I thought that is something wrong with width or height of enemyWorm, but the bug was in the collision loop. I missed that collision was checked in loop of collision with map objects. So now code looks like that:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private void checkCollision() {
player.restartFlags();
bulletCollision();
playerWithMapObjects();
}

private void playerWithMapObjects() {
for(Platform p : platormArray) {
if(Collision.isWormOnPlatform(player, p)) {
player.standing = true;
player.onSprite = true;
player.velocityY = 0.f;
player.y = p.y + p.height;
return;
}

Collision.isWormStillonPlatform(player, p);

if(Collision.isWormHitBottom(player, p)) {
player.velocityY = -20;
} else if(Collision.isWormHitRight(player, p)) {
player.velocityX = 0;
player.canMovingRight = false;
} else if(Collision.isWormHitLeft(player, p)) {
player.velocityX = 0;
player.canMovingLeft = false;
}
}
}

private void bulletCollision() {
for(Rifle.Bullet b : bullets) {
for(EnemyWorm e : enemyWorms) {
if(Collision.isBulletHitWorm(b, e)) {
bulletsToRemove.add(b);
e.getDamage(b.getPower(), e);
if(e.Health <= 0) {
enemyWormsToRemove.add(e);
morePower += morePower;
rifle.notifyYourself(morePower);
}
}
}
if(b.x > 2500) {
bulletsToRemove.add(b);
}
}
}

How I remove object from an array?

It was confusing. How to remove object when collision was track down. But the game is still playing. Iterating on the loop when the size is changing is not a good idea. So i decided implement answer from stackoverflow. When collision was detected i simply add object to next ArrayList and after checking collision in this frame i remove objects: bullets and enemies by reference of object from the temporary loop.
More code less talk:

 1
2
3
4
5
6
7
8
9
10
11
private void removeObjects() {
for (int i = 0; i < bulletsToRemove.size(); i++) {
bullets.remove(bulletsToRemove.get(i));
}
bulletsToRemove.clear();
for (int i = 0; i < enemyWormsToRemove.size(); i++) {
enemyWorms.remove(enemyWormsToRemove.get(i));
++counter;
}
enemyWormsToRemove.clear();
}

 

 

 

 

 

6. Daj się poznać 2017 – Lissajous curve – python. Programista a matematyka.

Weekend!


Dzisiaj o krótkim pythonowym skrypcie, który cieszy oko.
Czym są krzywe Lissajousa? A no są to krzywe, które opisał francuski matematyk. Krzywe powstają na skutek drgań harmonicznych… no dobra. Do sedna. Czy matematyka jest tak bardzo potrzebna w programowaniu?

Na przekór odpowiedzi wrzuciłem filmik poruszający dość matematyczne zagadnienie. Na pytanie jak bardzo programista powinien umieć matematykę odpowiadam:

  • na tyle aby się jej uczyć

Generalnie to jest dobra odpowiedź na każde pytanie co powinien umieć programista. Najlepszą metodą rozwoju jako programista jest Just in time learning czyli uczymy się wtedy kiedy czegoś potrzebujemy. Jedyny wyjątek jaki przychodzi mi do głowy to język angielski. Ale to odsyłam do filmku JavaDevMatt, skąd również usłyszałem o just in time learning.

Moje doświadczenia z matematyką w programowaniu:

  • poruszanie w grach
  • kolizje
  • grafika 2d/3d
    • wektory
    • macierze
  • itd.

Brzmi groźnie? Może, ale groźne nie jest. Jest dostępna masa fajnych źródeł o matematyce w grach. O matematyce w ogóle.Np. 

Korzystałem polecam.

Zmieniam pracę i mam nadzieje, że dzięki temu będę miał więcej czasu na prowadzenie bloga i rozwój projektu OpenSoldier.
Nie przedłużając i korzystając z niedzieli,
do kodu!

5. Daj się poznać 2017 – Pocisk czyli klasa zagnieżdżona. Trello, Snaggy.

Stworzyłem klasę weapon, która ma zagnieżdżoną klasę bullet. Dzięki temu mogę odwoływać się bezpośrednio do kul danej broni tzn. Rifle.Bullet.update().

Ostatnio nie pokazywałem jak wygląda moja tablica w trello:
kwnszr

Jak widać trochę pracy już za mną. Teraz za cel stawiam sobie stworzenie różnych ekranów między którymi będę się przełączał. Klasę odpowiedzialną za animacje, oraz klasę kolizji i muzyki. Po tym dopiero zajmę się naprawieniem Buga jaki występuje przy sprawdzaniu kolizji pocisku z przeciwnikiem.

//@TODO: sprawdzić debuggerem jakie wartości przyjmują szerokość i wysokość przeciwnika.

Dzięki blogowi Ekharta trafiłem też na narzędzie snag.gy do szybkiego dzielenia się screenshotami. Gorąco polecam tego bloga. Trochę przy okazji zazdroszczę koledze ukończenia silnika/prototypu/pierwszej wersji gry.

Link do githuba
Link do Trello

 

Postanowiłem też, że posty będą krótsze i będą przypominały dziennik programisty. A nie tutoriale czy czysto techniczne kwestie. Wszak pisanie bloga ciągle sprawia mi problemy a koncertuje się na kodzie. Może w zamian przeskoczę na posty po angielsku?

 

 

 

4. Daj się poznać 2017 – Androidowy bug, dalsze postępy na yt.

To już piąty post na bloga!


public void update(float delta, Application.ApplicationType appType) {
if(appType == Application.ApplicationType.Android) {
updateOnAndroid(Gdx.input.getAccelerometerX());
} else { handleInput(); }

addGravity();
y += velocityY * delta;

checkMaxSpeed();
x += velocityX * delta;
}

Dzięki temu rozróżnieniu rozwiązałem buga, przy odpalaniu gry na urządzeniu mobilnym.
Wewnątrz metody handleInput(); gdy aplikacja nie wykryła naciśnięcia klawiszy do poruszania, prędkość została ustalana na 0. Gdyż poruszanie zrealizowałem na podstawie prędkości, żeby ruch był płynniejszy.

Dzisiaj niedziela, chciałem zrobić większe podsumowanie, ale jutro się poprawie. A moim celem są 2 posty każdego tygodnia. Za to zapraszam na githuba -> jest już tam co oglądać. Prototypuje klasy i funkcje jakich będę używał w docelowej aplikacji. O tym już jutro!

Link do githuba

Do jutra!