近畿大学電子計算機研究会wiki
http://w.atwiki.jp/kindaidensan/
近畿大学電子計算機研究会wiki
ja
2018-06-10T13:38:31+09:00
1528605511
-
2018年度オープン授業
https://w.atwiki.jp/kindaidensan/pages/54.html
----
|CENTER:授業日|担当|CENTER:内容|
|第1回(5/11)|馬渕|CENTER:導入|
|第2回(5/18)|平石|CENTER:変数と演算|
|第3回(6/1)|平石|CENTER:入出力|
|第4回(6/8)|阿部|CENTER:条件分岐|
|第5回(6/15)|元田|CENTER:繰り返し|
|第6回(6/22)|阿部|CENTER:配列|
|第7回(6/29)|元田|CENTER:メソッド|
|第8回(7/6)|馬渕|CENTER:軽くゲーム制作|
// 授業資料は以下のように添付
// |第2回(5/11)|仲谷|入出力| [[PDF>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/22/37/openjugyou_2017_2.pdf]] |
授業資料はGoogleDriveで管理しています。
必要な場合は管理人まで連絡してください。
2018-06-10T13:38:31+09:00
1528605511
-
メニュー
https://w.atwiki.jp/kindaidensan/pages/2.html
**メニュー
-[[トップページ]]
-[[編集するにあたって]]
----
-[[java班トップ]]
--[[DJGL-更新履歴]]
--&bold(){基礎}
---[[DJGL-はじめに]]
---[[DJGL-環境構築]]
---[[DJGL-環境構築 (Eclipseが英語の方向け)]]
---[[DJGL-ゲームの基礎]]
---[[DJGL-図形の描画]]
---[[DJGL-文字の描画]]
---[[DJGL-画像の描画]]
---[[DJGL-キー入力]]
---[[DJGL-マウス入力]]
--&bold(){簡単なゲームを作ろう}
---[[はじめに>FIRST-はじめに]]
---[[ゲーム紹介>FIRST-ゲームの紹介と見本]]
---[[自機の作成>FIRST-自機の作成]]
--&bold(){STGを作ろう}
---[[はじめに>DJGL-STG-はじめに]]
---[[画面の表示>DJGL-STG-画面の表示]]
---[[自機の作成>DJGL-STG-自機の作成]]
---[[Playerに弾を撃たせる>Playerに弾を撃たせる]]
---工事中
--&bold(){応用}
---[[DJGL-フォントについて]]
---[[DJGL-使える技術]]
---[[DJGL-スクロール]]
--&bold(){TIPS}
---工事中
--[[java班テンプレート]]
--[[CSGGamesManager]]
----
-[[Unity班トップ]]
--Unity(工事中)
---[[Unityのオブジェクト構造]]
--共通
---[[UIの設定]]
---Sceneの遷移
--3D
---Oculus Riftを用いたアプリの製作
---Kinect を使ったアプリの作り方
----
-[[オープン授業]]
--[[2017年度オープン授業]]
--[[2018年度オープン授業]]
----
-人工知能
--Python(準備中)
----
その他
-部内情報
----
-[[サンドボックス]]
----
カウンター
合計:&counter()
今日:&counter(today)
昨日:&counter(yesterday)
トップページの合計:&counter(total, page=トップページ)
----
**リンク
-[[@wiki>>http://atwiki.jp]]
-[[@wikiご利用ガイド>>http://atwiki.jp/guide/]]
// リンクを張るには "[" 2つで文字列を括ります。
// ">" の左側に文字、右側にURLを記述するとリンクになります
//**更新履歴
//#recent(20)
&link_editmenu(text=ここを編集)
2018-05-11T16:03:16+09:00
1526022196
-
オープン授業
https://w.atwiki.jp/kindaidensan/pages/48.html
----
毎年1回生向けに行っているオープン授業のページです。
オープン授業で使用する資料などはこちらからダウンロードしてください。
年度別オープン授業一覧
-[[2017年度オープン授業]]
-[[2018年度オープン授業]]
----
#comment_num2
2018-05-11T16:00:56+09:00
1526022056
-
Playerに弾を撃たせる
https://w.atwiki.jp/kindaidensan/pages/53.html
*弾クラスの作成
----
以下のクラスを作成します
#highlight(linenumber,java){{
package obj.ballet;
import java.awt.Color;
import densan.s.game.drawing.Drawer;
import densan.s.game.manager.GameManager;
import densan.s.game.object.GameObjectBase;
public class PlayerBallet extends GameObjectBase implements Ballet{
/**
* 弾の大きさ
*/
private static final int SIZE = 5;
public PlayerBallet(double x, double y, double rad, double speed) {
super(x, y, SIZE,SIZE);
// TODO Auto-generated constructor stub
setVector(speed, rad);
}
@Override
public void update() {
// TODO Auto-generated method stub
move();
vanish();
}
@Override
public void draw(Drawer d){
// TODO Auto-generated method stub
d.setColor(Color.BLACK);
d.fillCircle(getCenterX(), getCenterY(), 5);
}
@Override
/**
* 画面外消失判定
*/
private void vanish() {
// TODO Auto-generated method stub
//画面外に出たか
if(!(0<getMaxY()&&getY()<GameManager.getInstance().getFrameHeight()&&0<getMaxX()&&getX()<GameManager.getInstance().getFrameWidth()))
remove();
}
}
}}
*解説
----
ここでは弾の描画と大きさ、その動きを記述している。
vanishメソッドは画面の外に出たとき、GameObjectBaseのremoveメソッドを呼び出しremoveフラグをtrueにすることでObjectManagerでupdateが呼び出された際に自身をリストから削除します。
javaはインスタンスへの参照がすべてなくなった際自動的にjavaのガベージコレクションによってそのインスタンスが消去されるので明示的に消去するコードは必要ありません。
では、次にPlayerに弾を打つ動作を追加しましょう。
*弾クラスの作成
----
#highlight(linenumber,java){{
package obj;
import java.awt.Color;
import java.awt.event.KeyEvent;
import densan.s.game.drawing.Drawer;
import densan.s.game.input.KeyInput;
import densan.s.game.object.GameObjectBase;
import obj.ballet.PlayerBallet;
public class Player extends GameObjectBase {
/**
* 自機の移動速度
*/
public static final int SPEED = 2;
/**
* 射撃感覚
*/
private static final int SHOOT_WAIT_FRAME = 10;
private ObjectManager om;
public Player() {
super(100, 100, 50, 50);
om = ObjectManager.getInstace();
}
@Override
public void update() {
movement();
shoot();
}
/**
* 移動処理
*/
private void movement() {
if (KeyInput.isPressing(KeyEvent.VK_UP)) {
addY(-SPEED);
}
if (KeyInput.isPressing(KeyEvent.VK_DOWN)) {
addY(SPEED);
}
if (KeyInput.isPressing(KeyEvent.VK_RIGHT)) {
addX(SPEED);
}
if (KeyInput.isPressing(KeyEvent.VK_LEFT)) {
addX(-SPEED);
}
}
/**
* 時間
*/
private int time = 0;
/**
* 弾の射撃
*/
private void shoot() {
if(KeyInput.isPressing(KeyEvent.VK_Z)&&time==0) {//前の射撃からSHOOT_WAIT_FRAME分経過したか
om.registerObject(new PlayerBallet(getCenterX(), getCenterY(), 0, 8));//現在位置と角度、速度を指定
time = SHOOT_WAIT_FRAME;
}
if(time>0)
time--;
}
@Override
public void draw(Drawer d) {
d.setColor(Color.BLUE);
d.fillRect(getX(), getY(), getWidth(), getHeight());
}
}
}}
----
変更点はshootメソッドを追加しupdateメソッド内で実行しているのといくつかのフィールドを追加したところである。
これでZキーを押せば弾が発射される状態が完成するはず
2017-10-24T03:18:19+09:00
1508782699
-
列挙型
https://w.atwiki.jp/kindaidensan/pages/52.html
* 列挙型について
使用例として以下は3dテトリスのコードの一部である。
#highlight(linenumber,java){{
/**
* 列挙型<br>
* テトリスの種類を増やした場合(objectパッケージ)要変更
* @author tachibana
*
*/
public enum TetrisList {
Empty(0),
Rect(1),
T(2),
Z(3),
L(4);
//要追加
private final int tetrisNum;
// private final Tetris tetris;
TetrisList(final int tetrisNum) {
// TODO 自動生成されたコンストラクター・スタブ
this.tetrisNum= tetrisNum;
}
/**
* 対応するテトリスの番号を返す
* @return
*/
public int getTetrisNumber(){
return tetrisNum;
}
/**
*
* @param id
* @return
*/
public static TetrisList getType(final int id){
TetrisList[] types = TetrisList.values();
for (TetrisList type : types) {
if (type.getTetrisNumber() == id) {
return type;
}
}
return null;
}
}
}}
Cとちがってjavaの場合enumはintの定数ではなくオブジェクトの列挙であるので振る舞いを変えることができる。
getTypeでidに一致するオブジェクトを返す実装となっている。
enumとswitch文をうまく使えばコードを比較的キレイにかける…筈。
この場合要素数はTetrisList.values().lengthで取得できる。
ゲームの各種アイテムの実装で必要なら列挙型のItemListつくってうまくid割り振ってアップグレードとかダウングレードとかできるといいかもしれない。
----
以下例
----
2017-10-10T03:34:06+09:00
1507574046
-
オブジェクトをまとめて管理する
https://w.atwiki.jp/kindaidensan/pages/51.html
*オブジェクトの管理
----
自機を作成しましたが、このままだとオブジェクトが増えるたびにGameSceneのクラスに記述することになり、非常に複雑な処理になってしまいます。そこでオブジェクトをまとめて管理するクラスを作ります。以下にそのクラスのコードを示します。
#highlight(linenumber,java){{
package obj;
import java.util.ArrayList;
import java.util.Iterator;
import densan.s.game.calc.Calc;
import densan.s.game.drawing.Drawer;
import densan.s.game.manager.GameManager;
import densan.s.game.object.GameObjectBase;
/**
* ゲームのオブジェクトを管理するクラス
* @author isato
*
* @param <T>
*/
public class ObjectManager<T extends GameObjectBase> {
/**
*
*/
private ArrayList<T> objects = new ArrayList<T>();
private ArrayList<T> additionalObjects = new ArrayList<T>();
private static ObjectManager instance = new ObjectManager<>();
private ObjectManager(){
}
public static ObjectManager getInstace(){
return instance;
}
/**
* オブジェクトのすべてにアップデート
*/
public void update() {
Iterator<T> itr = objects.iterator();
T o;
while(itr.hasNext()) {
o = itr.next();
o.update();
}
collisionPlayer();
removeProccess();
joinList();
}
/**
* オブジェクトにremoveフラグが立っている場合消去
*/
private void removeProccess() {
Iterator<T> itr = objects.iterator();
T o;
while(itr.hasNext()) {
o = itr.next();
if(o.isRemove())
itr.remove();
}
}
/**
* リストにゲームオブジェクトを登録する待機状態にする
* その語updateメソッドのjoinlistでobjectsに追加される
* @param object
*/
public void registerObject(T object) {
additionalObjects.add(object);
}
/**
* インスタンスの参照
*/
public ObjectManager getInstance() {
return instance;
}
/**
* 追加されるのを待機しているオブジェクトをobjectsに追加しaddtionalObjectsリストを空にする
*/
private void joinList() {
objects.addAll(additionalObjects);
additionalObjects.clear();
}
/**
*
* @param d
*/
public void draw(Drawer d) {
Iterator<T> itr = objects.iterator();
T o;
while(itr.hasNext()) {
o = itr.next();
o.draw(d);
}
}
public ArrayList<T> getlist(){
return objects;
}
}
}}
その後GameSceneを次のように変更してください
#highlight(linenumber,java){{
import java.awt.Color;
import densan.s.game.drawing.Drawer;
import densan.s.game.manager.Updatable;
public class GameScene implements Updatable{
private ObjectManager om = ObjectManager.getInstance();
public GameScene() {
om.registerObject(new Player);
}
@Override
public void update() {
om.update;
}
@Override
public void draw(Drawer d) {
//ちゃんとクラスを使えてるか確認するための文字描画
d.setColor(Color.BLUE);
d.setFontSize(40);
d.drawString("TEST", 100, 100);
om.draw(d)
}
}
}}
これでGameSceneのコンストラクタ11行目でObjectManagerにGameObjectBaseを継承しているPlayerオブジェクトを渡し、updateとdrawメソッドではObjectManagerのupdateとdrawメソッドを呼び出しており、この部分ですべてのObjectManagerが持つGameObjectBaseを継承したオブジェクトにupdateあるいはdrawを実行するという処理になっています。なので、registerObjectメソッドの引数にGameObjectBaseを与えればそれだけで後はそのクラスが持つupdateメソッドとdrawメソッドが実行されるといった仕組みがこれで出来ています。
2017-10-10T02:56:46+09:00
1507571806
-
2017年度オープン授業
https://w.atwiki.jp/kindaidensan/pages/41.html
----
|授業日|担当|内容|PDF|
|第一回目|-|-||
|第二回目(5/19)|仲谷|入出力| [[PDF>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/22/37/openjugyou_2017_2.pdf]] |
|第三回目(5/26)|馬渕|条件分岐|[[PDF>https://github.com/tan1510/openjugyou_2017/raw/master/openLesson3_2017_haihu.pdf]]|
|~|~|~ |[[解答>https://github.com/tan1510/openjugyou_2017/raw/master/openLesson3_2017_ans.pdf]]|
|第四回目(6/2)|仲谷|for文|[[PDF>https://github.com/KindaiDensanken/openjugyo2017/raw/master/openjugyo4kai.pdf]]|
|第五回目(6/9)|馬渕|配列|[[ZIP>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/41/40/openLesson5_2017.zip]]|
|第六回目(6/16)|仲谷|関数|[[ZIP>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/41/43/OpenLesson6_2017.zip]]|
|第七回目(6/23)|仲谷|ゲーム①|[[ZIP>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/41/45/OpenLesson7_2017.zip]]|
|~|~|~ |[[改訂版>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/41/46/openLesson7_2017_Re.zip]]|
|第八回目(6/30)|仲谷|ゲーム②|[[ZIP>https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/41/49/OpenLesson8_2017.zip]]|
2017-06-30T18:36:59+09:00
1498815419
-
テキストファイルを一行ずつ読み込む
https://w.atwiki.jp/kindaidensan/pages/50.html
とりあえずtextのデータを一行づつ読み込んで表示するプログラム
**準備
-作ったプロジェクトにresourcesフォルダを作る
-なんか適当な文字列が入ったtext.txtを作り作ったフォルダに入れる
**注意点
- ファイルのパスの指定はプロジェクトのファイルからの相対パスで指定してある。
-あと大量のデータを読み込むとかならこのやり方は非推奨
#image(https://img.atwikiimg.com/www65.atwiki.jp/kindaidensan/attach/50/48/iotest.PNG)
#highlight(linenumber,java){
package fileIO;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class FileReaderTest {
public static void main(String args[]){
ArrayList<String> list= new ArrayList<>();//arraylistの初期化
try {
FileReader fl = new FileReader("resources/text.txt");//
//BurrferdeReaderを使って一文字ずつ読み込む
BufferedReader br = new BufferedReader(fl);
String str = br.readLine();
while(null!=str){
list.add(str);
str=br.readLine();
}
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//結果出力
list.stream().forEach(s->System.out.println(s));
}
}
}
**解説
- 途中のtry{} catch{}は例外処理という奴でとりあえずここではtryの中だけが実行されてもしもし16行目でファイルのパスが間違えていれば26行目の catch(FileNotFoundExcept){-----}の部分が実行されます。
-33行目はラムダとstreamapi組み合わせた記述だけど要するに下のfor文と同じ
#highlight(linenumber,java){
for(String str :list)
System.out.println(str);
}
2017-06-30T03:07:18+09:00
1498759638
-
FIRST-自機の作成
https://w.atwiki.jp/kindaidensan/pages/49.html
*自機の作成
----
自分で操作する自機を作っていきます。
機能は上下左右の移動、描画(見た目)は青色の正方形(25x25)とし、
最初に言った通り[[DJGL-環境構築>>DJGL-環境構築]]でウインドウを開くところまでは出来ているものとします。
----
新規クラス「Player」を作成し、以下のソースコードを打ち込んで下さい。
初期配置や移動スピードとなる数値は自由に変更してもらって構いません。
**ソースコード
----
#highlight(linenumber,java){{
import java.awt.Color;
import java.awt.event.KeyEvent;
import densan.s.game.drawing.Drawer;
import densan.s.game.input.KeyInput;
import densan.s.game.object.GameObjectBase;
//自機
public class Player extends GameObjectBase{
public Player() {
super(25, 450, 25, 25); //左から「初期x座標」「初期y座標」「横の大きさ」「縦の大きさ」
}
//それぞれの方向キーを押している間、addX()の()内の数値だけx座標を移動させる。
//x座標が正の時は右方向、y座標が正の時は下方向に加算している。
@Override
public void update() {
if(KeyInput.isPressing(KeyEvent.VK_RIGHT)){
addX(5);
}
if(KeyInput.isPressing(KeyEvent.VK_LEFT)){
addX(-5);
}
if(KeyInput.isPressing(KeyEvent.VK_UP)){
addY(-5);
}
if(KeyInput.isPressing(KeyEvent.VK_DOWN)){
addY(5);
}
}
@Override
public void draw(Drawer d) {
//青色、BLUEの部分を変えると別の色に
d.setColor(Color.BLUE);
//長方形の描画、それぞれ上のsuperの値を使っている
d.fillRect(getX(), getY(), getWidth(), getHeight());
}
}
}}
----
続いて、実際にゲームをするシーン(ステージ1とか)を表すクラス「Stage」を作成します。
----
#highlight(linenumber,java){{
import densan.s.game.drawing.Drawer;
import densan.s.game.manager.Updatable;
//ゲームシーン
public class Stage implements Updatable{
//Playerクラスの変数playerを作成(これだけだと変数playerは空の状態)
Player player;
public Stage(){
//変数playerにPlayerのインスタンスを参照、今は言葉を理解出来なくて良い
player = new Player();
}
@Override
public void update() {
//Playerクラスのupdate()メソッドを使えるようにする
player.update();
}
@Override
public void draw(Drawer d) {
//Playerクラスのdraw()メソッドを使えるようにする(playerを描画する)
player.draw(d);
}
}
}}
----
最後に、環境構築の時に作ったメインクラス(環境構築では「TestGame」)のメインメソッドに変更を加える
----
#highlight(linenumber,java){{
public static void main(String[] args) {
GameManager gm = GameManager.getInstance();
gm.createFrame(800, 600, "テストゲーム");
//ここが変わっている
gm.setUpdatable(new Stage());
}
}}
----
これでメインクラスを実行させると、真っ白の画面に青い正方形だけが出てくる状態となり、
方向キーでそれぞれの移動に動かすことが出来ると思います。
**まとめ
----
次回はゴールの作成、およびゴールの衝突判定を行います。
自機のスピードや色を変えたり、文字を表示させたりして遊んでてください。
----
#comment_num2
2017-06-27T01:40:10+09:00
1498495210
-
FIRST-ゲームの紹介と見本
https://w.atwiki.jp/kindaidensan/pages/47.html
*ゲームの紹介と見本
----
今回はここで作るゲームを簡単に紹介します、最初はこれを目指してみてください。
**FIRST GAME
----
#ref(first01.png)
青色の正方形が自機、上下左右に動きます。
赤色が敵、ぶつかるとゲームオーバーとなります。
オレンジ色が鍵アイテム、これを持っていないとゴールに触れても無効となります。
黄緑色がゴール、アイテムを持っている状態で触れるとゲームクリアとなります。
その他にタイトル画面、ゲームオーバー画面、ゲームクリア画面も作成します。
まずはこれを作成し、その後はちょっとだけ改造例を示したりする予定です。
**まとめ
----
次回は自機の作成、上下左右の移動の実装をする予定です。
ちなみに序盤はタイトル画面を作らずにゲーム画面から始めることにします。
----
#comment_num2
2017-06-23T13:06:18+09:00
1498190778